'''''' ''' 一、函數 1、函數定義 對功能或者動作的封裝 在類中定義,就是方法 在類之外定義,就是函數 2、函數寫法 1、定義或者申明函數 def 函數名(形參列表): 函數體(return) 2、調用函數 函數名(實參) 3、函數名 1、定義 是一個變數的名字(函數名也屬於變數) 2、用... ...
'''''' ''' 一、函數 1、函數定義 對功能或者動作的封裝 在類中定義,就是方法 在類之外定義,就是函數 2、函數寫法 1、定義或者申明函數 def 函數名(形參列表): 函數體(return) 2、調用函數 函數名(實參) 3、函數名 1、定義 是一個變數的名字(函數名也屬於變數) 2、用途 1、可以進行賦值。 2、可以作為參數,可以作為返回值。 3、可以作為集合類的元素。 集合類是狹義-集合數據類型set?還是廣義list、tuple、set? 4、參數 1、形參 1、定義 在函數聲明的位置定義的變數 2、分類 1、位置參數--最常見 2、預設值參數 3、動態參數 1、 *args 動態接收多個位置參數 2、**kwargs 動態接收多個關鍵字參數 3、* **在形參位置,表示聚合 * **在實參位置,表示打散 *列表 **字典 *li1 **dic1 3、參數順序 位置參數 *args 預設值參數 **kwargs 4、無敵參數 1、定義 可以接收任何類型或者數量的參數 2、寫法 def func(*args,**kwargs): pass 2、實參 1、定義 在函數調用的時候,給函數傳遞的具體值 2、分類 1、位置參數 2、關鍵字參數 3、混合參數 3、傳參 定義 把實參賦值(傳遞)給形參的過程 5、名稱空間-命名空間 分類 1、內置名稱空間 比如:print 2、全局名稱空間 3、局部名稱空間 6、作用域 分類 1、全局作用域 包含:內置名稱空間和全局名稱空間 2、局部作用域--函數內 globals()和locals()函數的區別 1、前者查看全局作用域中的內容 2、後者查看當前作用域中的內容 global和nonlocal關鍵字的區別 1、前者在局部引入全局變數,創建全局變數 2、後者,在局部引用離它最近的上一級變數 7、函數嵌套和閉包 1、嵌套 寫法: def func(): def inner(): pass return inner #返回內層函數的函數名 2、閉包 1、概念-定義 內層函數用到了外層函數的變數 2、寫法 def func(): a = 10 def inner(): return a #內層函數用到了外層函數的變數 return inner #返回內層函數的函數名 3、作用 1、保護變數不被修改 原因:內層函數用的的外層函數的變數,這個變數是外層函數內,所以不能直接修改 2、變數常駐記憶體 原因:外層函數定義的變數,內層函數可能會隨時用到 如果不是常駐記憶體,一旦內層函數調用就會報錯(類似緩存的機制) 二、迭代器 1、iterable-可迭代對象 定義:在該對象的方法中包含了__iter__ 2、iterator-迭代器 定義:訪問對象的__iter__()方法,就可以得到該對象的迭代器 3、特點 1、節省記憶體 2、惰性機制(一步一步next) 3、只能向前不能退後 4、用迭代器寫for迴圈的實現過程 li4 = [3,4] it4 = iter(li4) while 1: try: ret4 = next(it4) print(ret4) except StopIteration as e: print('沒有值可以取了',e) break #跳出整個迴圈 三、生成器 1、概念 本質是迭代器 2、創建方式-3種 1、生成器函數 2、生成器表達式 3、類型轉換-range 3、生成器函數 1、概念 函數體中包含yield的函數就是生成器函數 2、寫法 def func(): yield xxx func() #調用生成器函數,函數沒有被執行,而是產生了生成器generator 例子: def func(li): #1 定義生成器函數 for i in li: yield i li1 = ['jack', 'tom', 'bob'] gen1 = func(li1) #把iterable轉成生成器 # print(next(gen1)) #jack 生成器的取值(單次取值) next() __next__() for i in gen1: print(i) 3、yield關鍵字 1、和return一樣 表示返回 2、yield可以分段執行 4、生成器的使用 1、__next__()或者next() 每次調用上述方法,可以執行到寫一個yield 2、send() 可以給上一個yield進行傳值 5、yield from 把iterable-可迭代對象轉換成生成器 def func3(li): yield from li #實現把iterable轉換成generator li1 = [1,2,3] gen3 = func3(li1) #把iterable轉換成生成器-generator print(gen3) #<generator object func3 at 0x000000E53FF24CC8> for i in gen3: print(i) 4、生成器表達式 寫法: 生成器表達式格式 (結果 for迴圈) 例子: gen = (i for i in range(10)) 5、產生生成器genarator的兩種方式 1、生成器函數 函數體包含yield的函數就是生成器函數 2、生成器表達式 (結果 for迴圈) gen = (i for i in range(10)) 註意: 1、列表推導式 [] 2、字典推導式 {} 3、生成器表達式 () 沒有-元組推導式 6、特點 1、生成器在記憶體中記錄的是代碼,而沒有執行 2、生成器取值 1、單個取值: next()或者__next__() 2、迴圈取值: for迴圈 類比: 生成器:母雞 生成器取值:下蛋 '''