Python核心2(迭代器、闭包、装饰器、生成器)
一、迭代器
能用next()函数进行迭代的对象,可以被称为迭代器
1.迭代:
Iterable(可迭代的)
list、tuple、dic、generator、str、包含yield关键字的func
迭代:
使用for循环进行遍历
isinstance(obj,cls)
Iterator(迭代器)
iter()可以完成转换
# 判断列表、元组...是否具备可迭代性,还可以使用isinstance(目标对象,Iterable) from collections import Iterable print(isinstance([],Iterable)) print(isinstance((),Iterable)) print(isinstance("",Iterable)) print(isinstance({},Iterable)) def test(): print('1') yield None g = test() # print(isinstance(test(),Iterable)) next(g) next(test()) # 'list' object is not an iterator 列表不是迭代器 # next([1,2,3]) # 引入迭代器 # iter()函数,可以让[],{}等,转换成对应的迭代器 from collections import Iterator # 查看iter([])是否为迭代器 print(isinstance(iter([]),Iterator)) # 查看iter([])的类型 print(type(iter([]))) print(isinstance({},Iterator)) print(isinstance(iter({}),Iterator)) print(type(iter({}))) print(isinstance((),Iterator)) print(isinstance("",Iterator)) print(isinstance(g,Iterator)) print(isinstance(test(),Iterator))
二、闭包
1.构成的条件
1.函数嵌套定义
def funcout(num1)
def funin(num2)
#2. 内部函数使用外部的函数的变量
result = num1 + num2
# 3.外部函数的返回值为内部函数名
return funin
def funcount(num1): print("funcout start") def funin(num2): print("funcin start") result = num1 + num2 print("funcin end") return result print("funcout end") return funin # funcin1 存储的是函数funin的地址 funcin1 = funcount(100) print(type(funcin1)) # 调用内部函数 result1 = funcin1(200) print(result1)
resunt2 = funcin1(1)
print(resunt2)
2.闭包练习:
需求:求两个点之间的距离
x1,y1
x2,y2
import math
from math import *
(x2-x1)**2 + (y2-y1)**2
求a的n次幂
pow(a,n)
求x的平方根
sqrt(x)
#from math import pow,sqrt from math import * # 封装函数,完成求两个点之间的距离 def getdistance(x1,y1,x2,y2): dis = sqrt( pow((x2-x1),2)+pow((y2-y1),2)) return dis print(getdistance(0,0,10,10)) print(getdistance(0,0,20,20)) # 使用闭包求两个点之间的距离 def getdisout(x1,y1): def getdisin(x2,y2): return sqrt( pow((x2-x1),2)+pow((y2-y1),2)) return getdisin # 得到指向内部函数的闭包 funcdis = getdisout(0,0) # 调用闭包得到点(10,10) 距原点(0,0)的距离 print(funcdis(10,10)) print(funcdis(20,20))
3.
装饰器:本质闭包
v1.0
def func1()
print('完成功能1')
def func2()
print('完成功能2')
def func3()
print('完成功能3')
v2.0
需求:使用3个功能之前,分别添加权限验证
def func1()
print('权限验证')
print('完成功能1')
def func2()
print('权限验证')
print('完成功能2')
def func3()
print('权限验证')
print('完成功能3')
# v3.0 使用闭包进行解决 def verification(): print("个人信息访问") print("权限验证") # 使用闭包实现 def funcout(func): print("out start") def funcin(): # 调用权限验证 verification() # 掉的方法为谁?取决于参数给的谁 func() print("out end") return funcin @funcout def func1(): print("使用功能1") # func2 = funcout(func2) @funcout def func2(): print("使用功能2") @funcout def func3(): print("使用功能3") # 封装方法,抽离出验证 # 特殊:将函数引用(函数名)做参数,来完成的闭包 # func1 = funcout(func1) # func1() func1() func2() func3()
4.多个修饰器
@funcout1
@funcout2
def test()
return " "
def funcout1(func): print("开始装饰1") def funcin(): return "《"+func()+"》" return funcin # 添加*的闭包 def funcout2(func): print("开始装饰2") def funcin(): return "*"+func()+"*" return funcin # 《 xxx 》 # getBookName = funcout(getBookName) @funcout2 @funcout1 def getBookName(): # return "105个男人与3个女人的故事" return "水浒传" print(getBookName()
5.对有参数的函数进行装饰
固定个数的参数
def funcout(func): def funcin(x,y): print("funin start") func(x,y) print("funin end") return funcin @funcout def test(a,b): print("a = %d,b = %d"%(a,b)) test(1,2)
不固定个数的参数
def funcout(func): # *args:表示 0,1,2,3列表都好用,**kwargs: a=1,b=2 def funcin(*args,**kwargs): print("funcin start") func(*args,**kwargs) print("funcin end") return funcin @funcout def test(a,b,c): print("a=%d,b=%d,c=%d"%(a,b,c)) # test(1,2,3) @funcout def test1(a,b): print("a=%d,b=%d" % (a, b)) test1(1,2)