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

來源:互聯網
上載者:User

標籤: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(迭代器、閉包、裝飾器、產生器)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.