打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
山腰课程代码解析(每天补充)

第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函数,并且更改了默认参数sizenumber的值,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,numbertime)赋值给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跳出循环
#以下这个elseif同级,是对应关系。如果用户名和密码有一个不匹配,那么执行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()代码可以随机取出某区间的一个整数,在这里表示随机取出01[]。假设随机取出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:'))
#由于前面的代码已经将“正面”和“反面”分别当成01,那么在外部输入的就应该是01,注意要将字符串类型转换为数字类型。

toss = random.randint(0,1)
#利用random.randint()语法随机取出01并赋值给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()

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
第10-11关课后习题讲解
循环内的回调函数
【Python基础语法】参考 卡西
python中写一个求阶乘的函数
python3实例 函数形式判断闰年
监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服