1、迭代器閉包
能用next()函數進行迭代的對象,能夠被稱爲迭代器函數
1.迭代:spa
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))
2、閉包code
1.構成的條件對象
1.函數嵌套定義blog
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.閉包練習: ci
需求:求兩個點之間的距離
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.get
裝飾器:本質閉包
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.多個修飾器generator
@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.對有參數的函數進行裝飾it
固定個數的參數
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)