如何编写一个函数,它接受一个正整数 N 并返回前 N 个自然数的列表

Sta*_*cyM 6 python for-loop list

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

编写一个函数 naturalNumbers,它接受一个正整数 n 作为输入,并返回一个由前 n 个自然数组成的列表 [1, 2, ...]。

我什至需要一个 for 循环来创建一个列表吗?这是我的代码(显然不起作用)。请记住,他们没有教过列表理解。我在 stackoverflow 上发现了这个概念。

def naturalNumbers(n):
   list = [n+1 for i in n]
   return list
Run Code Online (Sandbox Code Playgroud)

我是否应该采取另一种方法,创建多个 1,2,3...n 列表并将它们连接在一起,如 [1] + [2] + [3]....

aba*_*ert 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)]
Run Code Online (Sandbox Code Playgroud)

但是如果你已经有了这个range功能,你就根本不需要这个;你可以return range(1, n+1),正如阿尔沙吉所展示的那样。

那么,你将如何自己构建它?您没有要循环的序列,因此for您必须使用while以下命令自己构建它:

def naturalNumbers(n):
    results = []
    i = 1
    while i <= n:
        results.append(i)
        i += 1
    return results
Run Code Online (Sandbox Code Playgroud)

当然,在现实生活中的代码中,您应该始终使用forwith 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))
Run Code Online (Sandbox Code Playgroud)


ars*_*jii 4

我是否需要 for 循环来创建列表?

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

>>> range(1,5)
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

IE

def naturalNumbers(n):
    return range(1, n + 1)
Run Code Online (Sandbox Code Playgroud)

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

  • 3.x `range` 不返回生成器,它返回一个 `range` 对象,这是非常不同的。它不保留任何内部状态,您可以对其进行索引(例如“range(5)[3]”)等。事实上,它的行为更像是一个列表,而不是一个生成器。但不会浪费列表的内存。 (2认同)