一、罗列全部的内置函数
戳: https://docs.python.org/2/library/functions.html
二、range、xrange(迭代器)
无论是range()还是xrange()都是Python里的内置函数。这个两个内置函数最常用在for循环中。例如:
>>>foriin range(5): ...printi ... 0 1 2 3 4 >>>foriin xrange(5): ...printi ... 0 1 2 3 4 >>> range()和xrange()在Python 2里是两种不同的实现。但是在Python 3里,range()这种实现被移除了;保留了xrange()的实现,且将xrange()重新命名成range()。
首先,我们来看Python 2里range()。它是一个内置函数,这个函数用于创建整数等差数列。因此它
常被用于for循环。下面是range()的官方帮助文档。 Help on built-in function range in module __builtin__: range(...) range(stop) -> list of integers range(start, stop[, step]) -> list of integers Return a list containing an arithmetic progression of integers. range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0. When step is given, it specifies the increment (or decrement). For example, range(4) returns [0, 1, 2, 3]. The end point is omitted! These are exactly the valid indices for a list of 4 elements. (END) 从官方帮助文档,我们可以看出下面的特性:
1、内置函数(built-in)
2、接受3个参数分别是start, stop和step(其中start和step是可选的,stop是必需的)
3、如果没有指定start,默认从0开始(Python都是从0开始的)
4、如果没有指定step,默认step是1。(step不能是0,如果指定step为0,“ValueError: range() step argument must not be zero”
将会被抛出。
额外的特性:
1、当step为正数时,start应该小于stop,否则将生成[ ],即空数列。 >>>range(-3) [] >>>range(5,1) [] >>>range(1,1) [] 2、当step为负数时,start应该大于stop,否则将生成[ ],即空数列。
这两个特性说明range()可以生成递增和递减的数列。
下面是range()生成数列的例子: >>>range(5) [0,1,2,3,4] >>>range(1,8,3) [1,4,7] >>>range(0,-10) [] >>>range(0,-10,-2) [0,-2,-4,-6,-8] >>>
接下来看看xrange()。 xrange()虽然也是内置函数,但是它被定义成了Python里一种类型(type),这种类型就叫xrange。我们从Python 2的interactive shell里很容易看到这点。
>>>range <built-infunction range> >>>xrange <type'xrange'> >>>我们再来看看xragne的官方帮助文档:
Help on class xrange in module __builtin__: class xrange(object) | xrange(stop) -> xrange object | xrange(start, stop[, step]) -> xrange object | | Like range(), but instead of returning a list, returns an object that | generates the numbers in the range on demand. For looping, this is | slightly faster than range() and more memory efficient. | | Methods defined here: | | __getattribute__(...) | x.__getattribute__('name') <==> x.name | | __getitem__(...) | x.__getitem__(y) <==> x[y] | | __iter__(...) | x.__iter__() <==> iter(x) | | __len__(...) | x.__len__() <==> len(x) | | __reduce__(...) | | __repr__(...) | x.__repr__() <==> repr(x) | | __reversed__(...) | Returns a reverse iterator. | | ---------------------------------------------------------------------- | Data and other attributes defined here: | | __new__ = | T.__new__(S, ...) -> a new object with type S, a subtype of T (END) 从文档里可以看出,xrange和range的参数和用法是相同的。只是xrange()返回的不再是一个数列,而是一个xrange对象。这个对象可以按需生成参数指定范围内的数字(即元素)。由于xrange对象是按需生成单个的
元素,而不像range那样,首先创建整个list。所以,在相同的范围内,xrange占用的内存空间将更小,xrange
也会更快。实际上,xrange由于是在循环内被调用时才会生成元素,因此无论循环多少次,只有当前一个元素
占用了内存空间,且每次循环占用的都是相同的单个元素空间。我们可以粗略的认为,相同n个元素的话,range占
用的空间是xrange的n倍。因此,在循环很大情况下,xrange的高效率和快速将表现的很明显。我们可以用 timeit
来测试一下range和xrange的执行时间。 >>>timeit.timeit('for i in range(10000000): pass',number=1) 0 . 49290895462036133 >>>timeit.timeit('for i in xrange(10000000): pass',number=1) 0 . 2595210075378418 在大量循环的条件下,可以看到xrange的高效率是很明显的。
总结一下:
1、range()返回整个list。
2、xrange()返回的是一个xrange object,且这个对象是个iterable。
3、两者都用与for循环。
4、xrange()占用更少的内存空间,因为循环时xrange()只生成当前的元素,不像range()一开始就成生成完整的list。
这就是在Python 2里range和xrange的相同点和区别。
那么在Python 3里,我们在前面提到了range()被移除了,xrange()被重新命名成了range()。它们之间有区别吗?
请看下面的代码
Python 2的xrange() Python 2.7.6(default,Dec 5 2013,23:54:52) [GCC 4.6.3]on linux2 Type"help","copyright","credits"or"license"formore information. >>>x=xrange(5) >>>x xrange(5) >>>x[:] Traceback(most recent call last): File"",line 1,in<module> TypeError:sequence index must be integer,not'slice' >>>x[-1] 4 >>>list(x) [0,1,2,3,4] >>>dir(x) ['__class__','__delattr__','__doc__','__format__','__getattribute__','__getitem__','__hash__','__init__','__iter__','__len__','__new__','__reduce__','__reduce_ex__','__repr__','__reversed__','__setattr__','__sizeof__','__str__','__subclasshook__'] >>>
Python 3的range()
Python 3.3.4(default,Feb 23 2014,23:07:23) [GCC 4.6.3]on linux Type"help","copyright","credits"or"license"formore information. >>>x=range(5) >>>x range(0,5) >>>x[:] range(0,5) >>>x[:3] range(0,3) >>>list(x) [0,1,2,3,4] >>>x[-1] 4 >>>dir(x) ['__class__','__contains__','__delattr__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__gt__','__hash__','__init__','__iter__','__le__','__len__','__lt__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__reversed__','__setattr__','__sizeof__','__str__','__subclasshook__', 'count' , 'index' , 'start' , 'step' , 'stop' ] >>> 很明显,range object在Python里增加了新的attri