初始函數
1.1 函數的作用
;1.2函數的組成
1.3定義和調用函數
函數的進階使用
2.1函數類型
2.2返回多個值
多函數協作
3.1變量作用域
3.2函數嵌
/\e這兩節課的主要內容是帶大家探究「熟悉的陌生人」——函數。之所以這麼說,是因為我們之前已經接觸過Python函數,但是對它沒有系統地了解過。這節課,我們一起經營KFC,在我們KFC門店裡通過運用函數解決我們的問題。首先在學習具體知識前,我向大家簡要的介紹下函數的作用,知道函數是做什麼用的?
1 函數的作用
人生苦短,我用Python」,正因為Python語法簡單,才會越來越被編程界歡迎。換言之,我們編程,更應該避免重複性代碼。前面學習的循環是減少代碼重複的一種手段,那麼接下來要學習的函數也是減少重複性代碼的另一種手段。它的定義是:
什麼意思呢?我們之前寫的代碼只能執行一次,但是函數中的代碼可以使用多次。通俗來講,函數就如同一個包裹,每個包裹都有一個功能,無論你在哪兒,只要你需要包裹,就把它拿過去用;你需要什麼樣功能的包裹,就用什麼樣的包裹;你需要使用多少次包裹,就使用多少次。這就是函數,在之後的旅程中,你會越來越體會到函數的妙用。講了這麼多了,先看一下函數長什麼樣子?
1.2函數的組成
先不著急看Python的函數,先來個數學函數,那些年,我們錯過的函數。數學函數y = 6*x +9 , x是自變量,6*x+9是執行過程,y是因變量,自變量x決定了因變量y得值。那麼,你可以將y = 6*x +9看作成3部分
在Python中,我們遇到很多函數, 有負責輸入數據的函數,有負責數據處理的函數,有負責數據輸出的函數。
以上就是我們見過的Python的函數,這些函數是Python自帶的函數,我們不需要管這些函數怎麼來的,就負責用就好了,這些函數也叫內置函數。你會發現,上面這些函數,都有括號(), 裡面存放我們需要傳給函數的數據,在Python江湖中,這種數據稱為【函數的參數】。【參數】指的是函數要接受、處理的數據,其實就是一個變量。
好了,我們看過了函數的樣子。但是問題來了,這些函數很好,如果用不到他們怎麼辦。就像我們KFC餐廳裡,顧客不想吃漢堡怎麼辦?我們可以給他們做滷肉飯啊,同樣,我們也可以根據自己的需要,定義自己想要的函數。大家進入本節課重點:定義和調用函數。編寫函數第一步,我們先來看一下如何定義一個函數,它的基本語法是什麼。
+3定義和調用函數
函數三部分,第一部分輸入,在y = 6*x+9函數中,因為x變,y才改變,x就是輸入到函數的數據,就是這個函數的參數;第二部分,執行過程,執行過程就是計算y的結果,即6*x+9的結果;還有第三部分,輸出結果,計算完這個結果後要把這個結果告訴別人。因此,這個函數可以寫成下面這個樣子。
拆分解讀:第一行:def的全稱是define, 譯為定義;fun是函數名字,自己起的;(x)這裡是函數的參數,參數名字也是自己起;不要忘了最後的冒號:
江湖秘籍:涉及到的符號都是英文的哦。第二行:def下一行縮進的內容叫做函數體,這是函數要實現的功能。即根據x的值,計算6*x+9,將結果賦值給y。第三行:return 語句是返回的意思,可以指定函數執行完畢後最終會得到什麼樣的結果,否則計算機是無法判斷出函數最終要輸出什麼結果的。定義函數是不是很簡單?但是裡面還有很多注意事項,不要踩坑。
#函數名:1.名字能體現函數的功能,一般用小寫英文字母和數字、英文下劃線組合使用
現在,你根據上面的例子,完成函數y=30+11*x,請在下面代碼框中編寫,點擊運行。
你會發現,終端內沒有任何內容。沒有內容就對了,現在只是定義了函數,還沒有使用函數。定義函數,就是將函數內部功能封裝好,然後等待調用。就如同包裹一樣,你現在只是裝好了包裹,但是還沒有使用。怎麼使用函數呢?在Python江湖中,我們使用函數叫做「調用函數」,很簡單就是輸入函數名與參數所對應的數據。運行一下下面代碼,觀察終端裡的效果。
解讀分析:math(10)就是調用函數,math為定義函數的名字(定義與調用時名字一致);傳遞參數,10對應函數參數x, 在調用函數時,將10傳遞給x; 在函數體中,y = 30 +11*10, 得出y的結果為140; 那麼,res就用來接收y的值,即res=140。所以,列印出來的結果就是140。OK,現在掌握調用函數了吧。
現在你看到就是函數最基本的形式,目的就是讓大家先有個認知。
接下來,我們做個練習鞏固一下。
請聽題:定義一個函數,用戶傳入「XXX」,就列印出「您好,歡迎來到KFC餐廳,您的點餐為XXX」。這個XXX, 可以傳入漢堡、薯條,任何內容。提示:使用input,接收用戶輸入內容,然後調用函數,完成功能。來,試一下:
上面我們調用函數,設置、傳遞參數是編寫函數的重點。在Python江湖中,函數中無論設置、傳遞多少個參數都可以,哪怕不設置、傳遞參數也行。
先來了解一下函數類型。
們KFC餐廳,需要做一個歡迎廣告語,每位顧客來的時候都要進行播放。那看一下,如何在Python中使用函數實現這個廣告語。運行一下下面代碼, 觀察終端裡的效果。
def helloKFC():
print('雖然我們生而不同')
print('但饞起來是一樣的')
print('每個雞翅都值得被啃個乾淨')
print('我們已經很餓了,你們呢?')
print('十翅一桶39元')
print('重磅回歸,就在今天')
helloKFC()
觀察上面的代碼,這裡定義了一個helloKFC()函數,但是括號裡沒有參數。這是因為,我們的廣告也不需要接收用戶內容,只需要原樣列印廣告即可,所以不需要傳遞參數。1江湖秘籍:即使沒有參數,在定義函數、調用函數的時候也不能省略括號。2在這個例子中,也不需要return語句,因為裡面的內容直接列印在屏幕上即可, 不要返回值的。3簡言之,函數的執行過程,可以有返回值,也可以沒有返回值。好了,接下來,我們看看函數可以設置多少個參數。我們KFC餐廳在剛開業的時候,因為其他原因,只能為每位顧客提供漢堡、飲料、小食三種食品。如果寫成函數,這個函數就有3個參數。我使用hamburger、drink、snacks作為漢堡、飲料、小食的參數運行一下下面代碼, 觀察終端裡的效果。編程題
在這裡,我們設置了默認參數snacks='蛋撻',在調用函數的時候,蛋撻也會默認添加到菜單中。當然了,如果有的顧客不想吃蛋撻,他就想吃薯條怎麼辦。那就按顧客的來,顧客是上帝嘛。運行一下下面代碼,觀察終端裡的效果。在調用函數時,參數一一傳遞;在第三次調用函數menu('培根烤雞腿堡','橙汁','薯條')時,『薯條『會替換默認的參數』蛋撻『,將snacks設置為』薯條『。
了解完默認參數, 我們接著往下看。後來,我們的餐廳經營越來越大,食品種類越來越多,但是每個人點餐的種類又不確定,我們又不能限制顧客點餐。這時候就需要使用【不定長參數】。它的格式比較特殊,先運行一下下面代碼,觀察終端裡的效果。
def menu(*food):
return food
order1 = menu('香辣雞腿堡','可樂')
order2 = menu('滷肉飯','老北京雞肉卷','雪碧','可樂')
order3 = menu('烤串','火鍋','培根烤雞腿堡','橙汁','薯條','甜筒')
print(order1)
print(order2)
print(order3)
print(type(order1))
print(type(order2))
print(type(order3))
在調用函數時,參數一一傳遞;在第三次調用函數menu('培根烤雞腿堡','橙汁','薯條')時,『薯條『會替換默認的參數』蛋撻『,將snacks設置為』薯條『。
了解完默認參數, 我們接著往下看。後來,我們的餐廳經營越來越大,食品種類越來越多,但是每個人點餐的種類又不確定,我們又不能限制顧客點餐。這時候就需要使用【不定長參數】它的格式比較特殊,先運行一下下面代碼,觀察終端裡的效果。
代碼解讀:這裡使用一個星號*加上參數名就接收到了所有參數,無論參數寫幾個,都能接收到。而返回值就是參數名。我們將返回的內容列印出來,又列印了一下返回值的類型:< class 'tuple' >Tuple叫做元組,元組的寫法是將所有內容放在小括號中,使用逗號隔開,和列表用法類似。但是又與列表不同,列表中的元素可以更改,而元組中的元素不可以更改。和列表相同的是:元組也是可以遍歷的對象。使用for循環遍歷一下。運行一下下面代碼,觀察終端裡的效果編程題1
foriinfood:
print('點餐內容:'+i)
menu('香辣雞腿堡','可樂')
menu('滷肉飯','老北京雞肉卷','雪碧','可樂')
enu('烤串','火鍋','培根烤雞腿堡','橙汁','薯條','甜筒')
使用for循環,將元組中的內容遍歷出來。一一顯示。
我們研究一下常用的print()函數,翻看了一下Python寶典,其中是這樣介紹print()函數的。代碼片段
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
我們可以看到,print()函數中第一個參數objects帶了*號,是不定長參數——這也就是print()函數可以傳遞任意數量的參數。
現在,你掌握了函數參數的不同形態,以後視具體需要,來設置函數參數。
函數,不僅可以支持多個參數,還可以支持多個返回值。接下來我們就講講如何使用return語句返回多個返回值。回到我們的KFC餐廳,我們要優惠活動,到店顧客,只要買單我們就有美食相送。 具體規則:用戶消費滿69元,我們隨機贈送10元食品一份;用戶消費滿99元,我們隨機贈送10元食品一份外加一個冰激淋。代碼已經寫好了,先運行一下下面代碼,觀察終端裡的效果。
編程題main.py
importrandom
foodten= ['蛋撻','雞翅','薯條']
deforder(money):
ifmoney>99:
a=random.choice(foodten)
returna,'冰激淋'
elif69<money<99:
b=random.choice (foodten)
returnb
else:
return'不好意思,您的消費達不到優惠活動'
print(order(50))
print(order(70))
print(order(130))觀察代碼:代碼片段
importrandom
foodten= ['蛋撻','雞翅','薯條']
deforder(money):
ifmoney>99:
a=random.choice(foodten)
在這裡,有3條return語句,每條語句返回的內容都不一樣,返回的數量也不一樣。這就是返回多個值returna,'冰激淋'
returnb
return'不好意思,您的消費達不到優惠活動'
在開始時候,我們說過,函數封裝了獨立功能,一個程序往往由多個函數來配合實現
當多函數協作運行時,就涉及到函數中一個非常重要的內容—變量作用域。
什麼是變量作用域?說白了,就是地盤問題;比如說,KFC是由哈蘭·山德士老爺爺創立的,所有KFC餐廳都會聽他的,他說下個月所有KFC要供應烤串,這肯定沒問題;但是他如果去要求麥當勞餐廳,估計就沒人理他了;但是如果川普說,所有的KFC與麥當勞餐廳都要賣「蘭州拉麵「,KFC與麥當勞肯定得賣,誰讓他是美國總統呢。
我們把這個問題用代碼寫出來
先運行一下下面代碼,觀察終端裡的效果。(報錯後點擊【跳過本題】)
編程題
main.py
trump='所有餐廳都要賣【蘭州拉麵】'
defKFC():
harland='所有KFC餐廳賣烤串'
print('KFC餐廳:%s'%trump)
print('KFC餐廳:%s'%harland)
defMcDonald():
print('麥當勞餐廳:%s'%trump)
print('麥當勞餐廳:%s'%harland)
KFC()
McDonald()
看代碼感覺很美,運行代碼就會發現報錯嘍。
運行KFC()函數沒有任何問題;運行McDonald()函數就報錯了;
給我們彈出一個bug, 在print('麥當勞餐廳:%s'%harland)這句代碼中,拋出【NameError: name 'harland' is not defined】的錯誤。
這就是變量的作用問題:作用域分為全局作用域和局部作用域。
全局作用域:在所有函數之外賦值的變量,可以在程序任意位置使用(全局作用域),這就是全局變量;比如第一行的trump = '所有餐廳都要賣【蘭州拉麵】';它在KFC()與McDonald()兩個函數中都起作用。
局部作用域:在某個函數內部賦值的變量,只能在當前函數內使用(局部作用域),出了這個函數,它就不起作用了,這就是局部變量;比如harland = '所有KFC餐廳賣烤串';它只在KFC()函數中起作用,在McDonald()就不起作用了。
可是,如果,我非讓KFC的哈蘭·山德士老爺爺說話在麥當勞管用怎麼辦?也就是非要讓harland = '所有KFC餐廳賣烤串',在麥當勞中起作用怎麼辦
有辦法,在harland = '所有KFC餐廳賣烤串'使用global對變量進行修飾,global表示全局意思,它就告訴計算機,這個變量變成了全局變量,它在任何地方都起作用。
globalharland好了global修飾詞就學到這裡。下面,我們看一下最常用的函數嵌套。
3.2函數嵌套
其實,我們都見過函數嵌套,比如:print(len('我愛你'))、print(type(10))
這就是print()函數嵌套了len()函數,print()函數嵌套了type()函數;這樣,代碼會先運行print()括號內的函數,再將這個函數結果放到print()函數中執行,列印出來。
這樣操作,叫做在函數內部調用其他函數,我們自己定義的函數也可以這麼做。
defhello():
print('歡迎光臨KFC')
print('很高興為您服務')
deforder():
print('這裡是下單中心')
hello()
print('請您點餐')
print('以上菜單的菜品都有')
order()
在這裡,我定義了兩個函數,函數hello()與函數order(),在函數order()中調用了函數hello(),這樣函數hello()中的代碼會在函數order()中運行。
這就是函數的嵌套,在一個函數中調用其他函數。
講到這兒,是不是都餓了。那就快去KFC吧,但是不要去KFC點拉麵哦。
下節課帶大家利用函數來解決項目問題。
下節課見。