python头歌练习题三

1.list

1.1employee_list_removal
def print_employees(employees):
    number_of_employees = len(employees)
    print(f'There are {number_of_employees} employees:')
    for employee in employees:
        print(employee)

employees = ['John Smith', 'Jakie Jackson', 'Chris Jones', 'Amanda Cullen'] 

print_employees(employees)

employee_name = input('Enter an employee name to remove: ')
employees = [employee for employee in employees if employee!= employee_name]

print_employees(employees)

1.2picking_a_winner
import random
random.seed(42)  # 设置种子保证程序可重复

names = list()   # 初始化空的姓名列表

# 获取输入的第一个名字
while True:
    employee_name = input('Enter a name: ')
    if len(employee_name) > 0:
        names.append(employee_name)
        break
    else:
        print('A valid input is required')

# 获取输入的其他名字
while True:
    employee_name = input('Enter a name: ')
    if len(employee_name) > 0:
        names.append(employee_name)
    else:
        break

winner_name = random.choice(names)

print('The winner is... ', winner_name)
1.3computing_statistics
# 定义获取第一个有效响应时间值的函数
def get_first_number():
    while True:
        try:
            number = input('Enter a number: ')
            number = int(number)
            return number
        except ValueError:
            print('A valid input is required')

# 定义获取一个响应时间值或'done'字符串的函数
def get_data():
    while True:
        try:
            number = input('Enter a number: ')
            number = int(number)
            return number
        except ValueError:
            if number == 'done':
                return number
            else:
                print('A valid input is required')

# 定义按格式打印所有响应时间的函数
def print_numbers(numbers):    
    print('Numbers:', end=' ')
    for i, num in enumerate(numbers):
        if i > 0:
            print(', ', end='')
        print(num, end='')
    print()

# 主流程
numbers = list() # 初始化空的数值列表

# 补充代码实现调用函数获取输入的第一个响应时间值,并添加到数值列表中
first_number = get_first_number()
numbers.append(first_number)

# 补充代码实现循环调用函数获取响应时间值,并添加到数值列表中
while True:
    number = get_data()
    if number == 'done':
        break
    else:
        numbers.append(number)

# 调用函数按格式打印所有响应时间数据
print_numbers(numbers)

# 计算响应时间的均值、最小值和最大值并打印
average = sum(numbers) / len(numbers)
print('The average is ', average)
minimum = min(numbers)
print(f'The minimum is ', minimum)
maximum = max(numbers)
print(f'The maximum is ', maximum)

2.dict

2.1sorting_records
# 定义函数
# 定义确定每列信息最大长度函数
def get_max_len(users):
     # 以列名长度初始化每列打印信息最大长度
     max_len = {'first_name': len('first_name'),
                'last_name': len('last_name'),
                'position': len('position'),
                'separation_date': len('separation_date')
                }
     # 补充代码实现循环用户信息,更新最大长度值
     for item in users:
         for key in max_len.keys():
             if key in item:
                 max_len[key] = max(max_len[key], len(item[key]))
     return max_len

# 定义打印表头函数
def print_headings(max_len):
     for key, value in max_len.items():
         end_spaces = ' ' * (value - len(key))   # 补充代码实现列名后补空格到和最长信息同长
         print(key,end_spaces, end='|')   # 输出列名栏:列名+空格+|
     # 一行结束打印换行符
     print()

     # 补充代码实现表头与内容行间插一行连字符
     for key, value in max_len.items():
         print('-' * (value + 1), end='|')   # 输出连字符行:连字符+|

     # 一行结束打印换行符
     print()

# 定义按列表排列顺序逐行打印用户信息函数
def print_users(users, max_len):
     for user in users:
         for key in max_len.keys():
             if key in user:
                 end_spaces = ' ' * (max_len[key] - len(user[key]))
                 print(user[key], end_spaces, end='|')
             else:
                 print(' ' * max_len[key], end='|')   # 如果某列没有信息,打印空格
         # 一行结束打印换行符
         print()

def main():
     # 1.初始化用户信息列表
     users = [
         {'first_name': 'John', 'last_name': 'Johnson', 'position': 'Manager', 'separation_date': '2016-12-31'},
         {'first_name': 'Tou', 'last_name': 'Xiong', 'position': 'Software Engineer', 'separation_date': '2016-10-05'},
         {'first_name': 'Michaela', 'last_name': 'Michaelson', 'position': 'District Manage', 'separation_date': '2015-12-19'},
         {'first_name': 'Jake', 'last_name': 'Jacobson', 'position': 'Programmer', 'separation_date': ''},
         {'first_name': 'Jacquelyn', 'last_name': 'Jackson', 'position': 'DBA', 'separation_date': ''},
         {'first_name': 'Sally', 'last_name': 'Weber', 'position': 'Web Developer', 'separation_date': '2015-12-18'}
     ]
 # 2.借助函数对用户信息列表依据last_name进行从小到大排序
     def get_last_name(item):
         return item['last_name']
     sorted_users = sorted(users, key=get_last_name)   # 补充代码实现对users排序

     # 3.打印信息
     #3.1 确定每列信息最大长度
     max_len = get_max_len(sorted_users)

     #3.2 打印表头
     print_headings(max_len)

     # 3.3 按列表排列顺序逐行打印用户信息
     print_users(sorted_users, max_len)


if __name__ == "__main__":
     main()
2.2 Monty_Hall
import random
random.seed(38)  # 设置种子保证程序可重复

# 定义初始化门的函数
def init():
    '''返回一个字典,键为 3 个门号(0,1,2),值为门后面的物品 goat car'''
    result = {i: 'goat' for i in range(3)}
    r = random.randint(0, 2)
    result[r] = 'car'
    return result

# 定义获取玩家初始选择的门号的函数
def get_firstDoorNum():
    while True:
        try:
            firstDoorNum = int(input('请选择一个门号(0,1,2):'))
            assert firstDoorNum in [0, 1, 2]
            return firstDoorNum
        except:
            print('门号必须在0和2之间')

def PlayGame():
    # 获取本次游戏中每个门的情况
    doors = init()
    # 获取玩家选择的门号
    firstDoorNum = get_firstDoorNum()
    # 主持人打开剩下有山羊的一扇门
    for host_opens in range(3):
        if host_opens!= firstDoorNum and doors[host_opens] == 'goat':
            print(host_opens,'号门后是"goat"')
            break
    # 获取第三个门号,让玩家纠结
    for thirdDoor in range(3):
        if thirdDoor!= firstDoorNum and thirdDoor!= host_opens:
            break
    # 获取玩家是否切换输入
    change = input('切换到%d号门?(y/n)'%(thirdDoor))
    finalDoorNum = thirdDoor if change == 'y' else firstDoorNum
    if doors[finalDoorNum] == 'goat':
        print('你失败了!')       # 玩家失败
    else:
        print('你赢了!')    # 玩家赢

while True:
    print('='*30)
    PlayGame()
    r = input('你要再玩一次游戏吗?(y/n)')
    if r == 'n':
        break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值