练习题和综合案例:
练习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=\'\t\')
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()