练习题
1.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
from functools import reduce
def cal_sum():
fenzi = 2
fenmu = 1
lst = [2]
for i in range(1,20):
fenmu,fenzi= fenzi,fenmu+fenzi
lst.append(fenzi / fenmu)
return reduce(lambda x,y:x+y,lst)
print(cal_sum())
2.给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
def num_reverse(num):
print(' '.join(str(num)))
numLen = len(str(num))
print(numLen)
for i in range(numLen):
toPrint = num % 10
num = int((num - toPrint)/10)
print(toPrint,end=' ')
num_reverse(9523684)
3.有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
def who_remain(n):
lst = list(range(1, n+1))
while n > 2:
lst.pop(2)
before = lst[:2]
lst = lst[2:]
lst.extend(before)
n = len(lst)
return lst[-1]
print(who_remain(29))
4.题:编写一个程序,根据控制台输入的事务日志计算银行帐户的净金额。 事务日志格式如下所示:
D 100
W 200
D表示存款,而W表示提款。
假设为程序提供了以下输入:
D 300
D 300
W 200
D 100
然后,输出应该是:
500
netAmount = 0
while True:
print("请输入:")
s = input()
if not s:
break
values = s.split(" ")
operation = values[0]
amount = int(values[1])
if operation=="D":
netAmount+=amount
elif operation=="W":
netAmount-=amount
else:
pass
print (netAmount)
5.机器人从原点(0,0)开始在平面中移动。 机器人可以通过给定的步骤向上,向下,向左和向右移动。 机器人运动的痕迹如下所示:
UP 5
DOWN 3
LETF 3
RIGHT 2
方向之后的数字是步骤。 请编写一个程序来计算一系列运动和原点之后距当前位置的距离。如果距离是浮点数,则只打印最接近的整数。
例:如果给出以下元组作为程序的输入:
UP 5
DOWN 3
LETF 3
RIGHT 2
然后,程序的输出应该是:2
import math
pos = [0, 0]
print("请输入:")
while True:
s = input()
if not s:
break
movement = s.split(" ")
direction = movement[0]
steps = int(movement[1])
if direction == "UP":
pos[0] += steps
elif direction == "DOWN":
pos[0] -= steps
elif direction == "LEFT":
pos[1] -= steps
elif direction == "RIGHT":
pos[1] += steps
else:
pass
print(int(round(math.sqrt(pos[1] ** 2 + pos[0] ** 2))))
6.判断用户输入的变量名是否合法:
1)变量名可以由字母,数字或者下划线组成
2)变量名只能以字母或者下划线开头
分析:
1))判断变量名的第一个元素是否为字母或者下划线 s[0]
2))如果第一个元素符合条件,判断除了第一个元素之外的其他元素s[1:]
while True:
s = input('变量名:')
if s == 'q':
exit()
# 判断首字母是否符合变量名要求
if s[0] == '_' or s[0].isalpha():
# 依次判断剩余的所有字符
for i in s[1:]:
# 只要有一个字符不符合,便不是合法的变量;alnum表示字母或数字
if not (i.isalnum() or i == '_'):
print('%s不是一个合法的变量名' % s)
break
else:
print('%s是一个合法的变量名' % s)
else:
print('%s不是一个合法的变量名' % s)
7.给定一个字符串来代表一个学生的出勤纪录,这个纪录仅包含以下三个
字符:
'A' : Absent,缺勤
'L' : Late,迟到
'P' : Present,到场
如果一个学生的出勤纪录中不超过一个'A'(缺勤)并且不超过两个连续的'L'(迟到),
那么这个学生会被奖赏。
你需要根据这个学生的出勤纪录判断他是否会被奖赏。
示例 1:
输入: "PPALLP"
输出: True
示例 2:
输入: "PPALLL"
输出: False
print("""
出勤记录规则
'A' : Absent 缺勤
'L' : Late 迟到
'P' : Present 到场
""")
while True:
c = input('请输入考勤记录:')
# count() 表示指定字符出现的次数
if c.count('A') <= 1 and c.count('LLL') == 0 and c != 'q':
print('True')
elif c == 'q':
exit()
else:
print('False')
8..输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例
如,输入”They are students.”和”aeiou”,
则删除之后的第一个字符串变成”Thy r stdnts.”
输入描述:
每个测试输入包含2个字符串
输出描述:
输出删除后的字符串
示例1:
输入
They are students.
aeiou
输出
Thy r stdnts.
s1 = input('s1:')
s2 = input('s2:')
# 遍历字符串s1
for i in s1:
# 依次判断s1中的每个字符是否在s2中
if i in s2:
# replace 表示替换;
# 将s1中与s2中相同的所有字符,替换为空字符
s1 = s1.replace(i,'')
print(s1)
9.编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.
# 1.定义函数; *args:可变参数
def cacluate(*args):
# 2.计算平均值; args的数据类型为元组,sum求和
average = sum(args) / len(args)
# 3.将所有大于平均值数的值存入列表
list=[]
for i in args:
if i > average:
list.append(i)
# 4.将平均值和列表元素存入元组
tuple=(average,list)
return tuple
print(cacluate(1,1,2,3,4))
10.编写一个函数, 接收字符串参数, 返回一个元组,
元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
例如
输入:'hello WORLD'
输出:(5,5)
# 直接在函数里print输出,在调用函数时只能打印不能使用
# 如果想要使用函数里的变量值,此时需要在定义函数时用return返回函数值
def fun(c):
# 记录大写字母个数
upper = 0
# 记录小写字母个数
lower = 0
# 统计大小写字母的个数
for i in c:
if i.isupper():
upper += 1
# 注意:不能用else,因为字符串之间有空格
if i.islower():
lower += 1
tuple = (upper,lower)
# 函数返回值
return tuple
# 此时直接调用函数将不会有输出值,必须用print输出
print(fun(input('请输入字符串:')))
11.编写函数, 接收一个列表(包含30个1~100之间的随机整形数)
和一个整形数k, 返回一个新列表.
函数需求:
- 将列表下标k之前对应(不包含k)的元素逆序;
- 将下标k及之后的元素逆序;
# 导入生成随机数的包
import random
# 定义空列表
list = []
# 生成30个随机数
for i in range(30):
num = random.randint(1,100)
# 将生成的随机数添加到列表中
list.append(num)
# 打印原始列表
print(list)
# 定义函数
def fun(list,k):
# k表示下标
if k < 0 or k >= len(list):
print('error key')
else:
# [:k] k之前的元素 [::-1] 逆序 + 连接
return list[:k][::-1] + list[k:][::-1]
print(fun(list,3))
12.模拟轮盘抽奖游戏
轮盘分为三部分: 一等奖, 二等奖和三等奖;
轮盘转的时候是随机的,
如果范围在[0,0.08)之间,代表一等奖,
如果范围在[0.08,0.3)之间,代表2等奖,
如果范围在[0.3, 1.0)之间,代表3等奖,
模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.
import random
# 定义(得奖情况)字典
rewardDict ={'一等奖':(0,0.08),'二等奖':(0.08,0.3),'三等奖':(0.3,1.0)}
# 判断用户是否得奖
def rewardfun():
num = random.random()
# 遍历key-value
for k,v in rewardDict.items():
if num >= v[0] and num < v[1]:
return k
# 定义空字典
resultDict = {}
# 将得奖记录添加到字典中,记录1000人玩游戏的得奖情况
for i in range(1000):
# 将函数的返回值赋给reskey
reskey = rewardfun()
# print(reskey)
if reskey not in resultDict:
# 增加元素
resultDict[reskey] = 1
else:
resultDict[reskey] += 1
# 遍历输出字典的 key-value值
for k,v in resultDict.items():
print(k,'---->',v)
13.题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 12 + 32 = 10
f(207) = 22 + 02 + 72 = 53
下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
且kf(n)=n
输入:
第一行包含3个正整数k,a, b, k>=1, a,b<=10*18, a<=b;
输出:
输出对应的答案;
范例:
输入: 51 5000 10000
输出: 3
# 1.接收用户输入
k = int(input('k='))
a = int(input('a='))
b = int(input('b='))
# 2.定义函数,计算f
def fun(c):
f = 0
for i in str(c):
f += int(i)**2
return f
# fun(207)
# 定义计数器
count = 0
# 3.统计满足条件的n的个数
for n in range(a,b+1):
if k * fun(n) == n:
print(n,fun(n))
count += 1
# 打印个数
print(count)
14.综合练习
1.地铁站编号和站名对应关系如下:
1=朱辛庄
2=育知路
3=平西府
4=回龙观东大街
5=霍营
//....
遍历打印(可以不按顺序打印):
第10站: 森林公园南门
第6站: 育新
第12站: 奥体中心
第13站: 北土城
//...
2.计算地铁票价规则:
总行程 3站内(包含3站)收费3元,
3站以上但不超过5站(包含5站)的收费4元,
5站以上的,在4元的基础上,每多1站增加2元,
10元封顶;
3.打印格式(需要对键盘录入的上车站和到达站进行判断,如果没有该站,提示重新输入,直到站名存在为止):
注意:每站需要2分钟
请输入上车站:
沙河
您输入的上车站:沙河不存在,请重新输入上车站:
上地
您输入的上车站:上地不存在,请重新输入上车站:
朱辛庄
请输入到达站:
沙河
您输入的到达站:沙河不存在,请重新输入到达站:
西二旗
您输入的到达站:西二旗不存在,请重新输入到达站:
西小口
从朱辛庄到西小口共经过6站收费6元,大约需要 12分钟
st = """十三号街站 05:30 23:00 —— ——
中央大街站 05:31 23:01 06:28 23:47
七号街站 05:33 23:03 06:26 23:45
四号街站 05:36 23:06 06:24 23:42
张士站 05:38 23:08 06:21 23:40
开发大道站 05:41 23:11 06:19 23:37
于洪广场站 05:43 23:13 06:16 23:35
迎宾路站 05:46 23:16 06:14 23:33
重工街站 05:48 23:18 06:11 23:30
启工街站 05:51 23:21 06:09 23:28
保工街站 05:53 23:23 06:07 23:26
铁西广场站 05:55 23:25 06:04 23:23
云峰北街站 05:58 23:28 06:02 23:21
沈阳站 06:01 23:31 06:00 23:18
太原街站 06:03 23:33 06:16 23:16
南市场站 06:05 23:35 06:13 23:13
青年大街站 06:07 23:37 06:11 23:11
怀远门站 06:10 23:40 06:09 23:09
中街站 06:13 23:43 06:06 23:06
东中街站 06:15 23:45 06:04 23:04
滂江街站 06:17 23:47 06:01 23:01
黎明广场站 —— —— 06:00 23:00"""
lst = st.split()
llsstt = list(filter(lambda x : '站' in x,lst))
print(llsstt)
while True:
upstation = input('请输入上车站:')
if upstation not in llsstt:
print(f'您输入的上车站:{upstation}不存在,请重新输入上车站')
upstation_idx = llsstt.index(upstation)
downstation = input('请输入下车站:')
if downstation not in llsstt:
print(f'您输入的下车站:{upstation}不存在,请重新输入下车站')
else:
downstation_idx = llsstt.index(downstation)
if downstation_idx < upstation_idx:
print('下车站必须在上车站之后')
else:
break
diff = downstation_idx - upstation_idx
price = 0
if diff <= 3:
price = 3
elif diff <= 5:
price = 4
else:
price = 4 + (diff - 5)*2
if price > 10:
price = 10
print(f'从{upstation}到{downstation}共经过{diff}站收费{price}元,大约需要{diff*2}分钟')
15.谁拿了最多的奖学金
问题描述
某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:
院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;
五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;
成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;
西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;
班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;
只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。
基本要求
现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。
输入数据格式格式:
输入的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。
输出数据格式:
输出包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。
输入
4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1
输出
ChenRuiyi
9000
28700
# 4
# YaoLin 87 82 Y N 0
# ChenRuiyi 88 78 N Y 1
# LiXin 92 88 N N 0
# ZhangQin 83 87 Y N 1
num = int(input('请输入学生数量:'))
std_dict = {}
for i in range(num):
line = input(f'请输入第{i+1}名学生信息')
stu_lst = line.split(' ')
std_dict[stu_lst[0]] = stu_lst[1:]
# print(std_dict)
reward_dict = {}
#开始计算每一位学生的奖学金
for stu_name,stu_info in std_dict.items():
if int(stu_info[0]) > 80 and int(stu_info[4]) > 0:
reward_dict[stu_name] = reward_dict.get(stu_name,0) + 8000
if int(stu_info[0]) > 85 and int(stu_info[1]) > 80:
reward_dict[stu_name] = reward_dict.get(stu_name, 0) + 4000
if int(stu_info[0]) > 90:
reward_dict[stu_name] = reward_dict.get(stu_name, 0) + 2000
if int(stu_info[0]) > 85 and stu_info[3] == 'Y':
reward_dict[stu_name] = reward_dict.get(stu_name, 0) + 1000
if int(stu_info[1]) > 80 and stu_info[2] == 'Y':
reward_dict[stu_name] = reward_dict.get(stu_name, 0) + 850
sum = 0
max = 0
max_stu = ''
for stu_name,money in reward_dict.items():
if max < money:
max = money
max_stu = stu_name
sum += money
print(max_stu)
print(max)
print(sum)