当我尝试在如下一行中使用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循环方法编写它时,它工作得很好。谁能告诉我为什么?
答案 0 :(得分:1)
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)]
答案 1 :(得分:0)
我的回答遵循(修改)了您的方法(代码),而不是使用列表理解,而是以纠正的方式。将其与您的代码进行比较,您将找出错误所在。我添加了评论#
来解释更改
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]
答案 2 :(得分:0)
如果您严格想要单线,那么这是解决方案:
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代码为何有效的人:
原始代码执行以下操作:
x
,从0
迭代到3 divides x
加1
的次数。第1步最初写为
range(int((x - x%3) / 3) + 1)
会在除以3
时减去数字的提示,然后在将结果加3
之前将结果除以1
。但是,只要获得将x
除以3
然后再加上1
的整数部分,就可以得到相同的结果:
int(x / 3) + 1
第2步在将每次迭代乘以3
之前将其乘以3
的幂,但是也可以实现“乘法” 通过使用范围(就像@daniel一样)使用:
range(0, x+1, 3)
,它按0
的步骤从x+1
迭代到3
,并产生相同的结果。即x
为10
:
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)]