我正在尝试列出其中的数字1-1000
。显然,这会令人烦恼,因此我试图创建一个包含范围的列表。在Python 2中,似乎:
some_list = range(1,1000)
本来可以用,但是在Python 3中,范围类似于xrange
Python 2?
谁能对此提供一些见识?
我正在尝试列出其中的数字1-1000
。显然,这会令人烦恼,因此我试图创建一个包含范围的列表。在Python 2中,似乎:
some_list = range(1,1000)
本来可以用,但是在Python 3中,范围类似于xrange
Python 2?
谁能对此提供一些见识?
Answers:
您可以从range对象构造一个列表:
my_list = list(range(1, 1001))
这也是您使用python2.x中的生成器进行操作的方式。通常来说,虽然您可能不需要列表,但因为可以得到my_list[i]
更有效(i + 1
)的值,如果只需要遍历该列表,则可以依靠range
。
另请注意,在python2.x上,xrange
仍可索引1。这意味着range
在python3.x上也具有相同的属性2
1print xrange(30)[12]
适用于python2.x
2 python3.x中与1相似的语句是print(range(30)[12])
并且也起作用。
list(arg)
在其他语言理解为调用的构造函数list
的类。实际上,这也是Python的情况。辩论是在构造期间(如在C ++情况下)填充对象,还是仅在第一个自动调用的方法(如Python __init__()
方法)期间填充对象,这不能改变基本的抽象概念。我的看法是列表构造函数采用迭代器,并用返回的值填充列表。
'range' object is not callable
在Pythons <= 3.4中,您可以按照其他建议使用list(range(10))
,以使列表超出范围(通常,任何可迭代的列表)。
在Python中3.5
以解压缩概括引入的另一种替代方法是*
在列表文字中使用[]
:
>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
尽管这等效于list(r)
,但是它是字面语法,并且不涉及任何函数调用的事实确实使它执行得更快。如果您需要打高尔夫球,它的字符也更少:-)
[*range(10)]
适用于不需要range
初始化任何用途而只需要初始化的情况list
。旁注:我最喜欢的(好吧,不是真的)解压缩概括的一部分是,Empty set
现在具有文字语法{*()}
,或者,我称之为单眼猴子运算符。;-)
在Python 3.x中,该range()
函数具有自己的类型。所以在这种情况下,您必须使用迭代器
list(range(1000))
list(range(1000))()
Python3缺少直接获取范围列表的功能的原因是因为最初的Python3设计器在Python2中是新手。他只考虑了range()
在for循环中使用函数,因此,该列表永远不需要扩展。实际上,很多时候我们确实需要使用range()
函数来生成列表并传递给函数。
因此,在这种情况下,与Python2相比,Python3不那么方便,因为:
xrange()
和range()
;range()
和list(range())
尽管如此,您仍然可以通过以下方式使用列表扩展:
[*range(N)]
list
,因为这通常是错误的做法。对于99出的100用例,使实际list
是低效和毫无意义的,因为range
它本身就像一个不可改变的序列几乎完全不同,有时更有效地引导(如遏制试验int
s为O(1)
,与O(n)
对list
S)。在Python 2中,range
即使xrange
几乎总是更好的选择,人们还是倾向于默认使用。在Python 3中,您可以显式选择加入list
,而不会因使用错误的名称而意外获取。
您实际上不需要在列表中使用数字1-1000。但是,如果由于某些原因您确实需要这些数字,则可以这样做:
[i for i in range(1, 1001)]
清单理解概述:
上面的列表理解转换为:
nums = []
for i in range(1, 1001):
nums.append(i)
尽管只是2.x版本,但这只是列表理解语法。我知道这可以在python 3中使用,但是不确定是否还有升级的语法
范围开始于第一个参数;但以不包括第二个参数为结束(当提供2个参数时;如果第一个参数保留,则其将从'0'开始)
range(start, end+1)
[start, start+1, .., end]
list(range(1000))
list(range(1000))
将在python3中工作,就像list(xrange(1000))
在python2中一样
在Python 3中使用范围。
这是一个在两个数字之间返回的示例函数
def get_between_numbers(a, b):
"""
This function will return in between numbers from two numbers.
:param a:
:param b:
:return:
"""
x = []
if b < a:
x.extend(range(b, a))
x.append(a)
else:
x.extend(range(a, b))
x.append(b)
return x
结果
print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))
[5, 6, 7, 8, 9]
[5, 6, 7, 8, 9]
实际上,与Python2相比,这是对Python3的追溯。当然,使用range()和xrange()的Python2比分别使用list(range())和range()的Python3更方便。原因是因为Python3的原始设计人员经验不足,他们只考虑了许多初学者使用范围函数来遍历内存和CPU效率低下的大量元素。但是他们忽略了使用range函数生成数字列表。现在,对他们来说已经变回来为时已晚。
如果要成为Python3的设计师,我将:
那应该是最佳的。
some_list[i] == i+1
因此您可能根本不需要列表。