Python For循环(新手)

Python For循环(新手),python,loops,for-loop,increment,Python,Loops,For Loop,Increment,我最近开始学习Python,for循环的概念对我来说仍然有点混乱。我知道它通常遵循y中x的格式,其中y只是一些列表 for each循环for(int n:someArray) 对于someArray中的n变为 (i=0;ia: 如果f==无: f=λx:x+1 而xb时: 产量x x=f(x) 对于序列中的i(8,0,λx:x/2): 打印i 注意:这与range/xrange的行为不同,其中测试的方向是由迭代器符号选择的,而不是开始值和结束值之间的差异。对于范围(0,9,-2)中的i,如果

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

for each循环
for(int n:someArray)
对于someArray中的n变为

(i=0;i<9;i-=2)
的for循环
可以用范围(0,9,-2)
i的
表示

假设我想要
I*=2
,甚至
I*=I
,而不是常数增量。这是可能的,还是我必须使用while循环

您将希望为此使用


列表理解语法如下所示:

[EXPRESSION for VARIABLE in ITERABLE if CONDITION]

在发动机罩下,其作用类似于:

举例如下:

def square(x): return x**2

print map(square, xrange(10))

如果您不喜欢列表理解,可以将其用作替代方法。
您也可以使用for循环,但这将远离Python的惯用性…

正如您所说的,
for
循环在列表的元素中迭代。列表可以包含您喜欢的任何内容,因此您可以事先构建一个包含每个步骤的列表

for
循环也可以迭代A,A是一小段代码,而不是实际的列表。在Python中,
range()
实际上是一个生成器(但在Python 2.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键。

为止,您可以使用a高效地执行此操作,而无需太多代码:

for i in (2**x for x in range(10)): #In Python 2.x, use `xrange()`.
    ...
生成器表达式的工作原理类似于定义手动生成器(如中),语法类似于列表理解。它们的评估是惰性的——这意味着它们不会在操作开始时生成列表,这可以在大型可重用程序上带来更好的性能


因此,该生成器的工作原理是等待,直到要求它输入一个值,然后要求
range(10)
输入一个值,将该值加倍,然后将其传递回
for
循环。它会重复执行此操作,直到
range()
生成器不再生成任何值。

请记住,Python的“列表”部分可以是任何iterable序列

示例:

字符串:

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 
等等等等等等

因此,它确实比“仅仅列出一些”要深刻得多

正如其他人所说,对于示例问题,只需将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...

作为替代方案,将迭代/增量操作推广到lambda函数,这样您就可以执行以下操作:

for i in seq(1, 9, lambda x: x*2):
    print i
...
1
2
4
8
其中
seq
定义如下:

#!/bin/python
from timeit import timeit

def seq(a, b, f):
    x = a;
    while x < b:
        yield x
        x = f(x)

def testSeq():
    l = tuple(seq(1, 100000000, lambda x: x*2))
    #print l

def testGen():
    l = tuple((2**x for x in range(27)))
    #print l

testSeq();
testGen();

print "seq", timeit('testSeq()', 'from __main__ import testSeq', number = 1000000)
print "gen", timeit('testGen()', 'from __main__ import testGen', number = 1000000)
[编辑]

要支持反向迭代并使用默认参数

def seq(a, b, f = None):
    x = a;
    if b > a:
        if f == None:
            f = lambda x: x+1
        while x < b:
            yield x
            x = f(x)
    else:
        if f == None:
            f = lambda x: x-1
        while x > b:
            yield x
            x = f(x)

for i in seq(8, 0, lambda x: x/2):
    print i
def-seq(a、b、f=None):
x=a;
如果b>a:
如果f==无:
f=λx:x+1
而xb时:
产量x
x=f(x)
对于序列中的i(8,0,λx:x/2):
打印i

注意:这与
range
/
xrange
的行为不同,其中
测试的方向是由迭代器符号选择的,而不是开始值和结束值之间的差异。

对于范围(0,9,-2)中的i,如果第一个数字小于第二个,则您的
不会向后迭代。
更准确地说,范围()无法为正值提供具有负步长的数组。这是一个无限循环。@user1320925是否希望这些值作为i:1、2、4、8、16、32……循环的后一个
没有正确的结束条件,如果
i
是一个
int
,这是C。无论如何,这不是你所说的范围。我想说一个独立的生成器在这方面做得太过分了-生成器表达式可能也会做得很好。例如:
对于i in(x*2对于x in范围(10)):
是的,您可以更简洁地编写代码。然而,我认为展示一个通用生成器的功能是很有启发性的。虽然知道你可以用它做更多的事情是很好的,但是建议人们把事情过于复杂是不好的。解释生成器表达式语法可能也会很好,以避免让提问者将非常简单的生成器作为完整的函数。我鼓励您添加一个演示生成器表达式语法的答案。完成,您的答案为+1-这是一个很好的答案,一个人可以对生成器施展魔法。创建一个列表然后在其上循环不是最优的,这不是列表comp的语法(它是一个表达式,不是一个函数,它是一个iterable,不是一个列表,可能在末尾有一个if语句)。@Lattyware:它是最优的,它是生成器表达式所做的。注意你的答案如何链接到列表理解…;)不是真的。我的答案链接到我制作的一个视频,该视频解释了列表理解以及生成器表达式和听写和设置理解。生成器表达式是惰性的,因此与列表理解非常不同。如果我们循环到500万,您的解决方案将创建一个从
0*2
499999*2
的列表,然后循环它。生成器表达式将根据需要计算它们。这是完全正确的,但在本例中,我们讨论的是表达式周围的一组不同的括号。这并不是说这种优化会花费我们时间、可读性或其他任何东西,那么为什么不这样做呢?当我们谈论一些不需要花费时间或精力的事情时,这句话就不适用了,而良好的实践往往意味着,当它真的重要时,你不需要担心它。我没有否决过任何其他答案——事实上,我比其他两个答案投了更高的票。事实上,使用生成器表达式在Python中进行调试是很好的—Python中的调试几乎总是使用
print()
语句完成的
 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...
for i in seq(1, 9, lambda x: x*2):
    print i
...
1
2
4
8
#!/bin/python
from timeit import timeit

def seq(a, b, f):
    x = a;
    while x < b:
        yield x
        x = f(x)

def testSeq():
    l = tuple(seq(1, 100000000, lambda x: x*2))
    #print l

def testGen():
    l = tuple((2**x for x in range(27)))
    #print l

testSeq();
testGen();

print "seq", timeit('testSeq()', 'from __main__ import testSeq', number = 1000000)
print "gen", timeit('testGen()', 'from __main__ import testGen', number = 1000000)
seq 7.98655080795
gen 6.19856786728
def seq(a, b, f = None):
    x = a;
    if b > a:
        if f == None:
            f = lambda x: x+1
        while x < b:
            yield x
            x = f(x)
    else:
        if f == None:
            f = lambda x: x-1
        while x > b:
            yield x
            x = f(x)

for i in seq(8, 0, lambda x: x/2):
    print i