第10关 1.明确项目目标 Q1:标准大小的项目,需要1个人用80个工时完成(也就是1个人做10天) A1:说明1个标准大小项目的工作量是80 2.分析过程,拆解项目 3.逐步执行,代码实现 版本1.0:能用就好 # 工时计算 def estimated_time(size,number): time = size * 80 / number print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time)) #这里使用了字符串的格式化,%.1f为浮点数size占位,“.1”表示保留一位小数,同理,“.2”表示保留2位小数;%d为整数number占位;%.1f为浮点数time占位。 # 人力计算 def estimated_numbeer(size,time): number = size * 80 / time #这里之所以乘以80是因为1个标准大小的项目的工作量为80 print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number)) #参考上面的注释
# 调用工时计算函数 estimated_time(1.5,2) # 调用人力计算函数 estimated_numbeer(0.8,) 传递参数过程 版本2.0:稍作改良 #在代码中使用ceil函数,必须先调用math模块。 import math
# 为函数设置了三个参数,并都带有默认参数。当在外部调用时更改了默认参数的值,那么默认参数的值相应修改;当外部没有修改默认参数的值,那么默认参数按照原来的值传参。 def estimated(size=1,number=None,time=None): # 人力计算:如果外部调用函数时没有更改number 的值就执行以下代码。 if (number == None) and (time != None): #注意区分双等号“==”用于判断,单等号“=”用于赋值。“==”表示等于,“!=”表示不等于。 number = math.ceil(size * 80 / time) #“math.ceil”用于向上取整,这行代码表示将“size * 80 / time”向上取整并赋值给number。这里之所以乘以80是因为1个标准大小的项目的工作量为80 print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number)) # 工时计算:如果外部调用函数时没有更改time的值就执行以下代码。 elif (number != None) and (time == None): time = size * 80 / number print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
# 调用estimated函数,并且更改了默认参数size和number的值,time的值未修改,依旧是None。 estimated(size=1.5,number=2) # 调用estimated函数,并且更改了默认参数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个工时完成,则需要人力数量为:%d人' %(size,other,number)) # 工时计算 elif types == 2: time = size * 80 / other print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,other,time))
estimated(1, 1.5, 2) # 结果:项目大小为1.5个标准项目,如果需要在2.0个工时完成,则需要人力数量为:60人 estimated(2, 1.5, 2) # 结果:项目大小为1.5个标准项目,使用2个人力完成,则需要工时数量为:60.0个
传参过程 版本3.0:精细打磨 import math
# 采集信息的函数,即采集项目大小size,工时time,人力number def myinput(): choice = input('请选择计算类型:(1-工时计算,2-人力计算)') if choice == '1': size = float(input('请输入项目大小:(1代表标准大小,请输入小数)')) number = int(input('请输入人力数量:(请输入整数)')) time = None #由于计算的是工时,所以time赋值空值 return size,number,time # 这里返回的数据是元组(size,number,time) if choice == '2': size = float(input('请输入项目大小:(1代表标准大小,请输入小数)')) number = None #由于计算的是人力,所以number赋值空值 time = float(input('请输入工时数量:(请输入小数)')) return size,number,time # 这里返回的是一个元组(size,number,time)
# 完成计算的函数 def estimated(my_input): # 把元组(size,number,time)中的数据取出来 size = my_input[0] number = my_input[1] time = my_input[2] # 人力计算 if (number == None) and (time != None): #当人力number为空值,工时time非空值时执行以下代码 number = math.ceil(size * 80 / time) print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%d人' %(size,time,number)) # 工时计算 elif (number != None) and (time == None): #当人力 number非空值,时间time为空值时,执行以下代码 time = size * 80 / number print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
# 主函数 def main(): #调用函数myinput,并将返回值元组(size,number,time)赋值给my_input my_input = myinput() #将元组(size,number,time)作为参数传递给函数estimated estimated(my_input)
# 调用主函数 main() import math
# 变量key代表循环运行程序的开关 key = 1
# 采集信息的函数,即采集项目大小size,工时time,人力n def myinput(): choice = input('请选择计算类型:(1-工时计算,2-人力计算)') if choice == '1': size = float(input('请输入项目大小:(1代表标准大小,请输入小数)')) number = int(input('请输入人力数量:(请输入整数)')) time = None return size,number,time # 这里返回的数据是一个元组(size,number,time) if choice == '2': size = float(input('请输入项目大小:(1代表标准大小,请输入小数)')) number = None time = float(input('请输入工时数量:(请输入小数)')) return size,number,time # 这里返回的是一个元组(size,number,time)
# 完成计算的函数 def estimated(my_input): # 把元组(size,number,time)中的数据取出来 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个工时完成,则需要人力数量为:%d人' %(size,time,number)) # 工时计算 elif (number != None) and (time == None): time = size * 80 / number print('项目大小为%.1f个标准项目,使用%d个人力完成,则需要工时数量为:%.1f个' %(size,number,time))
# 询问是否继续的函数 def again(): # 声明key为全局变量,以便在函数内部可以修改原来的全局变量key的值 global key a = input('是否继续计算?继续请输入y,输入其他键将结束程序。') if a != 'y': # 如果用户不输入'y',则把key赋值为0 key = 0
# 主函数 def main(): print('欢迎使用工作量计算小程序!') #因为第四行便赋值1给变量key,然后又没有修改过key的值,所以判断为真,进入循环 while key == 1: 调用函数myinput并将返回值元组(size,number,time)赋值给my_input my_input = myinput() estimated(my_input) #直接调用函数again again() print('感谢使用工作量计算小程序!') #调用函数main。需要注意的是:代码是一行行从上往下执行,但是以上只是封装了各个函数,没有调用的情况下函数是不会运行的。 main()
第11关 bug1:粗心 #赋值0给变量n,避免判断n<3时出现n未定义的报错 n=0 #进入循环共循环三次,n=0时循环第一次,n=1时循环第二次,n=2时循环第三次,n=3时跳出循环 while n<3: username = input('请输入用户名:') password = input('请输入密码:') #注意“==”用于判断,“=”用于赋值 if username == 'abc' and password == '123': print('登录成功') break #当登录成功时,用break跳出循环 #以下这个else和if同级,是对应关系。如果用户名和密码有一个不匹配,那么执行slse语句,并使得n的值增加1,以便n增加3次成为3时跳出循环。 else: n=n+1 print('输入有误') #以下这个else和while同级,是对应关系,当while的条件不满足时就执行以下语句。 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中,则执行以下代码。 print(name+'出演了电影'+i) #方法一: import random
all = ['正面','反面'] guess = '' #这一句也可以省去,但是要培养使用变量前定义变量的好习惯。 while guess not in all: #当变量guess的值不在all列表中时,则执行以下代码 print('------猜硬币游戏------') print('猜一猜硬币是正面还是反面?') guess = input('请输入“正面”或“反面”:')
toss = all[random.randint(0,1)] #random.randint()代码可以随机取出某区间的一个整数,在这里表示随机取出0或1[]。假设随机取出0,则all[0]表示电脑从列表all中取出偏移量为0的“正面”;假设随机取出1,则all[1]表示电脑从列表all中取出偏移量为1的“反面”。
if toss == guess: #假设电脑的选择和你的选择相等,则猜对了。在此要注意双等号“==”表示判断,单等号“=”表示赋值。 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:')) #由于前面的代码已经将“正面”和“反面”分别当成0和1,那么在外部输入的就应该是0或1,注意要将字符串类型转换为数字类型。
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:被动掉坑 #直接进入循环 while True: try: #从外部获取年龄 age = int(input('你今年几岁了?')) #获取到年龄后直接跳出循环 break #当获取年龄发生错误时执行以下代码 except ValueError: print('你输入的不是数字!') #如果获取到的年龄小于18岁,那么就打印出“不可以喝噢” if age < 18: print('不可以喝酒噢') num = [1,2,0,3] #从num列表中遍历出每一个数字。需要注意的是:“for x in num”中的x也可以替换为i,其实这只是一个普通变量名罢了 for x in num: try: #尝试执行下列代码 print (6/x) #使用6除以num中的元素,并打印 except ZeroDivisionError: #如果发生ZeroDivisionError报错,执行下列代码: print('0是不能做除数的!') #打印“0是不能做除数的!”
第12关 1.类与对象 2.类的创建和调用 class Computer: #电脑类,都有屏幕,所以属性screen的值为布尔值True screen = True def start(self): print('电脑正在开机中……') my_computer = Computer() #computer类的实例化 print(my_computer.screen) my_computer.start() 3.创建类的两个关键点 class Chinese:
name = '吴枫' # 类属性name
def say(self): print(self.name + '是中国人')
person = Chinese() # 创建Chinese的实例person person.say() # 调用实例方法 class Chinese: #外部调用born函数,需要传入参数name,birthplace def born(self, name, birthplace): print(name + '出生在' + birthplace) #外部调用live函数,需要传入参数nemr,region def live(self, name, region): print(name + '居住在' + region)
person = Chinese() person.born('吴枫','广东') person.live('吴枫','深
class Chinese: #初始化方法在类实例化后会自动执行,省却了外部调用函数时重复传参的烦扰,具体可以对比上一个代码 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('吴枫','广东','深圳') # 传入初始化方法的参数 person.born() person.live() 4.面向对象编程 #创建类的一个好处是:类中的属性可以直接调用,不用考虑全局变量和局部变量的问题 class Project: def __init__(self): self.key = 1
def input(self): choice = input('请选择计算类型:(1-工时计算,2-人力计算)') if choice == '1': self.size = float(input('请输入项目大小:(1代表标准大小,请输入小数)')) self.number = int(input('请输入人力数量:(请输入整数)')) self.time = None if choice == '2': self.size = float(input('请输入项目大小:(1代表标准大小,请输入小数)')) self.number = None self.time = float(input('请输入工时数量:(请输入小数)'))
def estimated(self): # 人力计算 if (self.number == None) and (self.time != None): self.number = math.ceil(self.size * 80 / self.time) print('项目大小为%.1f个标准项目,如果需要在%.1f个工时完成,则需要人力数量为:%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个人力完成,则需要工时数量为:%.1f个' %(self.size,self.number,self.time)) def again(self): a = input('是否继续计算?继续请输入y,输入其他键将结束程序。') if a != 'y': # 如果用户不输入'y',则把key赋值为0 self.key = 0
# 主函数 def main(self): print('欢迎使用工作量计算小程序!') while self.key == 1: self.input() self.estimated() self.again() print('感谢使用工作量计算小程序!')
project1 = Project() #创建实例 project1.main() 第13关 class Chinese: # 类的创建 eye = 'black' # 类属性的创建
def __init__(self,hometown): # 类的初始化方法 self.hometown = hometown # 实例属性的创建 print('程序持续更新中……') # 初始化中的语句 def born(self): # 实例方法的创建 print('我生在%s。'%(self.hometown)) # 方法的具体语句
wufeng = Chinese('广东') # 类的实例化 print(wufeng.eye) # 打印实例的属性(从类传递的) wufeng.born() # 实例方法的调用 1.类的继承和定制是什么? 2类的继承,要怎么写? 继承的基础语法 class Chinese: #因为眼睛是黑色的,所以将字符串'black'赋值给eye eye = 'black'
def eat(self): print('吃饭,选择用筷子。') # 通过继承,Chinese类有的,Cantonese类也有 class Cantonese(Chinese): #pass表示跳过,不执行其它操作。子类继承父类过程中,当子类不改变或增加任何属性或方法,应在类的内部写上pass,避免报错 pass # 验证子类可以继承父类的属性和方法,进而传递给子类创建的实例 yewen = Cantonese() # 子类创建的实例,从子类那间接得到了父类的所有属性和方法 print(yewen.eye) # 子类创建的实例,可调用父类的属性 yewen.eat() # 子类创建的实例,可调用父类的。注意调用函数时需要加上括号 class Cat: #因为猫都有尾巴,所以将布尔值True赋值给属性tail tail = True def say(self): print('喵喵喵喵喵~') class Ragdoll(Cat): #pass表示跳过,不执行任何操作。子类继承父类过程中,当子类不改变或增加任何属性或方法,应在类的内部写上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属性,根据“多重继承中,若某父类还有父类的话,会先继续往上找到顶。”,因此打印出C0的name属性。 print(ins.num) # 打印出1 3.类的定制,要怎么写? 定制,可以新增代码 定制,也可重写代码 class Chinese:
def land_area(self,area): print('我们居住的地方,陆地面积是%d万平方公里左右。'% area)
class Cantonese(Chinese): # 间接对方法进行重写,增加了默认参数rete=0.0188 def land_area(self, area, rate = 0.0188): #调用父类Chinese的方法land_area。这里需要注意的是:下面的这个area和父类的area不是同一个变量,只是说变量名相同罢了。父类的area实际上是下面的 area * rate。以下代码是简写形式,如果补充完整是“ print('我们居住的地方,陆地面积是%d万平方公里左右。'% area*rate)”。如果此处难以理解,可以将调用时传入的具体数值代入理解。 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): #以下代码是类初始化方法的定制,更改了父类的默认参数greeting和place。 def __init__(self, greeting = '雷猴', place = '广东'): #这行代码用于调用父类的初始化函数,并将参数'雷猴'和'广东'传递给父类初始化函数。 Chinese.__init__(self, greeting, place) yewen = Cantonese() yewen.greet() 
|