I'm taking this online Python course并尝试解决以下称为编码练习的问题:它是自然的:
编写一个函数naturalNumbers,它以正整数n作为输入,并返回由前n个自然数组成的列表[1,2,...]。
我甚至需要一个for循环来创建列表吗?这是我的代码(显然不起作用)。请记住,他们没有教过列表理解。我在stackoverflow上找到了这个概念。
def naturalNumbers(n):
list = [n+1 for i in n]
return list
我应该采用另一种方法来创建1,2,3 ... n的多个列表并将它们连接在一起,如[1] + [2] + [3] ......
答案 0 :(得分:4)
我是否需要for循环来创建列表?
不,您可以(通常情况下应该)使用内置函数range()
:
>>> range(1,5)
[1, 2, 3, 4]
即
def naturalNumbers(n):
return range(1, n + 1)
Python 3's range()
略有不同,因为它返回range
个对象而不是列表,所以如果你使用3.x将它全部包装在list()
中:{{1} }。
答案 1 :(得分:3)
您的尝试有两个问题。
首先,您使用了n+1
代替i+1
,因此您将返回[5, 5, 5, 5]
而非[1, 2, 3, 4]
之类的内容。
其次,你不能for
- 循环遍历n
之类的数字,你需要循环某种序列,例如range(n)
。
所以:
def naturalNumbers(n):
return [i+1 for i in range(n)]
但如果您已经拥有range
功能,则根本不需要此功能;正如阿尔沙基所示,你可以return range(1, n+1)
。
那么,你将如何建立自己?您没有要循环的序列,因此您必须使用for
自行构建它而不是while
:
def naturalNumbers(n):
results = []
i = 1
while i <= n:
results.append(i)
i += 1
return results
当然,在实际代码中,您应始终将for
与range
一起使用,而不是手动执行。事实上,即使是这个练习,最好先编写自己的range
函数,只是将它用于naturalNumbers
。 (它已经非常接近了。)
如果你想变得聪明,还有一个选择。
如果您有一个列表,则可以对其进行切片。例如,my_list
的前5个元素是my_list[:5]
。因此,如果您有一个以1
开头的无限长列表,那将很容易。不幸的是,你不能拥有一个无限长的列表...但你可以有一个非常容易模拟的迭代器,可以使用count
或者编写你自己的2-liner等价物。而且,虽然您无法对迭代器进行切片,但您可以使用islice
执行等效操作。所以:
from itertools import count, islice
def naturalNumbers(n):
return list(islice(count(1), n)))
答案 2 :(得分:3)
以下是从1开始创建具有N个连续自然数的列表的几种方法。
1范围:
def numbers(n):
return range(1, n+1);
2名单理解:
def numbers(n):
return [i for i in range(1, n+1)]
你可能想要研究方法xrange和生成器的概念,这些在python中很有趣。祝你学习顺利!