Gre*_*ill 11
如你所说,for循环遍历列表的元素.该列表可以包含您喜欢的任何内容,因此您可以预先构建包含每个步骤的列表.
甲for环也可以遍历一个"发电机",这是一小块代码而不是实际的列表.在Python中,range()实际上是一个生成器(虽然在Python 2.x中,在生成器时range()返回了一个列表xrange()).
例如:
def doubler(x):
while True:
yield x
x *= 2
for i in doubler(1):
print i
Run Code Online (Sandbox Code Playgroud)
上面的for循环将打印出来
1
2
4
8
Run Code Online (Sandbox Code Playgroud)
依此类推,直到按Ctrl + C.
您可以使用生成器表达式来有效地执行此操作并且只需要很少的代码:
for i in (2**x for x in range(10)): #In Python 2.x, use `xrange()`.
...
Run Code Online (Sandbox Code Playgroud)
生成器表达式的工作方式与定义手动生成器(如Greg Hewgill的答案)一样,其语法类似于列表推导.它们被懒惰地评估 - 意味着它们在操作开始时不生成列表,这可以在大型迭代上产生更好的性能.
因此,这个生成器通过等待直到它被要求一个值,然后要求range(10)一个值,加倍该值,并将其传递回for循环来工作.它会反复执行此操作,直到range()生成器不再生成值.
小智 5
请记住,Python的'list'部分可以是任何可迭代的序列.
例子:
字符串:
for c in 'abcdefg':
# deal with the string on a character by character basis...
Run Code Online (Sandbox Code Playgroud)
一份文件:
with open('somefile','r') as f:
for line in f:
# deal with the file line by line
Run Code Online (Sandbox Code Playgroud)
一本字典:
d={1:'one',2:'two',3:'three'}
for key, value in d.items():
# deal with the key:value pairs from a dict
Run Code Online (Sandbox Code Playgroud)
列表的一部分:
l=range(100)
for e in l[10:20:2]:
# ever other element between 10 and 20 in l
Run Code Online (Sandbox Code Playgroud)
等等等
所以它真的比'只是一些列表'更深刻
正如其他人所说的那样,只需将iterable设置为您想要的示例问题:
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...
Run Code Online (Sandbox Code Playgroud)
您将需要为此使用列表理解
print [x**2 for x in xrange(10)] # X to the 2nd power.
Run Code Online (Sandbox Code Playgroud)
和
print [x**x for x in xrange(10)] # X to the Xth power.
Run Code Online (Sandbox Code Playgroud)
列表理解语法如下:
[EXPRESSION for VARIABLE in ITERABLE if CONDITION]
Run Code Online (Sandbox Code Playgroud)
在底层,它的作用类似于地图和过滤器功能:
def f(VARIABLE): return EXPRESSION
def c(VARIABLE): return CONDITION
filter(c, map(f, ITERABLE))
Run Code Online (Sandbox Code Playgroud)
给出的例子:
def square(x): return x**2
print map(square, xrange(10))
Run Code Online (Sandbox Code Playgroud)
和
def hypercube(x): return x**x
print map(hypercube, xrange(10))
Run Code Online (Sandbox Code Playgroud)
如果您不喜欢列表理解,可以将其用作替代方法。您也可以使用 for 循环,但这将远离 Python 惯用语......
| 归档时间: |
|
| 查看次数: |
5161 次 |
| 最近记录: |