读廖雪峰的 Python 教程小结--------Python高级特性

来源:互联网 发布:泰安中商网络 编辑:程序博客网 时间:2024/05/24 23:15

python的高级特性主要有

  • 切片
  • 迭代
  • 列表生成器
  • 生成器
  • 迭代器

切片

切片就像他的名字那样,切成一片一片的。
看看例子就懂了

>>>L=[0,1,2,3,4,5,6,7]#第1位到第3位(0-2):0,1,2>>>L[0:3]#第3位到第5位(2-4):2,3,4>>>L[2:5]#从第1位开始到第5位(0-4):0,1,2,3,4>>>L[:5]#从第2位到最后一位(2-7):2,3,4,5,6,7>>>L[2:]#所有>>>L[:]#从倒数第2到最后(6-7):6,7>>>L[-2:]#从第1位到倒数第2(0-6):0,1,2,3,4,5>>>L[:-2]#所有,每两位取1位>>>L[::2]#从第2位到第5位,每两位取一次>>>L[1:5:2]#倒序输出>>>L[::-1]

list、tuple等等都可以用切片


列表生成器

列表生成器是循环的简化版吧,我个人觉得
简单来说就是用中括号括住表达式
看例子:

#生成列表list,range()生成从1到10的序列>>>L = list(range(1,11))>>>[x*x for i in L]#遍历L,若是2的倍数就输出i*i>>>[x*x for i in L if i%2==0]

也可以双重循环,但是python主张简单,所以如果是双重循环不如用for形式


生成器

生成器generator,与列表生成器样子很类似,
他是一步一步的生成下一个值的(一边循环一边计算),直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

#列表生成器>>> L = [x * x for x in range(10)]>>> L[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]#生成器>>> g = (x * x for x in range(10))>>> g<generator object <genexpr> at 0x1022ef630>
>>> next(g)0>>> next(g)1>>> next(g)4>>> next(g)9>>> next(g)16>>> next(g)25>>> next(g)36>>> next(g)49>>> next(g)64>>> Traceback (most recent call last):  File "<stdin>", line 1, in <module>StopIteration

这样每次都要next(),看上去都很痛苦了,然而直接用for也可以,并且通过for循环来迭代它,并且不需要关心StopIteration的错误。

>>> g = (x * x for x in range(10))>>> for n in g:...     print(n)... 0149162536496481

上面看到的只是生成器最简单的调用方式,这里要介绍yield语句,他在很多地方都有运用,在生成器中,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是是一个generator:
而generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
例如: r = yield b 这个表达式分成两部分
首先 yield b 返回b
然后 r = yield 获取值赋给r


迭代与迭代器

  • list或者tuple等通过for循环这种遍历,称为遍历
  • 凡是可以用for循环遍历的对象,称为可迭代对象(Iterable)
  • 可以被next(值的对象,称为迭代器(Iterator)

判断是否可迭代对象

>>> from collections import Iterable>>> isinstance('abc', Iterable) # str是否可迭代True>>> isinstance([1,2,3], Iterable) # list是否可迭代True>>> isinstance(123, Iterable) # 整数是否可迭代False

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:

>>> isinstance(iter([]), Iterator)True>>> isinstance(iter('abc'), Iterator)True

你可能会问,为什么list、dict、str等数据类型不是Iterator?

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

原创粉丝点击