百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

你知道Python的for循环是如何工作的吗?

off999 2024-09-16 00:50 22 浏览 0 评论

大家都用过for循环,但是大家知道Python for循环背后的工作原理吗?本文就带大家详细探究Python for循环是如何工作的以及iterable和iterator的概念。

首先我们来看一下,如果不用for循环,是否还有其它的遍历方式。一种方法就是用类似C语言中通过索引进行访问:

colors = ["red", "green", "blue", "purple"]

i = 0

while i < len(colors):

print(colors[i])

i += 1

对于list这么做没问题,但是如果遍历对象是set就行不通了:

>>> colors = {"red", "green", "blue", "purple"}

>>> i = 0

>>> while i < len(colors):

... print(colors[i])

... i += 1

...

Traceback (most recent call last):

File "<stdin>", line 2, in <module>

TypeError: 'set' object does not support indexing

问题就出在,这种方法只能用在序列对象上,也就是能通过索引进行访问的数据结构,比如list,string,tuple等。但是对于dictionary,set这些非序列结构就无能为力了。

Iterable

在Python的世界中,一个iterable就是可以用过for循环进行遍历的对象。Iterable不一定具有索引,也不一定有长度,甚至不一定是有限长度的。

下面就是一个无限长的iterable的例子,它包含了所有5的倍数:

from itertools import count

multiples_of_five = count(step=5)

当我们用for对其进行遍历时,可以这样做:

for n in multiples_of_five:

if n > 100:

break

print(n)

如果我们把break去掉的话,这个循环就会永远进行下去。

Iterable和Iterator

我们知道iterable是什么了,但是它在Python中是如何工作的呢?

Python中有一个内建函数iter,任何iterable传进去都会获得其对应的iterator。

>>> iter(['some', 'list'])

<list_iterator object at 0x7f227ad51128>

>>> iter({'some', 'set'})

<set_iterator object at 0x7f227ad32b40>

>>> iter('some string')

<str_iterator object at 0x7f227ad51240>

然而iterator究竟是什么呢?简单地说,iterator只完成一个功能,那就是在遍历中返回下一个元素。

我们可以从任意iterable获取一个iterator:

>>> iterator = iter('hi')

然后利用next内建函数去获取下一个元素:

>>> next(iterator)

'h'

>>> next(iterator)

'i'

>>> next(iterator)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

StopIteration

如果遍历结束了,即没有下一个元素了,next函数会抛出一个StopIteration异常。

Iterator同时也是iterable

将iterable传入iter函数可以得到一个iterator。同时,如果将一个iterator传入iter函数,得到的结果就是这个iterator本身。这意味着,iterator本身也是iterable。

>>> iterator = iter('hi')

>>> iterator2 = iter(iterator)

>>> iterator is iterator2

True

Iterator协议

在Python中,所有的iterator都遵循一套相同的协议:

1 一个iterable传入iter函数后可以得到对应的iterator。

2 iterator可以作为参数传入next函数,返回下一个元素或者抛出StopIteration异常。

3 当作iterator为参数传入iter函数时返回自身。

上述规则反过来也是成立的:

1 任何对象如果可以作为参数传入iter并且没有异常,则该对象是iterable。

2 任何对象如果可以作为参数传入next并且没有异常(StopIteration除外),则该对象是iterator。

3 任何传入iter并得到其自身的对象是iterator。

对iterator进行遍历

下面这段代码对一个iterable进行遍历,并打印其中的每一个元素:

def print_each(iterable):

iterator = iter(iterable)

while True:

try:

item = next(iterator)

except StopIteration:

break # Iterator exhausted: stop the loop

else:

print(item)

任意iterable都可以作为该函数的参数:

>>> print_each({1, 2, 3})

1

2

3

事实上,上面这段代码和下面使用for的代码是等价的:

def print_each(iterable):

for item in iterable:

print(item)

在for循环中Python会自动实现我们手工实现的功能:调用iter去获取下一个元素,直到遇到StopIteration异常。

