Python函数之初体验
定義函數
在Python中,定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然后,在縮進塊中編寫函數體,函數的返回值用return語句返回。
我們先定義一個求字符串長度的函數(無參數、無return)為例:
1 #函數定義 2 def mylen(): 3 """計算s1的長度""" 4 s1 = "hello world" 5 length = 0 6 for i in s1: 7 length = length+1 8 print(length) 9 10 #函數調用 11 mylen()注釋:每一個函數都應該對功能和參數進行相應的說明,應該寫在函數下面第一行。以增強代碼的可讀性。
調用:就是?函數名()?要記得加上括號,好么好么好么。
?
函數的返回值:
一般在函數中都添加一行:return ***
1 #函數定義 2 def mylen(): 3 """計算s1的長度""" 4 s1 = "hello world" 5 length = 0 6 for i in s1: 7 length = length+1 8 return length 9 10 #函數調用 11 str_len = mylen() 12 print('str_len : %s'%str_len)簡單做一個形容:函數好比一個加工廠,參數(非必要)好比是原材料,return的值好比加工出來的產品。
共有三種情況:無產品輸出、一個產品、多個產品
1、沒有返回值:無return、return、return None
? ? 這三種情況都相當于return None即無返回值
? ? 常規寫法:函數末尾 直接return?
? ? 注意:return的其他用法,就是一旦遇到return,結束整個函數。但并不是一個函數只能有一個return這個語句。如下:
1 def test_return(x): 2 if x > 0: 3 return x 4 else: 5 return 0 1 def ret_demo(): 2 print(111) 3 return 4 print(222) 5 6 ret = ret_demo() 7 print(ret)# 試一下,看看最后print什么?是111 222都打印了么?
2、返回一個值?
只需在return后面寫上要返回的內容即可。
1 #函數定義 2 def mylen(): 3 """計算s1的長度""" 4 s1 = "hello world" 5 length = 0 6 for i in s1: 7 length = length+1 8 return length 9 10 #函數調用 11 str_len = mylen() 12 print('str_len : %s'%str_len)注意:return和返回值之間要有空格,可以返回任意數據類型的值
3、返回多個值
1 def ret_demo1(): 2 '''返回多個值''' 3 return 1,2,3,4 4 5 6 def ret_demo2(): 7 '''返回多個任意類型的值''' 8 return 1,['a','b'],3,4 9 10 ret1 = ret_demo1() 11 print(ret1) 12 ret2 = ret_demo2() 13 print(ret2)返回的多個值會被組織成元組被返回,也可以用多個值來接收
def ret_demo2():return 1,['a','b'],3,4#返回多個值,用一個變量接收 ret2 = ret_demo2() print(ret2)#返回多個值,用多個變量接收 a,b,c,d = ret_demo2() print(a,b,c,d)#用多個值接收返回值:返回幾個值,就用幾個變量接收 a,b,c,d = ret_demo2() print(a,b,c,d)函數的參數
先來一段代碼體驗一下:
#函數定義 def mylen(s1):"""計算s1的長度"""length = 0for i in s1:length = length+1return length#函數調用 str_len = mylen("hello world") print('str_len : %s'%str_len)我們告訴mylen函數要計算的字符串是誰,這個過程就叫做?傳遞參數,簡稱傳參,我們調用函數時傳遞的這個“hello world”和定義函數時的s1就是參數。
上面講過參數好比一個原材料,函數屬于加工廠。在加工之前需要將原材料傳遞到工廠,這個過程就相當于傳參的過程。
參數有兩種:形參、實參
我們調用函數時傳遞的這個“hello world”被稱為實際參數,因為這個是實際的要交給函數的內容,簡稱實參。
定義函數時的s1,只是一個變量的名字,被稱為形式參數,因為在定義函數的時候它只是一個形式,表示這里有一個參數,簡稱形參。
站在實參角度:
1、按照位置傳參
def mymax(x,y):#此時x=10,y=20the_max = x if x > y else yreturn the_maxma = mymax(10,20) print(ma)2.按照關鍵字傳值
def mymax(x,y):#此時x = 20,y = 10print(x,y)the_max = x if x > y else yreturn the_maxma = mymax(y = 10,x = 20) print(ma)3.位置、關鍵字形式混著用
def mymax(x,y):#此時x = 10,y = 20print(x,y)the_max = x if x > y else yreturn the_maxma = mymax(10,y = 20) print(ma)
正確用法
問題一:位置參數必須在關鍵字參數的前面
問題二:對于一個形參只能賦值一次
?
站在形參角度
位置參數
如果定義函數時填寫了位置參數,調用該函數時必須輸入相應的參數
1 def mymax(x,y): 2 #此時x = 10,y = 20 3 print(x,y) 4 the_max = x if x > y else y 5 return the_max 6 7 #調用mymax不傳遞參數 8 ma = mymax() 9 print(ma) 10 11 #結果 12 TypeError: mymax() missing 2 required positional arguments: 'x' and 'y'默認參數
為什么要有默認參數:將變化比較小的值設置成默認參數,降低調用函數的難度。
1.默認參數的定義
def stu_info(name,sex = "male"):"""打印學生信息函數,由于班中大部分學生都是男生,所以設置默認參數sex的默認值為'male'"""print(name,sex)stu_info('alex') stu_info('eva','female')2.參數陷阱:默認參數是一個可變數據類型
默認參數很有用,但使用不當,也會掉坑里。默認參數有個最大的坑,演示如下:
先定義一個函數,傳入一個list,添加一個END再返回:
def add_end(L=[]):L.append('END')return L當你正常調用時,結果似乎不錯:
>>> add_end([1, 2, 3]) [1, 2, 3, 'END'] >>> add_end(['x', 'y', 'z']) ['x', 'y', 'z', 'END']當你使用默認參數調用時,一開始結果也是對的:
>>> add_end() ['END']但是,再次調用add_end()時,結果就不對了:
>>> add_end() ['END', 'END'] >>> add_end() ['END', 'END', 'END']很多初學者很疑惑,默認參數是[],但是函數似乎每次都“記住了”上次添加了'END'后的list。
原因解釋如下:
Python函數在定義的時候,默認參數L的值就被計算出來了,即[],因為默認參數L也是一個變量,它指向對象[],每次調用該函數,如果改變了L的內容,則下次調用時,默認參數
的內容就變了,不再是函數定義時的[]了。
所以,定義默認參數要牢記一點:默認參數必須指向不變對象!
? 要修改上面的例子,我們可以用None這個不變對象來實現:
def add_end(L=None):if L is None:L = []L.append('END')return L現在,無論調用多少次,都不會有問題:
>>> add_end() ['END'] >>> add_end() ['END']為什么要設計str、None這樣的不變對象呢?因為不變對象一旦創建,對象內部的數據就不能修改,這樣就減少了由于修改數據導致的錯誤。此外,由于對象不變,多任務環境下
同時讀取對象不需要加鎖,同時讀一點問題都沒有。我們在編寫程序時,如果可以設計一個不變對象,那就盡量設計成不變對象。
動態參數
按位置傳值多余的參數都由args統一接收,保存成一個元組的形式?
def mysum(*args):the_sum = 0for i in args:the_sum+=ireturn the_sumthe_sum = mysum(1,2,3,4) print(the_sum) def stu_info(**kwargs):print(kwargs)print(kwargs['name'],kwargs['sex'])stu_info(name = 'alex',sex = 'male') 1、2、3、4從左到右定義# def f(a,b,*args,defult=6,**kwargs): # #位置參數,*args,默認參數,**kwargs # print(a,b,args,defult)總結:
Python的函數具有非常靈活的參數形態,既可以實現簡單的調用,又可以傳入非常復雜的參數。
默認參數一定要用不可變對象,如果是可變對象,程序運行時會有邏輯錯誤!
要注意定義可變參數和關鍵字參數的語法:
*args是可變參數,args接收的是一個tuple;
**kwargs是關鍵字參數,kwargs接收的是一個dict。
以及調用函數時如何傳入可變參數和關鍵字參數的語法:
可變參數既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple,再通過*args傳入:func(*(1, 2, 3));
關鍵字參數既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過**kwargs傳入:func(**{'a': 1, 'b': 2})。
使用*args和**kwargs是Python的習慣寫法,當然也可以用其他參數名,但最好使用習慣用法。
命名的關鍵字參數是為了限制調用者可以傳入的參數名,同時可以提供默認值。
定義命名的關鍵字參數在沒有可變參數的情況下不要忘了寫分隔符*,否則定義的將是位置參數。
轉載于:https://www.cnblogs.com/buyisan/p/7252398.html
總結
以上是生活随笔為你收集整理的Python函数之初体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark2.x 与 Spark1.x
- 下一篇: 物联网网络编程和web编程