一、迭代器
用时间换空间
可迭代对象Iterable
迭代对象Iterator
##创建迭代类
class Myiterator:
def __init__(self):
self.i = 0
def __next__(self):
if (self.i < 20):
self.i += 2
return self.i
else:
raise StopIteration
iter = Myiterator()
# 创建可迭代类
class Myiterable:
def __iter__(self):
return iter
ite = Myiterable()
for i in ite:
print(i)
python迭代器的协议:迭代器必须同时包含__iter__和__next__
##创建迭代器
class Myiterator:
def __init__(self):
self.i = 0
def __iter__(self):
return self
def __next__(self):
if (self.i < 20):
self.i += 2
return self.i
else:
raise StopIteration
ite = Myiterator()
for i in ite:
print(i)
l=[1,2,3,4]#可以for循环的都是可迭代对象
i=l.__iter__()
print(i.__next__())#1
print(i.__next__())#2
二、生成器
#生成器
def mygen():
gen=0
while gen<10:
gen+=1
yield gen
#迭代器的升级版
ge=mygen()
print(next(ge))
print("==================")
#生成器表达式
gens=(i*i for i in range(0,10))
for i in gens:
print(i)
三、高阶函数
函数作为参数
import time
def foo():
print("foo开始")
time.sleep(2)
def bar():
print("bar开始")
time.sleep(3)
def timer(func):
start=time.time()
func()
print("用时:",time.time()-start)
timer(foo)
四、闭包函数
外部自由变量被内部引用则称为闭包函数,自由变量在没有被调用的时候不会被删除
def foo():
print("foo开始")
x=20
def bar():
print("bar开始")
print(x)
return bar
func=foo()
func()
bar函数因为被外部 func引用,因此不会因为foo执行而空间被销毁。
x因为函数调用,因此不会被销毁
五、装饰器函数
不改变原函数基础上,对内部结构进行更改
import time
def foo():
print("foo功能")
time.sleep(3)
def bar():
print("bar功能")
time.sleep(2)
def timer(func):
def wrapper():
start=time.time()
func()
print("用时:",time.time()-start)
return wrapper
bar=timer(bar)
bar()
foo=timer(foo)
foo()
import time
@timer
def foo():
print("foo功能")
time.sleep(3)
@timer#等价于bar=timer(bar)
def bar():
print("bar功能")
time.sleep(2)
def timer(func):
def wrapper():
start=time.time()
func()
print("用时:",time.time()-start)
return wrapper
bar()
foo=timer(foo)
foo()
装饰器小案例(每个函数装饰器的调用空间是独立的)
#计数函数调用次数
def calledNum(func):
count=0
def inner():
nonlocal count
count+=1
func()
print(f"调用{func.__name__}了{count}次")
return inner
@calledNum
def bar():
print("bar")
@calledNum
def foo():
print("foo")
bar()
bar()
foo()
六、并发
稍后更新