【51CTO.com快译】在Python中创建循环时,通常有两个选择:while循环和for循环。while很简单:它只是重复,直到给定的条件不再成立。for循环比较复杂,因而功能更强大:for循环语句集合中遍历,而不必知道集合的详细信息。
Python for 循环组件
Python for循环有两个组件:
• 包含或产生要循环的元素的容器、序列或生成器。一般来说,任何支持 Python迭代器协议的对象都可以在for循环中使用。
• 保存容器/序列/生成器中每个元素的变量。
在下面的例子中,我们循环遍历一个数字列表,并使用变量digit依次保存每个数字:
for digit in [3,1,4,1,5,9]:
print (digit)
- 1.
- 2.
这将打印:
3 1 4 1 5 9
- 1.
如果要遍历生成容器或序列的对象,可以使用 Python 的多重赋值语法将其解包。例如:
for letter, number in [["a",1],["b",2]]:
print (letter, number)
- 1.
- 2.
输出:
a 1
b 2
- 1.
- 2.
常见的 Python for 循环
以下是 Python for 循环中使用的一些常见对象:
列表
上面的例子展示了如何使用for循环迭代列表。请注意,如果您有一个列表,则for循环提取的每个元素本身就是一个列表。for循环不会自动“展平”任何类型的嵌套结构。
字符串
Python 中的字符串被认为是“序列”——它们可以被迭代,迭代字符串的结果是字符串中的每个字符。
for letter in "Hello world":
print (letter)
- 1.
- 2.
这将产生:
H
e
l
l
o
w
o
r
l
d
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
字典
使用for循环遍历字典会生成字典中的每个键。
d1 = {
"a": 1,
"b": 2
}
for key in d1:
print (key)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
这将产生:
a
b
- 1.
- 2.
如果要遍历字典的值,请使用字典的.values()方法。还可以使用.items()一起遍历键和值:
d1 = {
"a": 1,
"b": 2
}
for key, value in d1.items():
print (key, value)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
这将产生:
a 1
b 2
- 1.
- 2.
生成器
生成器生成一系列的项,每次调用一个项。for循环中使用的生成器的一个常见示例是range。
for n in range(50):
print (n)
- 1.
- 2.
这将打印数字 0 到 49。
请注意,仅仅因为可以在for循环中使用生成器,并不意味着生成器最终会自行停止。例如,这个for循环将永远运行:
def forever():
while True:
yield 1
for n in forever():
print (n)
- 1.
- 2.
- 3.
- 4.
- 5.
在这种情况下,需要采取措施确保循环可以终止。(参见下面的“流量控制”。)
在Python for循环中使用索引和枚举
从 C、C++ 或 Java 等语言来到 Python 的开发人员通常会创建一个索引变量,用于逐步遍历正在迭代的对象。举个例子:
x =[ 3 , 1 , 4 , 1 , 5 , 9 ]
n = 0而n < len ( x ): print ( x [ n ])
n += 1
- 1.
- 2.
- 3.
这本身并没有错,但它忽略了 Python 的工作原理。Python 中的for循环不需要索引;它可以只遍历要迭代的对象,而无需对其进行索引。
但是,有时需要在循环时跟踪正在处理的元素。Python 的enumerate()实用程序对此有所帮助。它需要一个可迭代对象,并在每次迭代时生成索引和该索引处的对象的元组:
x = [3,1,4,1,5,9]
for index, n in enumerate(x):
print (index, n)
- 1.
- 2.
- 3.
0 3
1 1
2 4
3 1
4 5
5 9
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
Python for 循环中的流量控制
for循环并不总是运行到完成,或完全按顺序运行。假如想提前跳出一个for循环,或者跳过循环中的某个项。为此,Python提供了两个关键字:break和continue。
for n in range(20):
if n % 2 == 0: # if n is a multiple of 2
continue # then skip it
# everything after this point is not run
# if `continue` is invoked
print (n)
print ("Done")
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
这将产生1 3 5 7 9 11 13 15 17 19,然后Done。请注意,当循环结束时,程序在print(“Done”)处正常继续。
for n in range ( 20 ): if n == 10 : break # 完全离开循环print ( n ) print ( "Done" )
- 1.
打印数字0到9,然后Done。
请注意,如果循环嵌套在其他循环中,break则只会影响当前循环——它不会从所有循环级别退出。从多个for循环中退出需要不同的机制,如sentinel变量:
done = False
for n in range(20):
for m in range(40):
if n==10 and m==10:
done = True
if done: break
if done: break
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
Python for 循环陷阱
在for循环中迭代对象的元素时,不要做任何会改变成员或序列长度的事情。例如,如果要在一个列表上迭代,则不要在迭代时从列表中添加或删除元素。
如果迭代元素的原因是测试每个元素以查看是否需要添加或删除某些内容,那么有一个更好的解决方案。创建一个新的空容器,仅用要保留的元素填充它,然后用新容器替换旧容器。
下面是一个带有列表的示例。这将创建一个只包含奇数的新列表:
old_list = [1,2,3,4,5,6]
new_list = []
for n in old_list:
if n % 2:
new_list.append(n)
old_list = new_list
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】