程序員三大美德:python
- 懶惰
由於一直致力於減小工做的總工做量。程序員
- 缺少耐性
由於一旦讓你去作本該計算機完成的事,你將會怒不可遏。app
- 傲慢
由於被榮譽感衝暈頭的你會把程序寫得讓誰都挑不出毛病來。函數
你們好😄, 如今讓咱們一塊兒來學習一下函數 🎉學習
如今咱們須要計算一個字符串的長度,咱們能夠直接使用len()方法:翻譯
num = len('hello')
可是若是咱們不用len方法,怎麼實現這個需求?其實也不難:code
s = 'hello' length = 0 for i in s: length += 1 print(length)
好了,功能實現了,而後又有一個需求(產品經理平常加需求),要計算另外一個字符串的長度---「world」。blog
因而,本着程序員三大美德,😏咱們使用最強大的快捷鍵---Ctrl+c , Ctrl+v:字符串
s1 = 'world' length = 0 for i in s1: length += 1 print(length)
這樣確實能夠實現需求,可是總感受不是那麼完美,爲何呢?pycharm
首先,以前我只須要執行len方法就能夠拿到一個字符串的長度,而如今爲了實現相同功能,咱們須要把相同的代碼寫不少遍 --- 代碼冗餘
其次,剛剛的代碼不是那麼容易讀懂 ---- 可讀性差
咱們就想,要是咱們能像使用len同樣使用咱們這一大段「計算長度」的代碼就行了。這種感受有點像給這段代碼起了一個名字,等咱們用到的時候直接喊名字就能執行這段代碼就行。
如今教你們一個技能,把代碼裝起來:
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關鍵字開頭,空格後接函數名稱和圓括號(),最後還有一個「:」
函數名只能包含字符串、下劃線和數字且不能以數字開頭。雖然函數名能夠隨便起,但咱們給函數起名字仍是要儘可能簡短,並能表達函數功能
括號:是必須加的,先別問爲啥要有括號,總之加上括號就對了!
註釋:每個函數都應該對功能和參數進行相應的說明,應該寫在函數下面第一行。以加強代碼的可讀性。
調用: 就是 函數名() 要記得加上括號
前面咱們寫了一個函數,這個函數能夠幫助咱們計算字符串的長度,而且把結果打印出來。可是,這和咱們的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和返回值之間要有空格,能夠返回任意數據類型的值
返回多個值:
能夠返回任意多個、任意數據類型的值
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)
這個函數仍是不完美,由於以前咱們使用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)
正是由於須要傳遞多個參數,因此纔有了下面的參數類型
按照位置傳值:
def mymax(x,y): """比較兩個數的大小""" the_max = x if x > y else y return the_max the_max = mymax(9,99) print(the_max)
按照關鍵字傳值:
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)
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='男')
函數:
參數: