函數名的運用

來源:互聯網
上載者:User

標籤:import   ast   stop   orm   傳遞   print   ace   迭代   hash   

函數名的運用:1.函數名的記憶體位址
def func():    print(‘呵呵‘)print(func)結果:<function func at 0x0000000001D51E18>
2.函數名可以賦值給其他變數
def func():    print(‘呵呵‘)print(func)a = func  # 把函數當成一個變數賦值給另一個變數a()  # 函數調用
3.函數名可以當做容器類的元素
def func():    print(‘呵呵‘)def func():     print(‘呵呵‘)def func():    print(‘呵呵‘)def func():     print(‘呵呵‘)     lst = [func1,func2,func3]for i in lst:i()
4.函數名可以當做函數的參數
def func():    print(‘吃了嗎‘)def func(fn):    print(‘我是func2‘)    fn()   # 執行傳遞過來的fn    print(‘我是func2‘)func2(func)
5.函數名可以作為函數的傳回值
def func():    print(‘這裡是函數1‘)    def func():        print(‘這裡是函數2‘)     print(‘這裡是函數1‘)     return func_2fn = func_1()  # 執行函數1,函數1返回的是函數2,這是fn指向的就是上面的函數2fn()  # 執行上面的函數
.閉包

閉包:是內層函數,對外層函數(非全域)的變數的引用

def func1():    name = ‘alex‘    def func2():        print(name)    func2()func1()結果:alex

我們可以使用__closuer__來檢測函數是否是閉包。使用函名.__closuer__返回cell就是閉包,返回None就不是閉包。

def func1():    name = ‘alex‘    def func2():    print(name) func2() print(func2.__closuer__)   結果:alex(<cell at 0x0000000002178588: str object at 0x00000000024F9308>,)

如何在函數內外調用內建函式

def outer():    name = ‘alex‘    # 內建函式    def inner():        print(name)    return inner fn  = outer()  # 訪問外部函數,擷取到內建函式的函數地址 fn()   # 訪問內建函式   結果: alex

多層嵌套

def func1():    def func2()        def func3()            print(‘嘿嘿‘)         return func3     return func2func()()()
.迭代器
s = ‘abc‘for c in s:    print(c)   #  對的     for i in 123:    print(i)   #  錯的    結果:Traceback (most recent call last):  File "E:/python s16/day11 閉包和迭代器/code/day011 迭代器和閉包/05  迭代器.py", line 111, in <module>    for i in 123:TypeError: ‘int‘ object is not iterable

報錯資訊中有這麼一句話:‘int‘ object is not iterable。整數是不可迭代對象。 iterable 表示可迭代的,表示可迭代協議。

如何判斷按資料類型是否符合可迭代協議,我們可以通過dir函數來查看類中定義好的所有方法。

s = ‘我的娃哈哈‘print(dir(s)) # 可以列印對象中的方法和函數print(dir(str)) # 也可以列印類中聲明的方法和函數

在列印結果中,尋找__iter__如果能找到,那這個類的對象就是一個可迭代對象。 迭代器.py"

[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘,  ‘__getitem__‘, ‘__getnewargs__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘,  ‘__init_subclass__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘,   ‘__mod__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ]

tuple,list,open,set,dict,進行for 迴圈的內容都有__iter__函數,包括range。 這是查看一個對象是否可迭代對象的第一種辦法,我們還可以通過isinstence()函數來查看一個對象是什麼類型的。

l = [1,2,3,]l__iter = l,l.__iter__()form collections import Iterableform collections import Iterableprint(isinstence(l,Iterable))  # Trueprint(isinstence(l,Iterator))  # Falseprint(isinstence(l__iter__,Iterabtor))  # Trueprint(isinstence(l__iter__,Iterable))   # True

通過以上代碼,我們可以確定,如果對象中有__iter__函數,那我們可以認為這個對象遵守了可迭代協議。 就可以擷取到相應的的迭代器。這裡的__iter__是來協助我們擷取對象的迭代器,我們可以使用迭代器中的__next__() 來擷取到迭代器中的元素。

s = ‘我愛北京天安門‘c = s.__iter__()   #  擷取迭代器print(‘c.__next__()‘)  # 使用迭代器進行迭代,擷取一個元素   我print(‘c.__next__()‘)  # 愛print(‘c.__next__()‘)  # 北print(‘c.__next__()‘)  # 京print(‘c.__next__()‘)  # 天print(‘c.__next__()‘)  # 安print(‘c.__next__()‘)  # 門print(‘c.__next__()‘)  # StopIteration

for迴圈的機制:

for i in [1,2,3,]:    print(i)

使用while迴圈+迭代器來類比for迴圈(必須掌握)

lat = [1,2,3,]lst__iter = lst.__iter__()  while True:    try;        i = lst__iter__.__nexy__()        print(i)    except StopIteration:        break
.總結:
lterable:可迭代對象,內不包含函數__iter__()函數lterator:迭代器,內部包括含__tier__()同時包含__next__().迭代器的特點:    1.節省記憶體    2.惰性機制    3.不能反覆,只能向下執行

函數名的運用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.