Python循环和生成器函数详解

编程中,循环是一种常见的概念,用于处理大量数据或重复执行代码块。Python提供了两种类型的循环语句:for循环和while循环。本文将逐一探讨这些循环语句,并介绍生成器函数的概念和应用。

For循环

Python中的for循环与C或Java中的for循环有所不同,它更类似于C++中的foreach关键字。通常使用“for变量 in”来迭代整个值列表。

for i in range(5): print(i)

这里使用了range函数,它接受一个整数值作为输入,并返回一个从0开始到该数字(不包括该数字)的数字列表。在这个例子中,传递了值5,但range函数返回的值将从0到4,不包括5。这在编程语言中非常有用,因为经常使用列表、数组和其他顺序数据结构,索引总是从0开始,到长度-1的值。

也可以在for循环中使用xrange而不是range,因为它们返回相同的值集合,但它们的工作方式不同,将在文章后面重新讨论它们之间的差异。

xrange和range之间的差异包括:

  • 返回类型:range返回一个列表,而xrange返回一个xrange对象。
  • 内存:range比xrange使用更多的内存,因为range一次性创建整个列表,而xrange在执行时创建所需的值,也被称为“懒加载”。
  • 操作:可以在range值上使用列表函数,但不能在xrange对象上使用,因为它不返回列表。
  • 速度:由于“懒加载”功能,xrange的速度比range快得多。

重要提示:如果想让代码同时兼容Python2和Python 3,那么应该使用range,因为在Python 3中没有xrange,而Python 3中的range的工作方式与Python 2中的xrange相同。

可以使用for循环来迭代一个范围,甚至逐个字符遍历一个字符串。基本上,可以迭代存储在特定方式中的多个值,并且可以被索引。这个列表包括列表、元组、集合和字典。

for n in L: print(n)

这里L可以是一个值列表,然后n将遍历整个列表,可以逐个提取和访问迭代器的所有值。

如果L = [1,2,3,4,5](列表或元组)

1 2 3 4 5 A n a l y t i c s

如果L = {1:”a”,2:”b”,3:”c”}(字典)

1 2 3

如果想要字典的值和索引,可以修改代码如下:

for n in L: print(n, L[n]) 1 a 2 b 3 c

注意:也可以使用dict.items()函数来迭代字典,以(key,value)元组的形式返回。

While循环

while循环在while关键字后只接受退出条件,并在其块中执行语句,直到条件变为false。它通常用于不知道循环将执行多少次的情况。

i = 0 while i < 5: print(i) i = i + 2 0 2 4

注意:Python中没有Do-While循环,但可以自己创建一个。

循环控制关键字

执行控制可以通过以下三个关键字来控制:Pass、Break和Continue。Break意味着执行将停止并退出for循环,Continue将强制循环继续到下一个迭代,并忽略所有后续的执行行。Pass什么都不做,通常用于空函数或循环。

s = "analytics" for i in s: if i == 'a': print('Pass has been executed') pass print(i) if i == 't': break print(":: Now continue ::") for i in s: if i == 'a': print('Continue has been executed') continue print(i) if i == 't': break Pass has been executed a n Pass has been executed a l y :: Now continue :: Continue has been executed n Continue has been executed l y

这个例子清楚地显示了pass和continue之间的区别,并且总结了循环,现在来探索Python中的生成器函数。

Python中的生成器函数

可以创建自己的生成器函数,其中使用yield而不是return函数。yield函数暂停执行并保存执行变量和状态,可以通过使用“next”关键字来恢复执行。

def TestGenerator(): yield 1 yield 2 yield 3 for val in TestGenerator(): print(val) 1 2 3

生成器返回一个生成器对象,也可以像这样使用它:

def TestGenerator(): yield 1 yield 2 yield 3 x = TestGenerator() print(x.__next__()) # __next__() 在Python 3.x中 print(x.__next__()) print(x.__next__()) 1 2 3

Python还提供了一种简单的方法来使用Python生成器表达式,可以将yield和range写在一行中,如下所示:

s = (x + x for x in range(5)) print(next(s)) print(next(s)) print(next(s)) print(next(s)) print(next(s)) 0 2 4 6 8

也可以使用列表表达式,如下声明一个平方数列表:

s = [x * x for x in range(5)] print(s) [0, 1, 4, 9, 16]

这是一个列表生成器的例子,让看看使用生成器的好处:

应用

假设代码中有恒定的数据流流入,使用生成器可以帮助有效地处理它。无需等待完整的值列表,可以使用next关键字在数据被摄取时逐个处理数据流。它在处理大型文件数据(如日志文件)时也非常有用,这为处理这些数据提供了空间效率高的函数,以便分部分处理数据。迭代器也可以处理相同的任务,但生成器更有效。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485