總結day7 ---- 函式的內容 ,初識,返回值,進階(一)
內容大綱:
一: 函式識別
二: 函式的結構
三: 函式的返回值,
四: 函式的引數
五: 動態引數
六: 形參的順序
七: 名稱空間
八: 作用域
九: 載入順序和取值順序
十: 內建函式
十一: 關鍵字使用,global ,nonlocal
十二: 函式的巢狀初識
一:函式的初識別
函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。函式能提高應用的模組性,和程式碼的重複利用率。你已經知道Python提供了許多內建函式,比如print(),len()等。但你也可以自己建立函式,這被叫做使用者自定義函式。
二:函式的結構
#函式定義 def mylen(): """計算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函式呼叫 mylen()
上面就是咱們寫了一個函式,並且成功的呼叫了它。
定義:def 關鍵詞開頭,空格之後接函式名稱和圓括號(),最後還有一個":"。 def 是固定的,不能變,他就是定義函式的關鍵字。 空格 為了將def關鍵字和函式名分開,必須空(四聲),當然你可以空2格、3格或者你想空多少都行,但正常人還是空1格。 函式名:函式名只能包含字串、下劃線和數字且不能以數字開頭。雖然函式名可以隨便起,但我們給函式起名字還是要儘量簡短,並能表達函式功能 括號:是必須加的,先別問為啥要有括號,總之加上括號就對了! 註釋:每一個函式都應該對功能和引數進行相應的說明,應該寫在函式下面第一行。以增強程式碼的可讀性。 呼叫:就是 函式名() 要記得加上括號。
三:函式的返回值
咱們用len()方法時,得到的結果會賦值給一個變數,然後得到結果:
str_len = len('hello,world') print(str_len)
但是咱們寫的這個函式,並不會得到這樣的結果,如何讓他和len函式一樣,有返回值呢?
那就是在函式的最後加上一個return,return 後面寫你需要的返回值就可以了。
return返回值
下面咱們重點研究return關鍵字的作用:
return關鍵字的作用
return 是一個關鍵字,這個詞翻譯過來就是“返回”,所以我們管寫在return後面的值叫“返回值”。
要研究返回值,我們還要知道返回值有幾種情況:分別是沒有返回值、返回一個值、返回多個值
沒有返回值
不寫return的情況下,會預設返回一個None:我們寫的第一個函式,就沒有寫return,這就是沒有返回值的一種情況。
沒有return
只寫return,後面不寫其他內容,也會返回None,有的同學會奇怪,既然沒有要返回的值,完全可以不寫return,為什麼還要寫個return呢?這裡我們要說一下return的其他用法,就是一旦遇到return,結束整個函式。
只寫return
return None:和上面情況一樣,我們一般不這麼寫。
返回一個值
剛剛我們已經寫過一個返回一個值的情況,只需在return後面寫上要返回的內容即可。
return返回一個值
返回多個值
可以返回任意多個、任意資料型別的值
return返回多個值
返回的多個值會被組織成元組被返回,也可以用多個值來接收
多個值接收
小結:
return 只有兩個作用:
1,結束整個函式。
2,給函式的執行者(呼叫者)返回值。
四:函式的引數:
>1 形參:
>>1:位置引數:按照位置引數, 與實參角度的位置重左至右,一一對應.
>>2:預設引數:給形參一個預設值,通常是比較常用的數值,但是可以改變,#注意形參一定要在位置的最後面.
預設引數陷阱:
1 def func1 (a,l=[]): 2 l.append(a) 3 return l 4 print(func1(22)) 5 print(func1(66)) 6 print(func1(33)) 7 print(func1(44,[])) 8 >>>> 9 [22] 10 [22, 66] 11 [22, 66, 33] 12 [44]
>>3:萬能引數*arg, **kwarg
可以接受所有的位置引數,關鍵字引數,
可以接受字典
>2 實參: :
>>1位置引數:必須與形參一直,從左至右一一對應.
>>2 關鍵字引數:一一對應即可,不需要對應位置
>>3 混合引數:兩個同時存在
>>4 三元運算
>>>1
if 2 >1: print('ok') else: print('no') print('ok') if 2>1 else print('no')
以上兩個式子相等
A1 if 條件 else A2
五:動態引數
def fun(*args,**kwargs): print(args) print(kwargs) fun(1,2,3,4,'231','1123',[123],sex='nan') fun({'name':23,'age':'hehe'},eat='chi') >>> (1, 2, 3, 4, '231', '1123', [123]) {'sex': 'nan'} ({'name': 23, 'age': 'hehe'},) {'eat': 'chi'}
>*arg , **kwarg的魔性用法
>>
# * 的魔性用法。
# 在函式的定義時,* ** 代表聚合。
# 函式的執行(呼叫)時,* ** 代表打散。
def fun(*args,**kwargs): print(args) print(kwargs) fun(*(1,2,3),*['a','b','c'],**{'name':'wangzi'},**{'age':36}) # 寫一個函式:可以傳多個列表,把列表裡面的所有元素一個一個的新增到args裡面。 def func(*args, **kwargs): # 在函式的定義時,* 代表聚合。 print(args) #(1,2,3,4,5,6,1,2,3) func(*[1,2,3],*(1,2,3),*'fdsaf') # 函式的執行(呼叫)時,* 打散。
六:形參的順序問題
# 位置引數> *args> 預設引數> **kwargs
七:名稱空間
# 全域性名稱空間:存放的是py檔案中變數與值的對應關係
# 區域性名稱空間:臨時存放的是函式體裡面的變數與值的對應關係。
# 內建名稱空間:內建函式,關鍵字等等。 print() input()
八:作用域
# 作用域:
# 全域性作用域:內建名稱空間,全域性名稱空間
# 區域性作用域:區域性名稱空間
九:順序問題
# 載入順序:載入到記憶體的順序
# 內建名稱空間 ---> 全域性名稱空間 ---> (當函式執行時)區域性名稱空間
# 取值順序(就近原則)
# LEGB 原則
# 區域性名稱空間 ---> 全域性名稱空間 ---> 內建名稱空間
十:內建函式
# print(globals()) # 返回一個字典:包含全域性作用域所有的內容
# print(locals()) # 返回一個字典:當前作用域的所有內容
十一:關鍵字的使用
# 關鍵字:global nonlocal
# global : 可以區域性宣告一個全域性變數
# age = 46
# name = 'xxx'
# def func():
# global name
# name = 'alex'
# name = 'barry'
# func()
# print(name)
# 區域性作用域不能對全域性作用域的變數進行修改,只能引用。
count = 1
def func():
global count
count += 1
func()
print(count)
# 總結:
# global :
# 可以區域性作用域宣告一個全域性變數
# 區域性作用域不能對全域性作用域的變數進行修改,只能引用,通過設定global可以修改。
# nonlocal : 只在python3x中 存在。
# 1,不能操控全域性變數。
# name = 'alex'
# def func():
# nonlocal name
# print(name)
# func()
# 內層函式不能對外層函式的變數進行修改,只能引用。
# 在區域性作用域中,對父級作用域(或者更外層作用域非全域性作用域)的變數進行引用和修改,
# 並且引用的哪層,從那層及以下此變數全部發生改變。
def wrapper(): name = 'alex' def inner(): nonlocal name #加上之後可以引用函式父級的變數 name += 'b' # print(name) print('1', name) inner() print('2', name) wrapper()
>>>>>
1 alex
2 alexb
十二: 函式的巢狀初識
def func1(): print(1) def inner(): print(2) def inner2(): print(3) print(4) inner() print(5) func1()
>>>>
1
4
2
5