python的高阶特性
列表生成式(列表解析) 效率比普通方法高
a=[x for x in range(100)if x % 2 == 0]
x:列表元素的值
for x in range(100):数据来源
if x%2==0:元素的成立条件
例:生成一个二维列表
a=[[0 for i in range(10)]for j in range(3)]
生成器
若序列元素个数非常多,全放到内存中,对计算机压力是很大的,如果元素按某种算法推算出来,那就不必创建完整的list
在Python中,这种一边循环一边计算的机制,称为生成器:generator
创建方法1
a=(x for x in range(100)if x % 2 == 0 ) 生成式[]改为()
获取generator返回值 使用next()函数
next(a)---->0
next(a)---->1
不过一次次使用next(),太过于麻烦,正确的方法是使用for循环,generator为可迭代对象
for i in a:
print(i)
创建方法2
不过用生成式也有解决不了的问题如:斐波那契数列,但是函数方式可以很轻松的解决
def fib(num):
for i in range(1,num+1):
if i==1:
b,value=1,1
yield value
elif i==2:
value=2
yield value
elif i>=3:
b=value
value=value+b
yield value
这里可以看出来 生成式函数用yield返回继续执行,而函数是顺序执行,遇到return语句或者最后一行函数语句就返回
即第几次的yield为第几次调用的值
调用方法
1.
next(fib(10)) 直接调用
2.
a=fib(10) 对象
next(a)
3.
for i in fib(10): 迭代
print(i)
没有可调用的yleld/list元素会引发StopIteration错误
迭代器
可直接作用于for的数据类型
1.集合数据类型 list tuple dict set str
2.generator(生成器)/generator function(生成器函数)
这类统称为:Iterable(可迭代对象)
生成器不但可以作用for循环,还能被next()不断调用并返回一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值
可以被next()不断调用的称为:Iterator(迭代器)
生成器是Iterator,而list dict set虽然是Iterable却不是Iterator iter(Iterator对象) 将Iterable转为Iterator
Iterable与Iterator的区别
Iterator对象表示一个数据流,Iterator对象可以被next()调用并不断返回值,没有数据抛出StopIteration错误,可以将这个数据流看做一个
有序数列,但不知道序列长度只能不断next()按需计算下一个数据,因此Iterator的计算是惰性