【问题标题】:'for' loop in one line in Python [duplicate]Python中的一行中的'for'循环[重复]
【发布时间】:2018-09-22 18:31:15
【问题描述】:

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

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

总是有错误:

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

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

【问题讨论】:

标签: python for-loop


【解决方案1】:

 解决方案

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

get_cubes = lambda x: [pow(i, 3) for i in range(0, x+1, 3)]

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

def get_cubes(x):
    return [pow(i, 3) for i in range(0, x+1, 3)]

 输出

使用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]

说明

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

原始代码执行以下操作:

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

Step 1最初写成

range(int((x - x%3) / 3) + 1)

在除以3 时减去一个数字的提醒,然后在添加1 之前将该结果除以3。但同样的结果可以通过将x除以3的整数部分然后加上1来实现,如下所示:

int(x / 3) + 1

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

range(0, x+1, 3)

3 的步骤上从0 迭代到x+1 并产生相同的结果。即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

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

[pow(i, 3) for i in range(0, x+1, 3)]

【讨论】:

    【解决方案2】:

    for循环的正确语法是

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

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

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

    或者简而言之:

    def get_cubes(x):
        return [i ** 3 for i in range(0, x+1, 3)]
    

    【讨论】:

    • 如果您向 OP 解释您的代码是如何替代错误代码的,那就太好了。显然,他/她似乎是个初学者。
    【解决方案3】:

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

    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]
    

    【讨论】:

      猜你喜欢
      • 2020-10-18
      • 2016-10-04
      • 2019-01-08
      • 1970-01-01
      • 2017-01-15
      • 2010-11-14
      • 1970-01-01
      • 2021-10-21
      • 2015-05-17
      相关资源
      最近更新 更多