Python之路---初識函數
程序員三大美德:
懶惰
因爲一直致力於減少工作的總工作量。
缺乏耐性
因爲一旦讓你去做本該計算機完成的事,你將會怒不可遏。
傲慢
因爲被榮譽感衝暈頭的你會把程序寫得讓誰都挑不出毛病來。
大家好😄, 現在讓我們一起來學習一下函數 🎉
1|1Why-爲什麼要使用函數?
現在我們需要計算一個字符串的長度,我們可以直接使用len()方法:
num = len('hello')
但是如果我們不用len方法,怎麼實現這個需求?其實也不難:
s = 'hello' length = 0 for i in s: length += 1 print(length)
好了,功能實現了,然後又有一個需求(產品經理日常加需求),要計算另一個字符串的長度---“world”。
於是,本着程序員三大美德,😏我們使用最強大的快捷鍵---Ctrl+c , Ctrl+v:
s1 = 'world' length = 0 for i in s1: length += 1 print(length)
這樣確實可以實現需求,但是總感覺不是那麼完美,爲什麼呢?
首先,之前我只需要執行len方法就可以拿到一個字符串的長度,而現在爲了實現相同功能,我們需要把相同的代碼寫很多遍 --- 代碼冗餘
其次,剛剛的代碼不是那麼容易讀懂 ---- 可讀性差
我們就想,要是我們能像使用len一樣使用我們這一大段“計算長度”的代碼就好了。這種感覺有點像給這段代碼起了一個名字,等我們用到的時候直接喊名字就能執行這段代碼就行。
1|2函數定義與調用
現在教大家一個技能,把代碼裝起來:
def mylen(): """計算字符串長度""" s = 'hello' length = 0 for i in s: length += 1 print(length)
來分析下這段代碼:
其實除了def這一行和後面的縮進,其它的和前面的代碼是一樣的。
現在執行以下,你會發現啥也沒發生!
因爲這裏我們只是把代碼裝起來了,還不會往外拿,拿應該怎麼拿出來呢?
mylen()
這就是代碼取出來的過程。
定義函數 def mylen(): """計算字符串長度""" s = 'hello' length = 0 for i in s: length += 1 print(length) # 調用函數 mylen()
總結:
定義:
def關鍵字開頭,空格後接函數名稱和圓括號(),最後還有一個“:”
函數名只能包含字符串、下劃線和數字且不能以數字開頭。雖然函數名可以隨便起,但我們給函數起名字還是要儘量簡短,並能表達函數功能
括號:是必須加的,先別問爲啥要有括號,總之加上括號就對了!
註釋:每一個函數都應該對功能和參數進行相應的說明,應該寫在函數下面第一行。以增強代碼的可讀性。
調用: 就是 函數名() 要記得加上括號
1|3函數返回值
前面我們寫了一個函數,這個函數可以幫助我們計算字符串的長度,並且把結果打印出來。但是,這和我們的len方法還不是太一樣。以前我們調用len方法會得到一個值,我們可以用一個變量來接收這個值。
str_len = len('hello')
那麼我們寫的函數能做到嗎?
定義函數 def mylen(): """計算字符串長度""" s = 'hello' length = 0 for i in s: length += 1 print(length) # 調用函數 str_len = mylen() print('str_len : %s'%str_len)
執行代碼,獲得的輸出結果是str_len值爲None,這說明什麼也沒返回
那麼應該怎麼讓他有返回值呢?
return
定義函數 def mylen(): """計算字符串長度""" s = 'hello' length = 0 for i in s: length += 1 return length # 調用函數 str_len = mylen() print('str_len : %s'%str_len)
只需要在函數最後加上一個return的關鍵字,return後面寫上你要返回的值就可以了
return關鍵字的作用
return 是一個關鍵字,在pycharm裏,你會看到它變成藍色了。
這個詞翻譯過來就是“返回”,所以我們管寫在return後面的值叫“返回值”
沒有返回值:
不寫return的情況下,會默認返回一個None
只寫return,後面不寫其他內容,也會返回None,那麼爲啥要寫呢?return的其他用法,就是一旦遇到return,結束整個函數。
return None:和上面的兩種情況一樣,我們一般不這樣寫。
返回一個值:
注意:*return和返回值之間要有空格,可以返回任意數據類型的值
返回多個值:
可以返回任意多個、任意數據類型的值
def demo1(): '''返回多個值''' return 1,2,3,4 def demo2(): '''返回多個任意類型的值''' return 1,['a','b'],3,4 ret1 = demo1() print(ret1) ret2 = demo2() print(ret2)
返回的多個值會被組織成元組被返回,也可以用多個值來接收
def demo3(): return 1,['a','b'],3,4 #返回多個值,用一個變量接收 ret3 = demo3() print(ret2) #返回多個值,用多個變量接收 a,b,c,d = demo3() print(a,b,c,d) #用多個值接收返回值:返回幾個值,就用幾個變量接收 a,b,c,d = demo3() print(a,b,c,d)
1|4函數的參數
這個函數還是不完美,因爲之前我們使用len函數的時候,是可以想計算誰就計算誰的長度,但是我們寫的這個函數只能計算“hello”的長度,換一個字符串就需要更改函數內部的變量,這樣可不行,那應該怎麼辦?
帶參數的函數:
函數定義 def mylen(s): """計算s1的長度""" length = 0 for i in s: length = length + 1 return length #函數調用 str_len = mylen("hello") print('str_len : %s'%str_len)
我們告訴mylen函數要計算的字符串是誰,這個過程叫做傳遞參數,簡稱傳參,調用函數
時傳遞的這個“hello”和定義函數的s就是參數。
實參和形參
我們調用函數時傳遞的這個“hello”被稱爲實際參數,因爲這個是實際的要交給函數的內容,簡稱實參。
定義函數時的s,只是一個變量的名字,被稱爲形式參數,因爲在定義函數的時候它只是一個形式,表示這裏有一個參數,簡稱形參。
傳遞多個參數
參數可以傳遞多個,多個參數之間用逗號分割。
def mymax(x,y): """比較兩個數的大小""" the_max = x if x > y else y return the_max the_max = mymax(9,99) print(the_max)
正是因爲需要傳遞多個參數,所以纔有了下面的參數類型
1.位置參數
按照位置傳值:
def mymax(x,y): """比較兩個數的大小""" the_max = x if x > y else y return the_max the_max = mymax(9,99) print(the_max)
2.關鍵字參數
按照關鍵字傳值:
def mymax(x,y): """比較兩個數的大小""" the_max = x if x > y else y return the_max the_max = mymax(y=99, x=9) print(the_max)
PS:位置、關鍵字形式混着用
def mymax(x,y): """比較兩個數的大小""" the_max = x if x > y else y return the_max the_max = mymax(9, y=99) print(the_max)
正確用法:
位置參數必須在關鍵字參數的前面
- 對於一個形參只能賦值一次
- 默認參數
why?😮將變化比較小的值設置成默認參數
def info(name, sex='男'): """打印學生信息""" print(name, sex) info('馬克') info('王富貴', '女')
參數陷阱:默認參數是一個可變數據類型
def func(a, l=[]): l.append(a) print(l) func(1) func(2) func(3)
- 動態參數(不定長參數)
*args:按位置傳值多餘的參數都由args統一接收,保存成一個元組的形式
def mysum(*args): """求和""" the_sum = 0 print(args) # 保存成元組形式 print(type(args)) for i in args: the_sum += i return the_sum sum = mysum(10, 20, 30) print(sum)
**kwargs:按位置傳值多餘的參數都由kwargs統一接收,保存成一個字典的形式
def stu_info(**kwargs): print(kwargs) # 保存成字典 print(kwargs['name']) stu_info(name='不喜歡馬賽克的馬克', sex='男')
1|5⭐️總結
函數:
參數:
EOF
本文作者:Mark
本文鏈接:https://www.cnblogs.com/mark-wq/p/12933407.html