6

我正在学习这个在线 Python 课程并尝试解决以下称为编码练习的问题:它很自然:

编写一个函数 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]....

4

3 回答 3

5

您的尝试有两个问题。

首先,你使用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)正如 arshaji 所示,您可以。

那么,您将如何自己构建它?您没有要循环的序列,因此for您必须自己构建它,而不是while

def naturalNumbers(n):
    results = []
    i = 1
    while i <= n:
        results.append(i)
        i += 1
    return results

当然,在实际代码中,您应该始终使用forwith a range,而不是手动执行操作。事实上,即使对于这个练习,最好先编写自己的range函数,然后将其用于naturalNumbers. (已经很接近了。)


如果您想变得聪明,还有另一种选择。

如果你有一个列表,你可以把它切片。例如,前 5 个元素my_listmy_list[:5]。因此,如果您有一个以 开头的无限长列表1,那将很容易。不幸的是,你不能有一个无限长的列表……但是你可以有一个迭代器,它可以很容易地模拟一个迭代器,无论是通过使用count还是编写你自己的 2-liner 等效项。而且,虽然您不能对迭代器进行切片,但您可以使用islice. 所以:

from itertools import count, islice
def naturalNumbers(n):
    return list(islice(count(1), n))
于 2013-09-11T22:25:44.483 回答
4

我什至需要一个 for 循环来创建一个列表吗?

不,您可以(并且在一般情况下应该)使用内置函数range()

>>> range(1,5)
[1, 2, 3, 4]

IE

def naturalNumbers(n):
    return range(1, n + 1)

Python 3range()略有不同,它返回一个range对象而不是列表,所以如果您使用的是 3.x,请将其全部包装在list():中list(range(1, n + 1))

于 2013-09-11T22:16:52.417 回答
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 中很有趣。祝你学习顺利!

于 2013-09-11T22:53:56.007 回答