练习题和综合案例:
练习1:在屏幕上显示跑马灯文字
练习2:设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成。
练习3:设计一个函数返回给定文件名的后缀名。
练习4:设计一个函数返回传入的列表中最大和第二大的元素的值。
练习5:计算指定的年月日是这一年的第几天
练习6:打印杨辉三角。
练习7:输入学生考试成绩计算平均分
练习8:生成斐波拉切数列
练习9:找出列表中最大或最小的元素
练习10:学生考试成绩表
案例1:双色球选号
综合案例2:约瑟夫环问题
综合案例3:井字棋游戏
答案:
练习1:
""" 跑马灯 """ import os import time def main(): content = '北京欢迎你为你开天辟地…………' while True: # 清理屏幕上的输出 os.system('cls') # os.system('clear') print(content) # 休眠200毫秒 time.sleep(0.2) content = content[1:] + content[0] if __name__ == '__main__': main()
""" 成绩页面跑马灯 """ import os import time def main(): str = 'Welcome to 1000 Phone Chengdu Campus ' while True: print(str) time.sleep(0.2) str = str[1:] + str[0:1] # for Windows use os.system('cls') instead os.system('clear') if __name__ == '__main__': main()
练习2:
""" 产生指定长度的验证码,验证码由大小写字母和数字构成 """ import random def generate_code(code_len=4): """ 生成指定长度的验证码 :param code_len: 验证码的长度(默认4个字符) :return: 由大小写英文字母和数字构成的随机验证码 """ all_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' last_pos = len(all_chars) - 1 code = '' for _ in range(code_len): index = random.randint(0, last_pos) code += all_chars[index] return code
练习3:
""" 返回给定文件名的后缀名 """ def get_suffix(filename, has_dot=False): """ 获取文件名的后缀名 :param filename: 文件名 :param has_dot: 返回的后缀名是否需要带点 :return: 文件的后缀名 """ pos = filename.rfind('.') if 0 < pos < len(filename) - 1: index = pos if has_dot else pos + 1 return filename[index:] else: return ''
练习4:
""" 返回传入的列表中最大和第二大的元素的值 """ def max2(x): m1, m2 = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0]) for index in range(2, len(x)): if x[index] > m1: m2 = m1 m1 = x[index] elif x[index] > m2: m2 = x[index] return m1, m2
我自己写的,感觉比较简单
def maxnum(x): list1 = x maxfirst = max(list1) list1.pop() maxsecond = max(list1) return maxfirst,maxsecond list =[1,2,3,4,5,6] num = maxnum(list) print(num)
练习5:
""" 计算指定的年月日是这一年的第几天 """ def is_leap_year(year): """ 判断指定的年份是不是闰年 :param year: 年份 :return: 闰年返回True平年返回False """ return year % 4 == 0 and year % 100 != 0 or year % 400 == 0 def which_day(year, month, date): """ 计算传入的日期是这一年的第几天 :param year: 年 :param month: 月 :param date: 日 :return: 第几天 """ days_of_month = [ [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ][is_leap_year(year)] total = 0 for index in range(month - 1): total += days_of_month[index] return total + date def main(): print(which_day(1980, 11, 28)) print(which_day(1981, 12, 31)) print(which_day(2018, 1, 1)) print(which_day(2016, 3, 1)) if __name__ == '__main__': main()
练习6:
""" 输出10行的杨辉三角 - 二项式的n次方展开系数 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 ... ... ... """ def main(): num = int(input('Number of rows: ')) yh = [[]] * num for row in range(len(yh)): yh[row] = [None] * (row + 1) for col in range(len(yh[row])): if col == 0 or col == row: yh[row][col] = 1 else: yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1] print(yh[row][col], end=' ') print() if __name__ == '__main__': main()
练习7:
""" 输入学生考试成绩计算平均分 """ def main(): number = int(input('请输入学生人数: ')) names = [None] * number scores = [None] * number for index in range(len(names)): names[index] = input('请输入第%d个学生的名字: ' % (index + 1)) scores[index] = float(input('请输入第%d个学生的成绩: ' % (index + 1))) total = 0 for index in range(len(names)): print('%s: %.1f分' % (names[index], scores[index])) total += scores[index] print('平均成绩是: %.1f分' % (total / number)) if __name__ == '__main__': main()
练习8:
""" 生成斐波拉切数列 """ def main(): f = [1 , 1] for i in range(2, 20): f += [f[i - 1] + f[i - 2]] # f.append(f[i - 1] + f[i - 2]) for val in f: print(val, end=' ') if __name__ == '__main__': main()
练习9:
""" 找出列表中最大或最小的元素 """ def main(): fruits = ['grape', 'apple', 'strawberry', 'waxberry', 'pitaya'] # 直接使用内置的max和min函数找出列表中最大和最小元素 # print(max(fruits)) # print(min(fruits)) max_value = min_value = fruits[0] for index in range(1, len(fruits)): if fruits[index] > max_value: max_value = fruits[index] elif fruits[index] < min_value: min_value = fruits[index] print('Max:', max_value) print('Min:', min_value) if __name__ == '__main__': main() # 想一想如果最大的元素有两个要找出第二大的又该怎么做
练习10:
""" 学生考试成绩表 """ def main(): names = ['关羽', '张飞', '赵云', '马超', '黄忠'] subjs = ['语文', '数学', '英语'] scores = [[0] * 3] * 5 for row, name in enumerate(names): print('请输入%s的成绩' % name) for col, subj in enumerate(subjs): scores[row][col] = float(input(subj + ': ')) print(scores) # for row, name in enumerate(names): # print('请输入%s的成绩' % name) # scores[row] = [None] * len(subjs) # for col, subj in enumerate(subjs): # score = float(input(subj + ': ')) # scores[row][col] = score # print(scores) if __name__ == '__main__': main()
案例1:
""" 双色球随机选号程序 """ from random import randrange, randint, sample def display(balls): """ 输出列表中的双色球号码 """ for index, ball in enumerate(balls): if index == len(balls) - 1: print('|', end=' ') print('%02d' % ball, end=' ') print() def random_select(): """ 随机选择一组号码 """ red_balls = [x for x in range(1, 34)] selected_balls = [] for _ in range(6): index = randrange(len(red_balls)) selected_balls.append(red_balls[index]) del red_balls[index] # 上面的for循环也可以写成下面这行代码 # sample函数是random模块下的函数 # selected_balls = sample(red_balls, 6) selected_balls.sort() selected_balls.append(randint(1, 16)) return selected_balls def main(): n = int(input('机选几注: ')) for _ in range(n): display(random_select()) if __name__ == '__main__': main()
案例2:
""" 《幸运的基督徒》 有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。 """ def main(): persons = [True] * 30 counter, index, number = 0, 0, 0 while counter < 15: if persons[index]: number += 1 if number == 9: persons[index] = False counter += 1 number = 0 index += 1 index %= 30 for person in persons: print('基' if person else '非', end='') if __name__ == '__main__': main()
案例3:
""" 井字棋游戏 """ import os def print_board(board): print(board['TL'] + '|' + board['TM'] + '|' + board['TR']) print('-+-+-') print(board['ML'] + '|' + board['MM'] + '|' + board['MR']) print('-+-+-') print(board['BL'] + '|' + board['BM'] + '|' + board['BR']) def main(): init_board = { 'TL': ' ', 'TM': ' ', 'TR': ' ', 'ML': ' ', 'MM': ' ', 'MR': ' ', 'BL': ' ', 'BM': ' ', 'BR': ' ' } begin = True while begin: curr_board = init_board.copy() begin = False turn = 'x' counter = 0 os.system('clear') print_board(curr_board) while counter < 9: move = input('轮到%s走棋, 请输入位置: ' % turn) if curr_board[move] == ' ': counter += 1 curr_board[move] = turn if turn == 'x': turn = 'o' else: turn = 'x' os.system('clear') print_board(curr_board) choice = input('再玩一局?(yes|no)') begin = choice == 'yes' if __name__ == '__main__': main()