Python高级特性
在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好
切片
切片就是对字符串进行各种截取操作。
1 | 1,10)) l = list(range( |
迭代
通过for循环来遍历list或tuple
1 | for ch in 'abc': |
默认情况下迭代value,可以用for value in d.value()
同时迭代key和value,可以用for k,v in d.items
可以用Iterable判断一个对象是否为可迭代对象
1 | from collections import Iterable |
通过enumerate可以把一个list变成索引-元素对
1 | for i,value in enumerate(['a','b','c']): |
列表生成式
1 | 1,11)) list(range( |
生成器
一边循环一边计算的列表成为列表生成器
1 | for x in range(10)] l = [x*x |
l和g的区别仅在于最外层的[]和(),l是一个list,而g是一个generator,需要通过next()函数才能获得generator的下一个返回值
1 | next(g) |
generator保存的是算法,每次调用next(g),直到最后一个元素时就会抛出StopIteration的错误。可以使用for循环来迭代generator
1 | def fib(max): |
迭代器
可以直接作用于for循环的数据类型:
- 集合数据类型,如list、tuple、dict、set、str等;
- generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象称为可迭代对象:Iterable,可以使用isinstance()判断一个对象是否是Iterable对象。
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator
可以使用iter()函数把Iterable变成Iterator
1 | from collections import Iterator |
Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。