如果're'函数必须只接收一个参数's'并且必须返回一个包含从1到12的数字(整数)的列表,它应该是什么样子。 (例如)?
因此交互式控制台中的结果必须是:
>>> re(12)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
答案 0 :(得分:3)
首先你错误地使用了def
,如果你想定义你必须输入:
并在下面的附加缩进中定义函数,或者如果你想使用函数,你必须删除{ {1}}。
Python内置range()
不可变序列类型,需要一到三个参数开始,停止和步骤,在这种情况下,我们只会使用前两个。但是要获取列表,我们还需要使用另一个内置的,即可变序列类型 - list()
,您可以在here中阅读有关列表的更多信息。我们将使用list()作为类型构造函数:def
或list()
,如内置类型页面中所指定:
列表可以通过多种方式构建:
list(iterable)
构造函数构建一个列表,其项目相同且相同 订购可迭代的项目。 iterable可以是序列,a 支持迭代的容器或迭代器对象。如果可迭代的话 已经是一个列表,一个副本被制作并返回,类似于 可迭代[:]。例如,list('abc')返回['a','b','c']和 list((1,2,3))返回[1,2,3]。如果没有给出任何论据,那么 构造函数创建一个新的空列表,[]。
现在我们了解了Using a pair of square brackets to denote the empty list: []
Using square brackets, separating items with commas: [a], [a, b, c]
Using a list comprehension: [x for x in iterable]
Using the type constructor: list() or list(iterable)
的工作原理,我们可以回到list()
用法:
范围构造函数的参数必须是整数(内置int或任何实现索引特殊的对象 方法)。如果省略step参数,则默认为1.如果 start参数被省略,默认为0.如果step为零, 引发了ValueError。
对于正步骤,范围r的内容由公式r [i] = start + step * i确定,其中i> = 0且r [i] <1。停止。
对于否定步骤,范围的内容仍由公式r [i] = start + step * i确定,但约束 是i> = 0且r [i]>停止。
如果r [0]不符合值约束,则范围对象将为空。范围确实支持负指数,但这些指数 被解释为从序列的末尾开始的索引 积极的指数。
允许使用大于sys.maxsize的绝对值的范围,但某些功能(例如len())可能会引发OverflowError。
范围示例:
range()
范围实现除串联和重复之外的所有常见序列操作(由于范围对象可以 仅表示遵循严格模式和重复的序列 连接通常会违反该模式。)
- 开始强>: start参数的值(如果未提供参数,则为0)
- 的停止强>: stop参数的值
- 的步骤强>: step参数的值(如果未提供参数,则为1)
许多其他操作也会生成列表,包括sorted()内置。
您的问题的答案如下:
>>>
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))
[]
答案 1 :(得分:0)
我会避免使用“re”作为函数名,因为re也是正则表达式的python库。
Lycopersicum的答案很好地解释了范围(),这是解决问题的最快,最直接的方式。一般来说,最好使用Python的内置函数,因为它将使用Python的编译C代码而不是较慢的Python代码。
我只是想知道为什么要使用Range()。
因此,还有其他方法可以生成数字列表。首先使用循环直接生成列表。
def listOfNumbers (number):
start = 1
listOf = []
while (start <= number):
listOf.append(start)
start = start + 1
return listOf
在这种情况下,您只需使用listOfNumbers(12)
,您就会得到一个数字列表。但是,这会将一个列表存储在内存中并且速度很慢,因此对于非常大的数字而言并不好。
另一方面,您可以使用生成器(非常类似于range())。生成器不会将数据存储在列表中。相反,它只是一次“产生”一个数字,直到代码停止。它快得多:
def generatorOfNumbers (number):
start = 1
while start <= number:
yield start
start += 1
然后您可以将其称为生成列表的两种方法之一:
def listFromGenerator1 (number):
return [x for x in generatorOfNumbers(number)]
def listFromGenerator2 (number):
return list(generatorOfNumbers (number))
当我计算这些方法时,我得到了。
timed(listOfNumbers) # time for list of 10000
...
Elapsed Time: 2.16007232666
Elapsed Time: 1.32894515991
Elapsed Time: 2.09093093872
Elapsed Time: 1.99699401855
Elapsed Time: 3.2000541687
... timed(listFromGenerator1)
...
Elapsed Time: 1.33109092712
Elapsed Time: 1.30605697632
Elapsed Time: 1.93309783936
Elapsed Time: 1.79386138916
Elapsed Time: 1.90401077271
... timed(listFromGenerator2)
...
Elapsed Time: 0.869989395142
Elapsed Time: 1.08408927917
Elapsed Time: 1.65319442749
Elapsed Time: 1.53398513794
Elapsed Time: 1.36089324951
... timed(listFromRange) # Lycopersicum's approach
...
Elapsed Time: 0.346899032593
Elapsed Time: 0.284194946289
Elapsed Time: 0.282049179077
Elapsed Time: 0.295877456665
Elapsed Time: 0.303983688354
总之,总是尽可能使用内置函数,而不是尝试构建自己的函数。这包括list()与列表理解的(轻微)偏好。