for循环(新手)

use*_*925 7 python loops for-loop increment

我最近开始学习Python,for循环的概念对我来说仍然有点混乱.我理解它通常遵循格式for x in y,其中y只是一些列表.

for-each循环for (int n: someArray) 成为for n in someArray,

并且for循环for (i = 0; i < 9; i-=2)可以表示为for i in range(0, 9, -2)

假设,而不是一个恒定的增量,我想i*=2,甚至i*=i.这可能,或者我必须使用while循环吗?

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.


Gar*_*tty 8

您可以使用生成器表达式来有效地执行此操作并且只需要很少的代码:

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()生成器不再生成值.

  • @TomWijsman我认为它的可读性不高.如果你真的想要你可以做`doubles =(x*2 for x in range(10))`然后循环'双打'.如果你将它与你的答案进行比较 - 列表理解 - 我们在字面上谈论表达式之外的不同括号.如何降低可读性或可维护性? (2认同)
  • @TomWijsman我的答案是单线 - 并且建议单线总是比多线更好是疯了.有时更多的线条更具可读性.至于调试更难,那根本不是真的.正如我在其他评论中所说的那样 - 有一个原因可以解释为什么所有Python 3的内置版本都是懒惰的,而在2.x版本中它们生成了列表. (2认同)

小智 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)


Tam*_*man 1

您将需要为此使用列表理解

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 惯用语......

  • 这是完全正确的,但在这种情况下,我们讨论的是表达式周围的一组不同的括号。这种优化不会浪费我们的时间、可读性或其他任何东西,所以为什么不这样做呢?当我们谈论一些不需要我们花费时间或精力的事情时,这句话就落伍了,而良好的实践通常意味着当它确实重要时你不需要担心它。 (3认同)