附加范围功能

use*_*025 3 python python-2.x

编辑:感谢您对如何完成我想要做的事情的回复,但问题是关于WHY range().如果您在一步中尝试,则append()返回None,如果您两个,它为什么会有效 -步骤程序.

我试图创建一个数字列表,但扭曲.在我的列表开始时我不想要几个数字:

mlist = [0, 5, 6, 7, ...]
Run Code Online (Sandbox Code Playgroud)

所以我想做以下事情:

 mlist = range(5,n+1).append(0)
Run Code Online (Sandbox Code Playgroud)

但默默地失败,因为type(mlist)之后等于NoneType?!(相关:type(range(5,10)评估list类型)

如果我尝试分两步完成,例如:

>>> mlist = range(5,10)
#and then
>>> mlist.append(0)
>>> mlist
[5, 6, 7, 8, 9, 10, 0]
Run Code Online (Sandbox Code Playgroud)

发生了什么?

Mar*_*ers 6

list.append()改变列表到位,然后返回None.通过为您分配返回值mlist,而不是您要构建的列表.这是一个标准的Python习语; 改变可变对象的方法永远不会返回已更改的对象None.

分开这两个步骤:

mlist = range(5, n + 1)
mlist.append(0)
Run Code Online (Sandbox Code Playgroud)

这增加[0]结果 ; 如果您0在开始时需要,请使用:

mlist = [0] + range(5, n + 1)
Run Code Online (Sandbox Code Playgroud)

或者您可以list.insert()再次使用,作为单独的电话:

mlist = range(5, n + 1)
mlist.insert(0, 0)
Run Code Online (Sandbox Code Playgroud)

但是后者必须将所有元素向上移动一步,并且通过连接创建新列表是更短的列表的更快选项,更长列表上的插入获胜:

>>> from timeit import timeit
>>> def concat(n):
...     mlist = [0] + range(5, n)
... 
>>> def insert(n):
...     mlist = range(5, n)
...     mlist.insert(0, 0)
... 
>>> timeit('concat(10)', 'from __main__ import concat')
1.2668070793151855
>>> timeit('insert(10)', 'from __main__ import insert')
1.4820878505706787
>>> timeit('concat(1000)', 'from __main__ import concat')
23.53221583366394
>>> timeit('insert(1000)', 'from __main__ import insert')
15.84601092338562
Run Code Online (Sandbox Code Playgroud)