函數名的運用,裝飾器語法糖的運用

函數名的做用:函數也是第一類對象

  1.函數名就是函數的內存地址閉包

  2.函數名能夠做爲變量函數

  3.函數名能夠做爲函數的參數ui

  4.函數名還能夠當作函數的返回值spa

  5.函數名能夠做爲容器類型的元素(列表中的一個元素)3d

globals()    locals()

  globals()   #做用是  返回全局變量的一個字典code

  locals() # 返回當前位置的局部變量的字典對象

def func1():
    a =1
    b = 2
    print(globals())
    print(locals())    #{'b': 2, 'a': 1}
func1()
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__':
<_frozen_importlib_external.SourceFileLoader object at 0x0000026005C0D240>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__':
'G:/騎士計劃/2018-8-17/8-17草稿.py', '__cached__': None, 'lis': [1, 2, 3, 4], 'func1': <function func1 at 0x0000026005BB2EA0>}
#{'b': 2, 'a': 1}

閉包:即在函數內部,內層函數對外層函數的變量(非全局變量)的引用,並返回這樣就造成了一個閉包

  判斷這個函數是否造成了閉包,用    函數名.__closure__       來進行判斷blog

def wraaper():
    name = 'alex'
    def inner():
        print(name)
    print(inner.__closure__)    #輸出結果不是None,就說明造成了閉包
    inner()
    return inner
wraaper()
輸出結果#(<cell at 0x00000254669A85B8: str object at 0x0000025466A39110>,)
alex    
a = "alex"
def func1(b):
    # a = "alex"    #即至關於在函數內部定義了一個變量a = "alex」
    def func2():
        print(b)
    print(func2.__closure__)
    func2()
func1(a)  #運行時將外部的變量a加載到函數內
#輸出結果爲(<cell at 0x0000025E4A4285B8: str object at 0x0000025E4A4B9110>,)
alex
#因此這種狀況是一個閉包

  閉包的做用:當程序運行時,遇到函數執行,他就會在內存中開闢一個空間,(局部名稱空間),若是這個函數內部造成了閉包。那麼他就不會隨着函數的結束而消失。

可迭代對象  迭代器

  可迭代對象定義:對象內部含有__iter__方法的就是可迭代對象。(str,list,dict,tuple,tange())內存

          而當可迭代對象簽定了可迭代協議就造成了迭代器it

  迭代器定義:內部含有__iter__和__next__的方法就是迭代器。即存在__next__的方法就是迭代器

  可迭代對象與迭代器的區別:

  1.可迭代對象不能直接取值,而迭代器能夠直接取值

  2.迭代器很是節省內存,

  3.迭代器每次只能去一個值

  4,迭代器是單向的,一直到底

判斷一個對象是不是可迭代對象的方法:

  1.判斷__iter__是否在這個對象裏

lis = [1,2,3]
print("__iter__" in dir(lis))    #返回結果爲True則說明該對象是可迭代對象

  dir()  顯示出你這個參數的全部方法,裝在一個列表裏

  2.from collections import Iterable     在 文件(colletions) 導入 這個  可迭代的(Iterable)

   from collections import Iterator   在文件(colletions)導入  這個    迭代器( Iterator)  (自我理解,非專業術語)

from collections import Iterable
from collections import Iterator

print(isinstance('alex',Iterable))  # True 
print(isinstance('alex',Iterator))  # False    是不是迭代器
#isinstance() 判斷類型,即「alex」是否是可迭代對象    (自我解釋,非專業)

可迭代對象轉換成迭代器的方法

  1.lis.__iter__()

  2.iter(lis)

# lis = [1, 2, 3]  # 可迭代對象
# # ite1 = lis.__iter__()  # 迭代器  <list_iterator object at 0x0000027A183BFFD0>
# ite1 = iter(lis)  # 迭代器  <list_iterator object at 0x0000027A183BFFD0>
# print(ite1)

迭代器取值:next(),或者 對象.__next__()

lis = [1,2,3]
l1 = lis.__iter__()
print(l1)
print(l1.__next__())    #1
print(next(l1))        #2

例題,用while循環模擬出for循環的過程(瞭解,)

# iter1 = s1.__iter__()
#
# while 1:
#     try:  
#         print(iter1.__next__())
#     except StopIteration: # StopIteration報錯緣由
#         break  #遇到抱歉就結束循環
先了解。

 裝飾器語法糖

至關於

相關文章
相關標籤/搜索