这就是隐藏在Python for循环背后的秘密,小伙伴们,你们get到了吗?

相关推荐

Python中的两个内置函数id()和type()

id()>>>id(3)2531362761072>>>id(3.222222)2531397393680>>>id(3.0)25313...

python 函数中,如何将另一个函数作为参数传递

python函数中,如何将另一个函数作为参数传递,类似C#委托defadd(a,b):"""这是一个简单的加法函数,接受两个参数并返回它们的和。""...

Python性能暴涨10倍的终极指南:7个核心技巧+代码压缩秘籍

提升Python程序运行性能,使代码运行更流畅更快,以及压缩代码,减小代码大小,下面的方法仅供大家参考,有什么更好的方法在评论区说说。1.使用NumPy/SciPy替代纯Python循环...

Python 匿名函数(Lambda 函数)详解

匿名函数(AnonymousFunction),在Python中称为lambda函数,是一种不需要使用def关键字定义的小型函数。它主要用于简化代码,特别适合需要函数对象的地方。1.基...

Python学习笔记 | 匿名函数lambda、映射函数map和过滤函数filter

什么是匿名函数?定义:没有函数名的自定义函数场景:函数体非常简单,使用次数很少,没有必要声明函数,通常搭配高阶函数使用。高阶函数是能够把函数当成参数进行传递的函数,如:映射函数map和过滤函数fil...

python练习:自定义函数调用:商品购物实例

1、商品录入dict_myshanpin_iof={101:{"商品名称":"毛毛熊","单价":25},102:{"商品名称":...

Python中如何使用Lambda函数(lambda在python中的用法)

Python和其他编程语言一样,都在其语法中添加了lambda函数,Pythonlambda是匿名函数,比常规Python自定义函数有更简洁的语法。虽然Lambda语法在开始时可能会觉得有点混乱,...

8-Python内置函数(python内置函数代码)

Python提供了丰富的内置函数,这些函数可以直接使用而无需导入任何模块。以下是一些常用的内置函数及其示例:1-print()1-1-说明输出指定的信息到控制台。1-2-例子2-len()2-1-说...

用Python进行函数式编程(python函数程序)

什么是函数式编程?函数式程序设计是一种编程范例,它把计算当作数学函数的评价,避免状态和可变数据。换句话说,函数编程(FunctionalProgramming,FP)促进没有副作用和不变变量的代码。它...

python 函数进阶(python如何进阶)

1.有名函数和匿名函数#该函数有名称,名称是adddefadd(x,y):returnx+y#改函数没有名称属于匿名函数,也叫lambda表达式lambda_add...

python自学者的分享:自定义函数、参数作用域、匿名函数、装饰器

#自定义新函数函数名newhsdefnewhs(a,b=1):#b的默认值为1,在没有传入b值时,采用默认值,,默认值参数不能放前边returna-bprint(newh...

Python 函数式编程的 8 大核心技巧,不允许你还不会

函数式编程是一种强调使用纯函数、避免共享状态和可变数据的编程范式。Python虽然不是纯函数式语言,但提供了丰富的函数式编程特性。以下是Python函数式编程的8个核心技巧:1.纯函数(...

零基础到发布:手把手教你创建并分发 Python 自定义库

作为程序员,我们经常依赖各种外部库来解决不同的问题。这些库由技术娴熟的开发者创建,为我们提供了节省时间和精力的解决方案。但你是否曾想过:“我也能创建属于自己的自定义库吗?”答案是肯定的!本文将为你详细...

打工人学Python:(七)自定义函数,打造自己的武器库

从一个简单的函数开始#!/usr/bin/envpython#-*-encoding:utf-8-*-'''@Purpose:Wordcount@...

肖sir_python自定义函数format、zip函数

python自定义函数一、常见的自定义函数已经学过的函数:list、print、set、str、type、tuple、dict、range、input等今天学的函数:format二、实战讲解(一)f...

取消回复欢迎 发表评论: