Python核心2(迭代器、閉包、裝飾器、生成器)

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)
相關文章
相關標籤/搜索