python學習day9 day10 函式 閉包

2022-06-19 21:09:13 字數 3627 閱讀 8130

實參:呼叫時的引數

形參:定義函式內的引數

引數:位置引數、關鍵字引數、動態引數:位置引數包裹、關鍵字引數包裹

定義函式必須先定義位置,然後是預設引數

順序非常重要:位置引數,*args,關鍵字引數,**kwargs

這要是這種順序,沒了誰都可以

動態引數:可以接收任意個數的引數

*args  接收的是按位置傳參的值,組成乙個元組

**kwargs  接收的是按關鍵字傳參的值,組成乙個字典

動態引數的另一種傳參方式:

def func(*args):#站在形參的角度上,給變數加上*,就是組合所有傳來的值。

print(args)

func(1,2,3,4,5)

l = [1,2,3,4,5]

func(*l) #站在實參的角度上,給乙個序列加上*,就是將這個序列按照順序打散

def func(**kwargs):

print(kwargs)

func(a=1,b=2)

d = #定義乙個字典d

func(**d) #給字典打散

乙個陷阱:

預設引數的值是乙個可變資料型別,那麼每一次呼叫函式的時候,如果不傳值的話就公用這個資料型別的資源

def fan(lis = ):

print(lis)

fan() #[1]

fan() #[1,1]

fan() #[1,1,1]

函式的注釋:

def func():

'''這個函式實現了什麼功能

引數1:

引數2:

:return: 是字串或者列表的長度

'''pass

函式的命名空間

內建命名空間 —— python直譯器

就是python直譯器一啟動就可以使用的名字儲存在內建命名空間中

內建的名字在啟動直譯器的時候被載入進記憶體裡

全域性命名空間 —— 我們寫的**但不是函式中的**

是在程式從上到下被執行的過程中依次載入進記憶體的

放置了我們設定的所有變數名和函式名

區域性命名空間 —— 函式

就是函式內部定義的名字

當呼叫函式的時候 才會產生這個命名空間 隨著函式執行的結束 這個命名空間就又消失了

在區域性:可以使用全域性、內建命名空間中的名字

在全域性:可以使用內建命名空間中的名字,但是不能用區域性中使用

在內建:不能使用區域性和全域性的名字的

內建》全域性》區域性

func  --> 不加括號的話,指的是函式的記憶體位址

函式名()--> 加括號,函式的呼叫

函式的記憶體位址()= 函式的呼叫

全域性作用域 —— 作用在全域性 ——內建和全域性名字空間中的名字都屬於全域性作用域  ——globals()

區域性作用域 —— 作用在區域性 —— 函式(區域性名字空間中的名字屬於區域性作用域) ——locals()

# 對於不可變資料型別 在區域性可是檢視全域性作用域中的變數

# 但是不能直接修改

# 如果想要修改,需要在程式的一開始新增global宣告

# 如果在乙個區域性(函式)內宣告了乙個global變數,那麼這個變數在區域性的所有操作將對全域性的變數有效

a = 1

def func():

global a #引入全域性變數a 可以影響它 如果不引用global,只能引用外部變數,不能修改

a = 2

func()

print(a) #2

globals 永遠列印全域性的名字

locals 輸出什麼 根據locals所在的位置

a = 1

b = 2

def func():

x = 'aaa'

y = 'bbb'

print(locals()) #只列印函式裡的區域性變數

print(globals()) #列印全域性和內建變數

func()

print(globals())

print(locals()) #列印此位置的變數,兩者列印的一樣

函式的巢狀定義:

def outer():

a = 1

def inner():

print('peipei')

outer() #什麼都不輸出

nonlocal

nonlocal 只能用於區域性變數 找上層中離當前函式最近一層的區域性變數

宣告了nonlocal的內部函式的變數修改會影響到 離當前函式最近一層的區域性變數

對全域性無效

對區域性 也只是對 最近的 一層 有影響

a = 1

def outer():

a = 1

def inner():

a = 2

def inner2():

nonlocal a #宣告了乙個上面第一層區域性變數

a += 1 #不可變資料型別的修改

inner2()

print('##a## : ', a)

inner()

print('**a** : ',a)

outer()

print('全域性 :',a)

函式名可以賦值

函式名可以作為容器型別的元素:

l = [func1,func2]

函式名可以作為函式的引數和返回值:

def func():

print(123)

def wahaha(f):

f()

wahaha(func) # 123

函式就是第一類物件:

第一類物件(first-class object)指

1.可在執行期建立

2.可用作函式引數或返回值

3.可存入變數的實體。

閉包

1.巢狀函式   2.且內部函式呼叫外部函式的變數

def outer():

a = 1

def inner():

print(a)

inner()

print(inner.__closure__) #檢視是否是閉包函式 會輸出() 只要有cell 就說明是閉包

使用閉包的好處就是省略了外部變數的占用 

每次呼叫內部函式的時可以不用呼叫外部變數

應用:

from urllib.request import urlopen

return get #閉包

get_func = get_url() # 將get_url的返回值賦值給get_func

get_func() #以後只呼叫這個就是呼叫內部的函式

python學習day9 day10 函式 閉包

實參 呼叫時的引數 形參 定義函式內的引數 引數 位置引數 關鍵字引數 動態引數 位置引數包裹 關鍵字引數包裹 定義函式必須先定義位置,然後是預設引數 順序非常重要 位置引數,args,關鍵字引數,kwargs 這要是這種順序,沒了誰都可以 動態引數 可以接收任意個數的引數 args 接收的是按位置...

python學習筆記day9 函式

函式 定義之後可以任何需要他的地方呼叫這個函式 如果函式沒有定義返回值,使用者去取函式的返回值的話,預設返回none 1.返回值的三種情況 1.1 沒有返回值 1.1.1 沒寫return def func print s s 今天天氣好 func 1.1.2 只寫return,後面沒有數值,ret...

python學習 day9內建函式(高階)

以下內容僅供自己學習使用,侵刪 usr bin env python coding utf 8 高階函式 reversed 可迭代物件 反轉 filter 過濾規則的函式,可迭代物件 過濾 map 對映要執行的函式,可迭代物件,可迭代物件,可迭代物件 對映 sorted 可迭代物件,key 排序規則...