Python 中的一行中的“for”循环

z-o*_* ng 10 python for-loop

当我尝试在如下一行中使用for语句时,

def get_cubes(x):
ls=[]
ls.append(pow(item*3, 3)) for item in range(int((x-x%3)/3)+1)
return ls
Run Code Online (Sandbox Code Playgroud)

总是有一个错误:

File "<ipython-input-47-8c391c3d568a>", line 3
ls.append(pow(item*3, 3))  for item in range(int((x-x%3)/3)+1)
                             ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

但是当我用常规的for循环方法编写它时,它运行良好。为什么?

小智 21

 解决方案

如果您严格想要单线,那么这就是解决方案:

get_cubes = lambda x: [pow(i, 3) for i in range(0, x+1, 3)]
Run Code Online (Sandbox Code Playgroud)

但由于清晰性和可读性在 Python 中始终是优先考虑的事项,因此最好像 @daniel 那样将其编写为函数:

def get_cubes(x):
    return [pow(i, 3) for i in range(0, x+1, 3)]
Run Code Online (Sandbox Code Playgroud)

 输出

使用 for 循环来测试该函数,您会得到以下结果:

for i in range(20):
    print(i, ':', get_cubes(i))

0 : [0]
1 : [0]
2 : [0]
3 : [0, 27]
4 : [0, 27]
5 : [0, 27]
6 : [0, 27, 216]
7 : [0, 27, 216]
8 : [0, 27, 216]
9 : [0, 27, 216, 729]
10 : [0, 27, 216, 729]
11 : [0, 27, 216, 729]
12 : [0, 27, 216, 729, 1728]
13 : [0, 27, 216, 729, 1728]
14 : [0, 27, 216, 729, 1728]
15 : [0, 27, 216, 729, 1728, 3375]
16 : [0, 27, 216, 729, 1728, 3375]
17 : [0, 27, 216, 729, 1728, 3375]
18 : [0, 27, 216, 729, 1728, 3375, 5832]
19 : [0, 27, 216, 729, 1728, 3375, 5832]
Run Code Online (Sandbox Code Playgroud)

解释

对于那些问为什么@daniel 的代码有效的人:

原始代码执行以下操作:

  1. 给定x,从0到迭代次数3 divides xplus 1
  2. 对于每个 x,乘以 3 并将其提高到 3 的幂
  3. 返回包含第 2 步结果的列表

步骤 1最初写为

range(int((x - x%3) / 3) + 1)
Run Code Online (Sandbox Code Playgroud)

它在被3除时减去一个数字的提醒,然后3在添加之前将该结果除以1。但同样的结果可以通过刚开划分的整数部分来实现x3,然后加入1,这将是这个样子:

int(x / 3) + 1
Run Code Online (Sandbox Code Playgroud)

第 2 步将每次迭代乘以 ,3然后再将其提高到 的幂,3但也可以通过使用范围(就像@daniel 所做的那样)使用以下方法实现“乘法”

range(0, x+1, 3)
Run Code Online (Sandbox Code Playgroud)

0x+1的步骤进行迭代3并产生相同的结果。即x10

range(0, 10 + 1, 3)  |    i*3 for i in range(int(x / 3) + 1)
============================================================
0                    |    0*3 = 0
3                    |    1*3 = 3
6                    |    2*3 = 6
9                    |    3*3 = 9
Run Code Online (Sandbox Code Playgroud)

对于第 3 步,我们只需要应用pow(x, 3)(或x ** 3) 并且我们可以使用列表推导将所有内容放入一行中,然后我们可以将其放入lambda函数或函数的return语句中。

[pow(i, 3) for i in range(0, x+1, 3)]
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 6

for 循环的正确语法是

def get_cubes(x):
    ls = []
    for item in range(int((x-x%3)/3)+1):
        ls.append(pow(item*3, 3)) 
    return ls
Run Code Online (Sandbox Code Playgroud)

也许,您正在寻找列表理解,这是一种生成列表的方法,当循环体仅附加到列表时:

def get_cubes(x):
    ls = [(item*3) ** 3 for item in range(int((x-x%3)/3)+1)]
    return ls
Run Code Online (Sandbox Code Playgroud)

或简而言之:

def get_cubes(x):
    return [i ** 3 for i in range(0, x+1, 3)]
Run Code Online (Sandbox Code Playgroud)

  • 如果您解释您的代码如何工作以替代 OP 的错误代码,那就太好了。显然,他/她似乎是一个初学者。 (2认同)

She*_*ore 5

我的答案遵循(修改)您的方法(代码),而不是使用列表理解,而是以纠正的方式。将其与您的代码进行比较,您就会找出错误所在。我添加了评论#来解释更改

def get_cubes(x):
    ls=[] # create an empty list outside the for loop once
    for item in range(int((x-x%3)/3)+1): # for loop for iterating through elements
        ls.append(pow(item*3, 3)) # append one item at a time
    return ls

print (get_cubes(10))                                   
> [0, 27, 216, 729]
Run Code Online (Sandbox Code Playgroud)