在编程中,循环是一种常见的概念,用于处理大量数据或重复执行代码块。Python提供了两种类型的循环语句:for循环和while循环。本文将逐一探讨这些循环语句,并介绍生成器函数的概念和应用。
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之间的差异包括:
重要提示:如果想让代码同时兼容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关键字后只接受退出条件,并在其块中执行语句,直到条件变为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中的生成器函数。
可以创建自己的生成器函数,其中使用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关键字在数据被摄取时逐个处理数据流。它在处理大型文件数据(如日志文件)时也非常有用,这为处理这些数据提供了空间效率高的函数,以便分部分处理数据。迭代器也可以处理相同的任务,但生成器更有效。