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

Python 如何编写接受正整数N并返回前N个自然数列表的函数,python,list,for-loop,Python,List,For Loop,并试图解决以下称为编码练习的问题:这很自然: 编写一个函数naturalNumbers,以正整数n作为输入,并返回由前n个自然数组成的列表[1,2,…] 我是否需要一个for循环来创建列表?这是我的代码(显然不起作用)。记住,他们并没有教学生理解列表。我在stackoverflow上发现了这个概念 def naturalNumbers(n): list = [n+1 for i in n] return list 我是否应该采取另一种方法,创建多个1,2,3…n的列表,并将它们像[

并试图解决以下称为编码练习的问题:这很自然:

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

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

不,您可以(并且在一般情况下应该)使用内置功能:

i、 e


与此稍有不同的是,它返回一个
范围
对象,而不是列表,因此如果使用3.x将其全部包装在
列表()
列表(范围(1,n+1))

首先,您使用了
n+1
而不是
i+1
,因此将返回类似
[5,5,5,5]
的内容,而不是
[1,2,3,4]

第二,你不能对一个像
n
这样的数字进行
循环,你需要循环某种序列,比如
范围(n)

因此:

但是如果你已经有了
范围
功能,你根本不需要这个;您可以只
返回范围(1,n+1)
,如arshaji所示

那么,你将如何自己构建这个呢?您没有要循环的序列,因此您必须使用
自己构建序列,而不是
for

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

这里有几种方法可以创建一个列表,其中N个连续的自然数从1开始

1范围:

def numbers(n): 
    return range(1, n+1);
2.清单理解:

def numbers(n):
    return [i for i in range(1, n+1)]

您可能希望了解xrange方法和生成器的概念,这些在python中很有趣。祝你学习顺利

你的在线Python课程很奇怪。基本上要求你重新发明轮子(
range
函数),事实上,你很难用列表来实现这一点。您的示例将给出一个错误,因为在
n
中没有任何东西可以循环,因为
n
的Gupta“是不可移植的”——这正是我所想的。有时,尝试了解如何实现内置函数非常有用,这样您就可以了解它们在做什么,并看到使用它们的好处(在
范围内的
for
循环
比带有显式计数器的
循环好得多),等等。出于类似的原因,我自己编写了
itertools.groupby
。但一旦你理解了一些事情,当然,只要在你真正的代码和所有未来的学习中使用标准电池就行了。类编译器出错了,说它需要的是列表类型而不是范围。不过我理解你的意思。范围会更容易。@StacyM reference到答案的最后一句。@StacyM他们在您链接到的页面上的示例中使用了
range
。3.x
range
不返回生成器,它返回一个
range
对象,这是非常不同的。它不保留任何内部状态,您可以对其进行索引(例如
range(5)[3]
)等等。事实上,它更像一个列表,而不是一个生成器。但不会浪费列表的内存。@arshajii:不。如果你想从技术上而不是松散地谈论,它就更不正确了。它甚至不是迭代器。它不是一个列表,它有常量而不是线性存储,但它是一个序列(事实上,a
collections.abc.Sequence
),可以在大多数使用列表的地方使用。列表理解在这里没有任何用处。
[i for i in foo]
始终与
list(foo)
相同,只是速度较慢,可读性较差,更详细。如果您使用的是Python 2.x(你大概是这样,因为你提到了
xrange
),你已经有了一个列表,所以
[i for i in foo]
列表(foo)
都是不必要的。因此,讲师只是回复说范围不是预期的解决方案。相反,我应该连接。关于如何实现这一点,有什么想法吗?这看起来像是“重新发明轮子”而且效率低下!@StacyM:编写真实代码肯定是一种效率低下的方式。但出于学习目的,这可能是学习一些东西的一种有效方式。例如,他可能试图向你展示冗长且容易出错的
版本是什么样子的,所以明天他可以向你展示更好的
for
版本,你会发现了解它。(而且,将来,如果你发现自己编写了一个
while
循环来检查和增加
i
,你马上就会知道有更好的方法。)@StacyM:无论如何,我想他想要的是我丑陋的
while
循环版本。我不知道他为什么说“连接”,因为通常这意味着
extend
+
而不是
append
,我怀疑他是否真的想让你写
结果。extend([I])
而不是
结果。append(I)
;可能他只是说错了。@StacyM:如果你想变得聪明/恼人,你可能想先交一个
itertools
版本。他也会告诉你那不是他想要的答案,但也许值得看看他是否得到了答案(在这种情况下,你找错了讲师)或者他只是不想让你超越自己…
def naturalNumbers(n):
    results = []
    i = 1
    while i <= n:
        results.append(i)
        i += 1
    return results
from itertools import count, islice
def naturalNumbers(n):
    return list(islice(count(1), n))
def numbers(n): 
    return range(1, n+1);
def numbers(n):
    return [i for i in range(1, n+1)]