武道之路-炼体期六重天(年已过,恢复更新)
生成器:调用的时候才生成的数据(惰性计算,协程:保留上次进入的状态,每次程序进入,相当于调用上一次的状态,异步),单线程下的并发效果(不同角色间切换)。
(3.x)range(),列表生成式 [i*i for i in range(20)],
文件读取:
for line in f: (这里f是文件句柄)
print(line)
记住重要的方法:__next__(计算下一个状态值),send(value)(把值传给生成器的yeild)
例如(斐波那契数列):
def seq(num):
#计算几位斐波那契数列
count,x,y=0,0,1
while count<num:
yield y #想把什么放入生成器
x,y=y,x+y
count=count+1
return 'end'
g=seq(10)
g.__next__()->1
g.__next__()->1
g.__next__()->2
...
超过num数字会抛出异常
捕获异常:
try:
#程序段
except StopIteration(异常类型,这里表示没有更多值了):
print('error')
break
单线程下的并发效果(异步):
import time
def employee(name):
print('%s 已经准备工作'%name)
while True:
work=yield
print('%s 员工已经完成老板下发的%s份工作 '%(name,work))
def boss(name):
wang=employee('小王')
zhang=employee('小张')
wang.__next__() #相当于把函数变成生成器 停在yield(执行到这里)
zhang.__next__()
print('%s 准备去接单了'%name)
for i in range(10):
print('已经接到 %d 份单子'%i)
wang.send(i)#把值传给yield
zhang.send(i)
time.sleep(1)#隔一秒
boss('大哥')#调用,boss 接单,员工完成工作同时进行!(不熟悉的自己设断点调试过程)
迭代器(Iterator):可被__next__调用并不断返回下一个值的对象,直到抛出异常。生成器(generator),range(), f(文件句柄),[i*5 for i in range(10)],for循环(底层)
可迭代对象(Iterable):可直接作于for循环的对象,list tuple,dict,set,str(可通过Iter()转成迭代器), 带yield的function,generator
from collections inport Iterable(Iterator) 先引入
isinstance(对象,Iterable(Iterator)) 判断是否是可迭代对象(迭代器)
一些内置函数:
abs() 求绝对值
bool()判断真假
all()检测可迭代对象里的元素的值有假即是假
any()检测可迭代对象里的元素的值有真即是真
bin()转二进制-》b'.....'
bytearray('值',encoding='编码'),二进制可变数组,bytes不可变
callable() 是否可调用,函数,类---》()
chr 返回ASCII值对应的字符,ord 与之相反