第10關(guān) 1.明確項目目標 Q1:標準大小的項目,需要1個人用80個工時完成(也就是1個人做10天) A1:說明1個標準大小項目的工作量是80 2.分析過程,拆解項目 3.逐步執(zhí)行,代碼實現(xiàn) 版本1.0:能用就好 # 工時計算 def estimated_time(size,number): time = size * 80 / number print('項目大小為%.1f個標準項目,使用%d個人力完成,則需要工時數(shù)量為:%.1f個' %(size,number,time)) #這里使用了字符串的格式化,%.1f為浮點數(shù)size占位,“.1”表示保留一位小數(shù),同理,“.2”表示保留2位小數(shù);%d為整數(shù)number占位;%.1f為浮點數(shù)time占位。 # 人力計算 def estimated_numbeer(size,time): number = size * 80 / time #這里之所以乘以80是因為1個標準大小的項目的工作量為80 print('項目大小為%.1f個標準項目,如果需要在%.1f個工時完成,則需要人力數(shù)量為:%d人' %(size,time,number)) #參考上面的注釋
# 調(diào)用工時計算函數(shù) estimated_time(1.5,2) # 調(diào)用人力計算函數(shù) estimated_numbeer(0.8,) 傳遞參數(shù)過程 版本2.0:稍作改良 #在代碼中使用ceil函數(shù),必須先調(diào)用math模塊。 import math
# 為函數(shù)設(shè)置了三個參數(shù),并都帶有默認參數(shù)。當在外部調(diào)用時更改了默認參數(shù)的值,那么默認參數(shù)的值相應(yīng)修改;當外部沒有修改默認參數(shù)的值,那么默認參數(shù)按照原來的值傳參。 def estimated(size=1,number=None,time=None): # 人力計算:如果外部調(diào)用函數(shù)時沒有更改number 的值就執(zhí)行以下代碼。 if (number == None) and (time != None): #注意區(qū)分雙等號“==”用于判斷,單等號“=”用于賦值。“==”表示等于,“!=”表示不等于。 number = math.ceil(size * 80 / time) #“math.ceil”用于向上取整,這行代碼表示將“size * 80 / time”向上取整并賦值給number。這里之所以乘以80是因為1個標準大小的項目的工作量為80 print('項目大小為%.1f個標準項目,如果需要在%.1f個工時完成,則需要人力數(shù)量為:%d人' %(size,time,number)) # 工時計算:如果外部調(diào)用函數(shù)時沒有更改time的值就執(zhí)行以下代碼。 elif (number != None) and (time == None): time = size * 80 / number print('項目大小為%.1f個標準項目,使用%d個人力完成,則需要工時數(shù)量為:%.1f個' %(size,number,time))
# 調(diào)用estimated函數(shù),并且更改了默認參數(shù)size和number的值,time的值未修改,依舊是None。 estimated(size=1.5,number=2) # 調(diào)用estimated函數(shù),并且更改了默認參數(shù)size和time的值,number的值未修改,依舊是None。 estimated(size=0.5,time=20.0) 傳參過程 
import math
def estimated(types,size,other): # 人力計算 if types == 1: number = math.ceil(size * 80 / other) print('項目大小為%.1f個標準項目,如果需要在%.1f個工時完成,則需要人力數(shù)量為:%d人' %(size,other,number)) # 工時計算 elif types == 2: time = size * 80 / other print('項目大小為%.1f個標準項目,使用%d個人力完成,則需要工時數(shù)量為:%.1f個' %(size,other,time))
estimated(1, 1.5, 2) # 結(jié)果:項目大小為1.5個標準項目,如果需要在2.0個工時完成,則需要人力數(shù)量為:60人 estimated(2, 1.5, 2) # 結(jié)果:項目大小為1.5個標準項目,使用2個人力完成,則需要工時數(shù)量為:60.0個
傳參過程 版本3.0:精細打磨 import math
# 采集信息的函數(shù),即采集項目大小size,工時time,人力number def myinput(): choice = input('請選擇計算類型:(1-工時計算,2-人力計算)') if choice == '1': size = float(input('請輸入項目大?。海?代表標準大小,請輸入小數(shù))')) number = int(input('請輸入人力數(shù)量:(請輸入整數(shù))')) time = None #由于計算的是工時,所以time賦值空值 return size,number,time # 這里返回的數(shù)據(jù)是元組(size,number,time) if choice == '2': size = float(input('請輸入項目大?。海?代表標準大小,請輸入小數(shù))')) number = None #由于計算的是人力,所以number賦值空值 time = float(input('請輸入工時數(shù)量:(請輸入小數(shù))')) return size,number,time # 這里返回的是一個元組(size,number,time)
# 完成計算的函數(shù) def estimated(my_input): # 把元組(size,number,time)中的數(shù)據(jù)取出來 size = my_input[0] number = my_input[1] time = my_input[2] # 人力計算 if (number == None) and (time != None): #當人力number為空值,工時time非空值時執(zhí)行以下代碼 number = math.ceil(size * 80 / time) print('項目大小為%.1f個標準項目,如果需要在%.1f個工時完成,則需要人力數(shù)量為:%d人' %(size,time,number)) # 工時計算 elif (number != None) and (time == None): #當人力 number非空值,時間time為空值時,執(zhí)行以下代碼 time = size * 80 / number print('項目大小為%.1f個標準項目,使用%d個人力完成,則需要工時數(shù)量為:%.1f個' %(size,number,time))
# 主函數(shù) def main(): #調(diào)用函數(shù)myinput,并將返回值元組(size,number,time)賦值給my_input my_input = myinput() #將元組(size,number,time)作為參數(shù)傳遞給函數(shù)estimated estimated(my_input)
# 調(diào)用主函數(shù) main() import math
# 變量key代表循環(huán)運行程序的開關(guān) key = 1
# 采集信息的函數(shù),即采集項目大小size,工時time,人力n def myinput(): choice = input('請選擇計算類型:(1-工時計算,2-人力計算)') if choice == '1': size = float(input('請輸入項目大?。海?代表標準大小,請輸入小數(shù))')) number = int(input('請輸入人力數(shù)量:(請輸入整數(shù))')) time = None return size,number,time # 這里返回的數(shù)據(jù)是一個元組(size,number,time) if choice == '2': size = float(input('請輸入項目大?。海?代表標準大小,請輸入小數(shù))')) number = None time = float(input('請輸入工時數(shù)量:(請輸入小數(shù))')) return size,number,time # 這里返回的是一個元組(size,number,time)
# 完成計算的函數(shù) def estimated(my_input): # 把元組(size,number,time)中的數(shù)據(jù)取出來 size = my_input[0] number = my_input[1] time = my_input[2] # 人力計算 if (number == None) and (time != None): number = math.ceil(size * 80 / time) print('項目大小為%.1f個標準項目,如果需要在%.1f個工時完成,則需要人力數(shù)量為:%d人' %(size,time,number)) # 工時計算 elif (number != None) and (time == None): time = size * 80 / number print('項目大小為%.1f個標準項目,使用%d個人力完成,則需要工時數(shù)量為:%.1f個' %(size,number,time))
# 詢問是否繼續(xù)的函數(shù) def again(): # 聲明key為全局變量,以便在函數(shù)內(nèi)部可以修改原來的全局變量key的值 global key a = input('是否繼續(xù)計算?繼續(xù)請輸入y,輸入其他鍵將結(jié)束程序。') if a != 'y': # 如果用戶不輸入'y',則把key賦值為0 key = 0
# 主函數(shù) def main(): print('歡迎使用工作量計算小程序!') #因為第四行便賦值1給變量key,然后又沒有修改過key的值,所以判斷為真,進入循環(huán) while key == 1: 調(diào)用函數(shù)myinput并將返回值元組(size,number,time)賦值給my_input my_input = myinput() estimated(my_input) #直接調(diào)用函數(shù)again again() print('感謝使用工作量計算小程序!') #調(diào)用函數(shù)main。需要注意的是:代碼是一行行從上往下執(zhí)行,但是以上只是封裝了各個函數(shù),沒有調(diào)用的情況下函數(shù)是不會運行的。 main()
第11關(guān) bug1:粗心 #賦值0給變量n,避免判斷n<3時出現(xiàn)n未定義的報錯 n=0 #進入循環(huán)共循環(huán)三次,n=0時循環(huán)第一次,n=1時循環(huán)第二次,n=2時循環(huán)第三次,n=3時跳出循環(huán) while n<3: username = input('請輸入用戶名:') password = input('請輸入密碼:') #注意“==”用于判斷,“=”用于賦值 if username == 'abc' and password == '123': print('登錄成功') break #當?shù)卿洺晒r,用break跳出循環(huán) #以下這個else和if同級,是對應(yīng)關(guān)系。如果用戶名和密碼有一個不匹配,那么執(zhí)行slse語句,并使得n的值增加1,以便n增加3次成為3時跳出循環(huán)。 else: n=n+1 print('輸入有誤') #以下這個else和while同級,是對應(yīng)關(guān)系,當while的條件不滿足時就執(zhí)行以下語句。 else: print('你輸錯了三次,登錄失敗')
bug2:知識不熟練 #將空列表賦值給a a = [] #利用“列表.append()”語法為列表增加元素 a.append('A') a.append('B') a.append('C') print(a) bug3:思路不清 movie = { '妖貓傳':['黃軒','染谷將太'], '無問西東':['章子怡','王力宏','祖峰'], '超時空同居':['雷佳音','佟麗婭'], } #定義一個字典movie,字典movie的鍵有妖貓傳、無問西東、超時空同居,值分別是列表['黃軒','染谷將太']、列表['章子怡','王力宏','祖峰']、列表['雷佳音','佟麗婭'] name = input('你想查詢哪個演員?') for i in movie: #此處是從字典中遍歷出值的用法(movie是字典,i指代字典中的每一個值,i的變量名可以更改為其它字母,如n、m)。拓展知識:從字典中遍歷出鍵和值的用法為“ for i,l in movie.items()”;從字典中遍歷出值的用法為“for i in movie.values()”。 actors = movie[i] # movie是字典,i指代遍歷出來的鍵,因此movie[i]表示取出字典中鍵為i 的值并賦值給actors。 if name in actors: #如果我們想要查詢的演員名字name在actors中,則執(zhí)行以下代碼。 print(name+'出演了電影'+i) #方法一: import random
all = ['正面','反面'] guess = '' #這一句也可以省去,但是要培養(yǎng)使用變量前定義變量的好習(xí)慣。 while guess not in all: #當變量guess的值不在all列表中時,則執(zhí)行以下代碼 print('------猜硬幣游戲------') print('猜一猜硬幣是正面還是反面?') guess = input('請輸入“正面”或“反面”:')
toss = all[random.randint(0,1)] #random.randint()代碼可以隨機取出某區(qū)間的一個整數(shù),在這里表示隨機取出0或1[]。假設(shè)隨機取出0,則all[0]表示電腦從列表all中取出偏移量為0的“正面”;假設(shè)隨機取出1,則all[1]表示電腦從列表all中取出偏移量為1的“反面”。
if toss == guess: #假設(shè)電腦的選擇和你的選擇相等,則猜對了。在此要注意雙等號“==”表示判斷,單等號“=”表示賦值。 print('猜對了!你真棒') else: print('沒猜對,再給你一次機會。') guess = input('再輸一次“正面”或“反面”:') #如果猜錯了,則重新輸入一個值 if toss == guess: #再次判斷猜對了沒 print('你終于猜對了!') else: print('大失??!') 3方法二: import random
guess = ''
while guess not in [0,1]: #這里是讓正面0代表正面,1代表反面。如果我們猜正面則要輸入0;猜反面則輸入1。 print('------猜硬幣游戲------') print('猜一猜硬幣是正面還是反面?') guess = int(input('“正面”請輸入0,“反面”請輸入1:')) #由于前面的代碼已經(jīng)將“正面”和“反面”分別當成0和1,那么在外部輸入的就應(yīng)該是0或1,注意要將字符串類型轉(zhuǎn)換為數(shù)字類型。
toss = random.randint(0,1) #利用random.randint()語法隨機取出0或1并賦值給toss。
if toss == guess: print('猜對了!你真棒') else: print('沒猜對,再給你一次機會。') guess = int(input('再輸一次(“正面”請輸入0,“反面”請輸入1):')) if toss == guess: print('你終于猜對了!') else: print('大失?。?)
bug4:被動掉坑 #直接進入循環(huán) while True: try: #從外部獲取年齡 age = int(input('你今年幾歲了?')) #獲取到年齡后直接跳出循環(huán) break #當獲取年齡發(fā)生錯誤時執(zhí)行以下代碼 except ValueError: print('你輸入的不是數(shù)字!') #如果獲取到的年齡小于18歲,那么就打印出“不可以喝噢” if age < 18: print('不可以喝酒噢') num = [1,2,0,3] #從num列表中遍歷出每一個數(shù)字。需要注意的是:“for x in num”中的x也可以替換為i,其實這只是一個普通變量名罷了 for x in num: try: #嘗試執(zhí)行下列代碼 print (6/x) #使用6除以num中的元素,并打印 except ZeroDivisionError: #如果發(fā)生ZeroDivisionError報錯,執(zhí)行下列代碼: print('0是不能做除數(shù)的!') #打印“0是不能做除數(shù)的!”
第12關(guān) 1.類與對象 2.類的創(chuàng)建和調(diào)用 class Computer: #電腦類,都有屏幕,所以屬性screen的值為布爾值True screen = True def start(self): print('電腦正在開機中……') my_computer = Computer() #computer類的實例化 print(my_computer.screen) my_computer.start() 3.創(chuàng)建類的兩個關(guān)鍵點 class Chinese:
name = '吳楓' # 類屬性name
def say(self): print(self.name + '是中國人')
person = Chinese() # 創(chuàng)建Chinese的實例person person.say() # 調(diào)用實例方法 class Chinese: #外部調(diào)用born函數(shù),需要傳入?yún)?shù)name,birthplace def born(self, name, birthplace): print(name + '出生在' + birthplace) #外部調(diào)用live函數(shù),需要傳入?yún)?shù)nemr,region def live(self, name, region): print(name + '居住在' + region)
person = Chinese() person.born('吳楓','廣東') person.live('吳楓','深
class Chinese: #初始化方法在類實例化后會自動執(zhí)行,省卻了外部調(diào)用函數(shù)時重復(fù)傳參的煩擾,具體可以對比上一個代碼 def __init__(self, name, birth, region): self.name = name # self.name = '吳楓' self.birth = birth # self.birth = '廣東' self.region = region # self.region = '深圳'
def born(self): print(self.name + '出生在' + self.birth)
def live(self): print(self.name + '居住在' + self.region)
person = Chinese('吳楓','廣東','深圳') # 傳入初始化方法的參數(shù) person.born() person.live() 4.面向?qū)ο缶幊?/span> #創(chuàng)建類的一個好處是:類中的屬性可以直接調(diào)用,不用考慮全局變量和局部變量的問題 class Project: def __init__(self): self.key = 1
def input(self): choice = input('請選擇計算類型:(1-工時計算,2-人力計算)') if choice == '1': self.size = float(input('請輸入項目大?。海?代表標準大小,請輸入小數(shù))')) self.number = int(input('請輸入人力數(shù)量:(請輸入整數(shù))')) self.time = None if choice == '2': self.size = float(input('請輸入項目大?。海?代表標準大小,請輸入小數(shù))')) self.number = None self.time = float(input('請輸入工時數(shù)量:(請輸入小數(shù))'))
def estimated(self): # 人力計算 if (self.number == None) and (self.time != None): self.number = math.ceil(self.size * 80 / self.time) print('項目大小為%.1f個標準項目,如果需要在%.1f個工時完成,則需要人力數(shù)量為:%d人' %(self.size,self.time,self.number)) # 工時計算 elif (self.number != None) and (self.time == None): self.time = self.size * 80 / self.number print('項目大小為%.1f個標準項目,使用%d個人力完成,則需要工時數(shù)量為:%.1f個' %(self.size,self.number,self.time)) def again(self): a = input('是否繼續(xù)計算?繼續(xù)請輸入y,輸入其他鍵將結(jié)束程序。') if a != 'y': # 如果用戶不輸入'y',則把key賦值為0 self.key = 0
# 主函數(shù) def main(self): print('歡迎使用工作量計算小程序!') while self.key == 1: self.input() self.estimated() self.again() print('感謝使用工作量計算小程序!')
project1 = Project() #創(chuàng)建實例 project1.main() 第13關(guān) class Chinese: # 類的創(chuàng)建 eye = 'black' # 類屬性的創(chuàng)建
def __init__(self,hometown): # 類的初始化方法 self.hometown = hometown # 實例屬性的創(chuàng)建 print('程序持續(xù)更新中……') # 初始化中的語句 def born(self): # 實例方法的創(chuàng)建 print('我生在%s。'%(self.hometown)) # 方法的具體語句
wufeng = Chinese('廣東') # 類的實例化 print(wufeng.eye) # 打印實例的屬性(從類傳遞的) wufeng.born() # 實例方法的調(diào)用 1.類的繼承和定制是什么? 2類的繼承,要怎么寫? 繼承的基礎(chǔ)語法 class Chinese: #因為眼睛是黑色的,所以將字符串'black'賦值給eye eye = 'black'
def eat(self): print('吃飯,選擇用筷子。') # 通過繼承,Chinese類有的,Cantonese類也有 class Cantonese(Chinese): #pass表示跳過,不執(zhí)行其它操作。子類繼承父類過程中,當子類不改變或增加任何屬性或方法,應(yīng)在類的內(nèi)部寫上pass,避免報錯 pass # 驗證子類可以繼承父類的屬性和方法,進而傳遞給子類創(chuàng)建的實例 yewen = Cantonese() # 子類創(chuàng)建的實例,從子類那間接得到了父類的所有屬性和方法 print(yewen.eye) # 子類創(chuàng)建的實例,可調(diào)用父類的屬性 yewen.eat() # 子類創(chuàng)建的實例,可調(diào)用父類的。注意調(diào)用函數(shù)時需要加上括號 class Cat: #因為貓都有尾巴,所以將布爾值True賦值給屬性tail tail = True def say(self): print('喵喵喵喵喵~') class Ragdoll(Cat): #pass表示跳過,不執(zhí)行任何操作。子類繼承父類過程中,當子類不改變或增加任何屬性或方法,應(yīng)在類的內(nèi)部寫上pass,避免報錯 pass maomao = Ragdoll() print(maomao.tail) maomao.say() 類的繼承之多層繼承 類的繼承之多重繼承 class C0: name = 'C0'
class C2(C0): num = 2
class C1: num = 1
class C3: name = 'C3'
class C4(C1,C2,C3): pass
ins = C4() print(ins.name) # 打印出C0。C1沒有name屬性,然后在C2中尋找,C2中也沒有name屬性,但是C2的父類C0中有name屬性,根據(jù)“多重繼承中,若某父類還有父類的話,會先繼續(xù)往上找到頂?!?,因此打印出C0的name屬性。 print(ins.num) # 打印出1 3.類的定制,要怎么寫? 定制,可以新增代碼 定制,也可重寫代碼 class Chinese:
def land_area(self,area): print('我們居住的地方,陸地面積是%d萬平方公里左右。'% area)
class Cantonese(Chinese): # 間接對方法進行重寫,增加了默認參數(shù)rete=0.0188 def land_area(self, area, rate = 0.0188): #調(diào)用父類Chinese的方法land_area。這里需要注意的是:下面的這個area和父類的area不是同一個變量,只是說變量名相同罷了。父類的area實際上是下面的 area * rate。以下代碼是簡寫形式,如果補充完整是“ print('我們居住的地方,陸地面積是%d萬平方公里左右。'% area*rate)”。如果此處難以理解,可以將調(diào)用時傳入的具體數(shù)值代入理解。 Chinese.land_area(self, area * rate)
gonger = Chinese() yewen = Cantonese() gonger.land_area(960) yewen.land_area(960) 
class Chinese:
def __init__(self, greeting = '你好', place = '中國'): self.greeting = greeting self.place = place
def greet(self): print('%s!歡迎來到%s。' % (self.greeting, self.place))
class Cantonese(Chinese): #以下代碼是類初始化方法的定制,更改了父類的默認參數(shù)greeting和place。 def __init__(self, greeting = '雷猴', place = '廣東'): #這行代碼用于調(diào)用父類的初始化函數(shù),并將參數(shù)'雷猴'和'廣東'傳遞給父類初始化函數(shù)。 Chinese.__init__(self, greeting, place) yewen = Cantonese() yewen.greet() 
|