3.1 def語句和參數(shù)
def ...(...)語句用于定義一個函數(shù),以便后面調(diào)用函數(shù)爆存,如:
def hello(name): #定義函數(shù)hello蛉顽,變元name
? ? print('hello' + name) #打印hello+變元name
namein = input() #定義namein變量,從鍵盤取值并賦給namein
hello(namein) #調(diào)用hello函數(shù)先较,將namein的變量賦值給變元name携冤。
需注意:函數(shù)被調(diào)用并返回后,在變元中的值就丟失了拇泣。
3.2 返回值和return語句
def語句創(chuàng)建函數(shù)時噪叙,可以用return語句指定應(yīng)該返回什么值,如
import random
def getAnswer(answerNumber): #定義一個函數(shù)getAnswer霉翔,變元answerNumber
? ? if answerNumber == 1:
? ? ? ? return 'It is certain' #當變元為1時睁蕾,打印這個結(jié)果,下述同理债朵。
? ? elif answerNumber == 2:
? ? ? ? return 'It is decidedly so'
? ? elif answerNumber == 3:
? ? ? ? return 'Yes'
? ? elif answerNumber == 4:
? ? ? ? return 'Reply hazy try again'
? ? elif answerNumber == 5:
? ? ? ? return 'Ask again later'
? ? elif answerNumber == 6:
? ? ? ? return 'Concertrate and ask again'
? ? elif answerNumber == 7:
? ? ? ? return 'My reply is no'
? ? elif answerNumber == 8:
? ? ? ? return 'Outlook not so good'
? ? elif answerNumber == 9:
? ? ? ? return 'Very doubtful'
r = random.randint(1, 9) #定義變量r子眶,調(diào)用內(nèi)建函數(shù)random,其范圍是1到9
fortune = getAnswer(r) #運行自建函數(shù)getAnswer序芦,變元值為r臭杰。
print(fortune) #打印fortune中的存儲結(jié)果
3.3 None值
None表示沒有值,是NoneType數(shù)據(jù)類型的唯一值谚中。
注意渴杆,print()函數(shù)是沒有返回值的,與none值相同宪塔。
可以通過:
spam = print('Hello')
None == spam
#返回結(jié)果為True得出磁奖。
3.4關(guān)鍵字參數(shù)和print()
關(guān)鍵字是由在調(diào)用函數(shù)時選用的,通常用于可選變元某筐。
如print中的 end比搭、, 、seq函數(shù)南誊。
#end=''
print('Hello',end=' ')
print('World')
結(jié)果→→Hello World
# ','
print('Cat','Dog','Mice')
結(jié)果→→Cat Dog Mice
# seq = ''
print('Cat','Dog','Mice',sep=',')
結(jié)果→→Cat,Dog,Mice
3.5 局部和全局作用域
全局指在本程序中一直生效身诺,局部是指在程序的某一個局部中生效蜜托,如果退出局部則失效。
def spam():
? ? eggs = 99 #局部變量1
? ? bacon() #此處局部變量2會被打印霉赡,對于spam()來說橄务,這里就是局部
? ? print(eggs) #此處打印結(jié)果為99,因為bacon()執(zhí)行后同廉,bacon()中的局部變量失效了
def bacon():
? ? ham = 101
? ? eggs = 0 #局部變量2
spam()
bacon()
全局變量可以和局部變量重名仪糖,但我們盡量讓他們之間不要重名柑司。
***
def spam():
? ? print(eggs)
eggs = 42 #全局變量1
spam()
print(eggs)
上代碼中的局部變量eggs在
打印時引用了全局變量迫肖。
總結(jié):全局會被局部引用,局部不會被全局引用攒驰,要想運行輕松點蟆湖,就要注意別重名啦。
3.6 global語句
為函數(shù)命名時加上global語句如“global eggs = 1”玻粪,就可以讓python知道在這代碼全局中所有的eggs函數(shù)都值都為1隅津。
函數(shù)中一個人變量要么總是全局變量,要么總是局部變量劲室。
3.7 異常處理
由于你不知道用戶輸入的變元是什么伦仍,所以你需要在他們執(zhí)行前執(zhí)行一次檢查,以免程序直接出錯跳出很洋。
#CODE
def spam(divideBy):
? ? try:
? ? ? ? return 42 / divideBy
? ? except ZeroDivisionError:
? ? ? ? print('錯誤:無效輸入')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
#OUTPUT
21.0
3.5
錯誤:無效輸入
None
42.0
3.8 猜數(shù)字游戲
#This is a guess number game.
import random
SecretNumber = random.randint(1,20)
print('I have a number, come on and guess.')
#print('PLZ enter a number.')
#Ask the player to guess 6 times.
for guessesTaken in range(1,7):
? ? print('PLZ enter a number.')
? ? guess = int(input())
? ? if guess < SecretNumber:
? ? ? ? print('Your number is too low.')
? ? elif guess > SecretNumber:
? ? ? ? print('Your number is too high.')
? ? else:
? ? ? ? break # This condition is the correct guess!
if guess == SecretNumber:
? ? print('Good job! You guessed my number in ' + str(guessesTaken) + ' times.')
else:
? ? print('Nope. The number I was thinking of was ' + str(SecretNumber))
3.9 本章習(xí)題
1.為什么在程序中加入函數(shù)會有好處充蓝??
????函數(shù)快,可以消除重復(fù)喉磁,讓代碼更短谓苟,讀起來也更容易。
2.函數(shù)中的代碼何時執(zhí)行:在函數(shù)被定義時协怒,還是在函數(shù)被調(diào)用時涝焙?
????在函數(shù)被調(diào)用時執(zhí)行。
3.什么語句創(chuàng)建一個函數(shù)孕暇?
? ? def語句創(chuàng)建函數(shù)仑撞。
4.一個函數(shù)和一次函數(shù)調(diào)用有什么區(qū)別?
????函數(shù)是一個開頭為def的語句妖滔,它包含函數(shù)名和函數(shù)體隧哮。如def guess()
????而函數(shù)之后的guess()是一次函數(shù)調(diào)用,只有當代碼執(zhí)行到guess()時铛楣,才會調(diào)用函數(shù)def guess()下面的函數(shù)體近迁。
5.Python 程序中有多少全局作用域?有多少局部作用域簸州?
? ? 在調(diào)用函數(shù)時鉴竭,創(chuàng)建了一個全局作用域和一個局部作用域歧譬。
6.當函數(shù)調(diào)用返回時,局部作用域中的變量發(fā)生了什么搏存?
? ? 清空瑰步。
7.什么是返回值?返回值可以作為表達式的一部分嗎璧眠?
? ? 返回值即函數(shù)執(zhí)行結(jié)束后的返回結(jié)果缩焦,他可以作為表達式的一部分。
8.如果函數(shù)沒有返回語句责静,對它調(diào)用的返回值是什么袁滥?
? ? None
9.如何強制函數(shù)中的一個變量指的是全局變量?
? ? global xxx 則 xxx 被強制為一個全局變量灾螃。
10.None 的數(shù)據(jù)類型是什么题翻?
? ? none.type
11.import areallyourpetsnamederic 語句做了什么?
? ? 導(dǎo)入了一個名為areallyourpetsnamederic的函數(shù)腰鬼,
12.如果在名為 spam 的模塊中嵌赠,有一個名為 bacon()的函數(shù),在引入 spam 后熄赡,如何調(diào)用它姜挺?
? ? spam.bacon()
13.如何防止程序在遇到錯誤時崩潰?
? ? try
? ? except
????函數(shù)進行驗證
14.try 子句中發(fā)生了什么彼硫?except 子句中發(fā)生了什么炊豪?
? ? try句子中運行了你的表達式,如果產(chǎn)生錯誤乌助,則轉(zhuǎn)到except溜在。
? ? 之后程序照常運行。
3.11 代碼實踐
3.11.1?
編寫一個名為 collatz()的函數(shù)他托,它有一個名為 number 的參數(shù)掖肋。如果參數(shù)是偶數(shù),那么 collatz()就打印出 number // 2赏参,并返回該值志笼。如果 number 是奇數(shù),collatz()就打印并返回 3 * number + 1把篓。
然后編寫一個程序纫溃,讓用戶輸入一個整數(shù),并不斷對這個數(shù)調(diào)用 collatz()韧掩,直到函數(shù)返回值1(令人驚奇的是紊浩,這個序列對于任何整數(shù)都有效,利用這個序列,你遲早會得到 1坊谁!既使數(shù)學(xué)家也不能確定為什么费彼。你的程序在研究所謂的“Collatz序列”,它有時候被稱為“最簡單的口芍、不可能的數(shù)學(xué)問題”)箍铲。
記得將 input()的返回值用 int()函數(shù)轉(zhuǎn)成一個整數(shù),否則它會是一個字符串鬓椭。 提示 如果 number % 2 == 0颠猴,整數(shù) number 就是偶數(shù),如果 number % 2 == 1小染,它就是奇數(shù)翘瓮。
這個程序的輸出看起來應(yīng)該像這樣:
Enter number:
3
10
5
16
8
4
2
1
def collatz(dd):
? ? global number
? ? number = dd
? ? while number != 1:
? ? ? ? if number % 2 == 0:
? ? ? ? ? ? number = number // 2
? ? ? ? ? ? print(number)
? ? ? ? elif number % 2 == 1:
? ? ? ? ? ? number = number * 3 + 1
? ? ? ? ? ? print(number)
3.11.2
在前面的項目中添加 try 和 except 語句氧映,檢測用戶是否輸入了一個非整數(shù)的字符串春畔。正常情況下,int()函數(shù)在傳入一個非整數(shù)字符串時岛都,會產(chǎn)生 ValueError 錯誤,比如 int('puppy')振峻。在 except 子句中臼疫,向用戶輸出一條信息,告訴他們必須輸入一個整數(shù)扣孟。
try:
? ? nm1 = int(input('請輸入一個數(shù)字\n'))
except ValueError:
? ? print('請輸入正確的數(shù)字烫堤!')
else:
? ? print(collatz(nm1))