標籤:odi 混合 ret 傳參 代碼 預設參數 put == 種類
1.初始函數
在沒有函數之前,我們是怎麼實現一段代碼的呢?我們之前學了len()方法,可以求出一個列表的長度,假如現在沒有len()方法,那我們要自己寫一個類似功能的代碼來實現求一個列表的長度。
代碼如下:
list = [1,2,3,‘hello‘,‘abc‘]
count = 0
for i in list:
count +=1
print (count)
這段代碼實現了len()的功能,但是如果一個程式裡有n多需要測試長度的地方,我們需要黏貼n遍這樣的代碼,所以這樣的操作有什麼缺點呢?
1. 重複代碼多
2.可讀性差
2. 建立函數
我們通過定義一個函數,就能解決以上兩個問題。
s1 = ‘hello world!!!!‘
def my_len():
count = 0
for i in s1:
count += 1
# print(count)
my_len()
2.1 函數的文法格式:
def 函數名(參數1,參數2,參數3,...): ‘‘‘注釋‘‘‘ 函數體 return 返回的值注意:函數名要能表達出這個函數的作用和意義
2.2 如何運行一個函數
函數名加上括弧()調用一個函數,就是執行函數
my_len()
2.3 函數運行遵循的原則
原則:先定義,再調用
- 函數名,就是一個變數名
- 變數必須先定義後引用,所以如果沒有定義函數,而直接去引用這個函數,就相當於在引用一個不存在的變數名
- 函數體內,不要用print()方法,用return傳回值代替,目的是讓函數完成最小的功能,不讓函數做額外的操作
2.4 函數的傳回值return
作用1:傳回值的作用:函數執行時,當遇到傳回值return是就結束函數
代碼:
def func1():
print(11)
print(22)
return
print(333)
print(444)
func1()
作用2:傳回值會返回給給函數的調用者(執行者)
- 函數體內的代碼部分可以不寫return,則傳回值預設是None
- 傳回值寫成return None,則傳回值是None
- return 後接單個值
- return 後接多個值,多個值會放在一個元組中返回給函數的調用者
舉例:return 後接單個值
def my_len():
count = 0
for i in s1:
count += 1
return 666
print(my_len(),type(my_len()))
舉例:return 後接多個值
def my_len():
count = 0
for i in s1:
count += 1
return 666,222,count,‘中國‘
print(my_len(),type(my_len()))
舉例:return 後接多個值,且賦值給多個變數
def my_len():
count = 0
for i in s1:
count += 1
return 666,222,count
ret1,ret2,ret3 = my_len() # (666, 222, 19,)
print(ret1)
print(ret2)
print(ret3)
3. 函數的參數
定義函數時的括弧就是放置函數參數的地方,這時的參數叫形式參數,簡稱形參,例如:def my_len(a,b) #括弧中是定義參數的地方
如果定義函數時有形參,調用函數時括弧裡面也要寫參數,這是的參數叫實際參數,簡稱實參,例如:my_len (1,2) #括弧裡面的實參,就是實際的數
3.1 實參的種類
- 位置參數
要求:必須按順序傳參,必須一一對應
舉例:
def func1(x,y):
print(x,y)
func1(1, 2)
- 關鍵字參數
要求:不分順序,必須一一對應
舉例:
def func1(x,y,z):
print(x,y,z)
func1(y=2,x=1,z=5,)
- 混合參數(位置參數+關鍵字參數)
要求:關鍵字參數必須在位置參數後面,必須一一對應
舉例:
def func2(argv1,argv2,argv3):
print(argv1)
print(argv2)
print(argv3)
func2(1,2,argv3=4)
3.2 形參的種類
- 位置參數
要求:必須按順序傳參,必須一一對應
舉例:
def func1(x,y):
print(x,y)
func1(1,2)
- 預設參數
要求:必須放在位置參數後面
注意:如果有一個形參有預設參數,實參在傳參時可以不傳,函數運行時會自動識別預設參數的值。
如果實參對於形參的預設參數傳遞了新值,那麼新值會覆蓋了預設參數的值
舉例:統計姓名
def register(name,sex=‘男‘):
with open(‘register‘,encoding=‘utf-8‘,mode=‘a‘) as f1:
f1.write(‘{} {}\n‘.format(name,sex))
while True:
username = input(‘請輸入姓名:/q 或者 Q 退出‘) #傳參時可以不傳sex
if username.upper() == ‘Q‘:break
if ‘a‘ in username:
sex = input(‘請輸入性別:‘) #程式運行中給sex參數重新賦值
register(username,sex)
else:
register(username)
- 動態參數(萬能參數)
格式:
def my_len(*args, **kwargs)
作用:
在某種情況下,實參傳值的個數是不固定的,為了保證程式運行,形參需要能接收多餘的實參
形參中的*args,作用是接收實參角度的所有多餘的位置參數,並把它們放到一個元組中
形參中的**kwargs,作用是接收實參角度的所有多餘的關鍵字參數,並把它們放到一個字典中
舉例:
def func2(*args,**kwargs):
print(args) # 元組(所有位置參數)
print(kwargs) #字典(所有關鍵字參數)
func2(1,2,3,4,5,6,7,11,‘john‘,‘中國‘,a=‘ww‘,b=‘qq‘,c=‘222‘)
4. 參數的順序
- 位置參數-*args-預設參數
舉例:
def func3(a,b,*args,sex=‘男‘):
print(a)
print(b)
print(sex)
print(args)
func3(1,2,‘中國‘,‘tom‘,‘jerry‘,sex=‘女‘)
- 位置參數-*args-預設參數-**kwargs
舉例:
def func3(a,b,*args,sex=‘男‘,**kwargs):
print(a)
print(b)
print(sex)
print(args)
print(kwargs)
func3(1,2,‘中國‘,‘tom‘,‘jerry‘,name=‘jack‘,age=46)
5. 打散和彙總功能
- 實參位置: 加*或**是打撒功能
- 形參位置:加*或**是彙總功能
舉例:
def func1(*args,**kwargs): # 函數的定義 * 彙總。
print(args)
print(kwargs)
l1 = [1,2,3,4]
l11 = (1,2,3,4)
l2 = [‘tom‘,‘jack‘,4]
func1(*l1,*l2,*l11) # 函數的執行:* 打散功能。
Python學習之路-函數