標籤:rabl *args cat 使用外部 特殊 count int 閉包、裝飾器 產生器
一、迭代器
能用next()函數進行迭代的對象,可以被稱為迭代器
1.迭代:
Iterable(可迭代的)
list、tuple、dic、generator、str、包含yield關鍵字的func
迭代:
使用for迴圈進行遍曆
isinstance(obj,cls)
Iterator(迭代器)
iter()可以完成轉換
# 判斷列表、元組...是否具備可迭代性,還可以使用isinstance(目標對象,Iterable)from collections import Iterableprint(isinstance([],Iterable))print(isinstance((),Iterable))print(isinstance("",Iterable))print(isinstance({},Iterable))def test(): print(‘1‘) yield Noneg = 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,sqrtfrom math import *# 封裝函數,完成求兩個點之間的距離def getdistance(x1,y1,x2,y2): dis = sqrt( pow((x2-x1),2)+pow((y2-y1),2)) return disprint(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@funcoutdef func1(): print("使用功能1")# func2 = funcout(func2)@funcoutdef func2(): print("使用功能2")@funcoutdef 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@funcout1def 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@funcoutdef 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@funcoutdef test(a,b,c): print("a=%d,b=%d,c=%d"%(a,b,c))# test(1,2,3)@funcoutdef test1(a,b): print("a=%d,b=%d" % (a, b))test1(1,2)
Python核心2(迭代器、閉包、裝飾器、產生器)