打开APP
userphoto
未登录

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

开通VIP
第10-11关课后习题讲解

第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是不能做除数的!”

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
山腰课程代码解析(每天补充)
python中写一个求阶乘的函数
从scratch到python——猜数游戏
监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法
循环内的回调函数
UC头条:Python学习笔记整理之输入输出、python eval函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服