迭代器 Iterable
迭代器就是遍历,从第一个到最后一个遍历出来,能够被迭代的对象(Iterable),都是有序的,好比如知道第一个是谁,下一个是谁。
能够被迭代的序列 list tuple string dict set,bytes
其中dict set都是无序的,无法控制顺序,比如dict 可以通过迭代key,通过key取到value
mylist=[1,2,3,4,5,6]
for i in mylist:
print(i)
from collections import Iterable
mylist = [1, 2, 3, 4]
# for i in mylist:
# print(i)
#
# print(isinstance(mylist, Iterable))
# print(isinstance('mylist', Iterable))
# print(isinstance(123, Iterable))
it = iter(mylist)
print(next(it))
print(next(it))
生成器 Generator
生成器也可以被迭代,可以实现按需求去执行,一边迭代,一边生成,一边输出
from collections import Iterable
gen = (g for g in range(1, 5))
print(isinstance(gen, Iterable))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen)) #已经停止迭代
比如:一边迭代,一边生成,一边输出
# 斐波那契数列(Fibonacci sequence)0、1、1、2、3、5、8、13、21、34
def fibonacci(n):
a,b=0,1
count=0
res=[]
while True:
if count >n:
break
res.append(a+b)
a,b=b,a+b
count+=1
return res
print(fibonacci(10))
假设print(fibonacci(10000000000000000)),运行的话基本卡死了,于是有了yeild
虽然被调用,但实际还没有执行,和上面卡死的现象不同,上面的是直接计算好才输出的,和使用生成器区别就是用那个调那个,一边用一边算,串行变并行
# 斐波那契数列(Fibonacci sequence)0、1、1、2、3、5、8、13、21、34
def fibonacci(n):
a, b = 0, 1
count = 0
while True:
if count > n:
break
yield a + b
a, b = b, a + b
count += 1
gen = fibonacci(100000000000)
for f in gen:
if f > 500:
break
print(f)
装饰器 Decorator
# 没有调用装饰器,普通定义的函数
def show(me):
print('我是')
me()
def afun():
print('A')
def bfun():
print('B')
# afun()
# bfun()
show(afun)
show(bfun)
装饰器,其实就是闭包,函数里面套函数
# 装饰器,其实就是闭包,函数里面套函数
def show(me):
def showtitle():
print('I am')
me()
return showtitle
def showwhere(me):
def showtitle():
me() # 先执行@show,后执行@showwhere
print('where r u')
# me() 如果写这里,和@show的顺序一样的那就看,你写的装饰器在哪里,谁在最头顶,就显示谁
return showtitle
@showwhere
@show
def afun():
print('A')
@show
def bfun():
print('B')
afun()
bfun()
#------------------执行结果-------------
I am
A
where r u
I am
B
装饰器,传参使用,*args,**kwargs
def show(me):
def showtitle(*args,**kwargs): #python约定的*args可变参数,**kwargs关键类型可变参数
print('I am')
me(*args,**kwargs)
return showtitle
def showwhere(me):
def showtitle():
me()
print('where r u')
return showtitle
# @showwhere
@show
def afun(x):
print(x)
@show
def bfun(x,y,**kwargs):
print(x,y)
print(kwargs)
afun('acb')
bfun('hi','good job',a='py',b='th',c='on')
#------------------执行结果-------------
I am
acb
I am
hi good job
{'a': 'py', 'b': 'th', 'c': 'on'}
其他
TypeError: ‘NoneType’ object is not callable
理解Python装饰器(Decorator)
如何理解Python装饰器?
详解Python的装饰器
Python中*args和**kwargs的区别
Python的functools模块