我最近开始学习Python,for循环的概念对我来说仍然有点困惑。据我所知,它通常遵循for x in y格式,其中y只是一些列表。
for-each循环for (int n: someArray)变为for n in someArray,
并且可以用for i in range(0, 9, -2)来表示for循环for (i = 0; i < 9; i-=2)
假设我想要的不是常量增量,而是i*=2,甚至i*=i。这是可能的吗,或者我必须使用while循环来代替?
发布于 2012-05-04 07:08:13
正如您所说,for循环遍历列表的元素。该列表可以包含您喜欢的任何内容,因此您可以预先构建一个包含每个步骤的列表。
for循环还可以遍历"generator",这是一小段代码,而不是实际的列表。在Python语言中,range()实际上是一个生成器(在Python2.x中,range()返回一个列表,而xrange()是生成器)。
例如:
def doubler(x):
while True:
yield x
x *= 2
for i in doubler(1):
print i上面的for循环将打印出来
1
2
4
8依此类推,直到您按下Ctrl+C键。
发布于 2012-05-04 07:15:19
您可以使用generator expression来高效地完成此操作,并且只需很少的额外代码:
for i in (2**x for x in range(10)): #In Python 2.x, use `xrange()`.
...生成器表达式的工作方式类似于定义手动生成器(如在Greg Hewgill's answer中),语法类似于列表理解。它们的评估是惰性的-这意味着它们不会在操作开始时生成列表,这可以在大型可迭代程序上带来更好的性能。
因此,这个生成器的工作方式是等待,直到系统要求它提供一个值,然后向range(10)请求一个值,将该值加倍,然后将其传递回for循环。它重复执行此操作,直到range()生成器不再生成任何值。
发布于 2012-05-04 07:19:48
请记住,Python的“list”部分可以是任何可迭代的序列。
示例:
一个字符串:
for c in 'abcdefg':
# deal with the string on a character by character basis...一个文件:
with open('somefile','r') as f:
for line in f:
# deal with the file line by line一本字典:
d={1:'one',2:'two',3:'three'}
for key, value in d.items():
# deal with the key:value pairs from a dict列表的一部分:
l=range(100)
for e in l[10:20:2]:
# ever other element between 10 and 20 in l 等等等等
所以它真的比‘只是一些列表’深刻得多
正如其他人所说的,只需将迭代器设置为您想要的值即可:
for e in (i*i for i in range(10)):
# the squares of the sequence 0-9...
l=[1,5,10,15]
for i in (i*2 for i in l):
# the list l as a sequence * 2...https://stackoverflow.com/questions/10440493
复制相似问题