函数基础练习(Python)
01.计算车费
题目描述
小红打车,起步价8元(3公里), 每公里收费 2 元,她打车行驶了 n 公里,通过函数封装并计算车费
输入描述
输入一个公里数
输出描述
输出应付车费
示例
输入:
5
输出:
12
def expenses(n):
"""收费行为"""
n = int(n)
total_expense = ""
# 判断行驶公里数是否大于三公里
if n <= 3:
# 计算总收费
total_expense = 8
else:
# 计算总收费
total_expense = (n - 3) * 2 + 8
# 返回结果数据
return total_expense
# 提示输入公里数
km = input("请输入公里数:")
# 调用函数
total = expenses(km)
print(f"行驶{km}公里应付车费为{total}")
02.整数叠加
题目描述
读取一个0到1000之间的整数,并计算它各位数字之和
输入输出描述
输入一个[0,1000]之间的整数
输出该数字的各位数字之和
提示
需要使用内置函数 len() 或者 for循环
示例1
输入:
999
输出:
27
解释:
999各位数之和为9 + 9 + 9 = 27
"""整数叠加"""
def calculate_digit_sum(n):
"""整数看加函数,将一个数据拆分每个数字进行叠加"""
#将整数转化成字符串
n = str(n)
# 声明变量,存储数据的和
total = 0
# 遍历字符申n,获取每个字符数字
for c in n:
total += int(c)
return total
#调用函数
n=input("请输入一个数:")
total_sum=calculate_digit_sum(n)
print("各位数之和:",total_sum)
03.时间拆分
题目描述
输入分钟数,然后将该分钟数转换为年数和天数,假定一年有365天
输入描述
输入一个分钟数
输出描述
输出两行,第一行为年数,第二行为天数
示例
输入:
1000000000
输出:
1902
214
def invert_years_day(minute):
"""转化行为"""
minute = int(minute)
# 转化为年数
years = int(minute / 60 / 24 / 365)
# 转化为天数
days = (minute / 60 / 24) - (years * 365)
# 类型转化
days=int(days)
# 返回数据
return years, days
miu = input("请输入分钟数:")
# 调用函数
a, b = invert_years_day(miu)
# 输出结果
print(f"年数{a}")
print(f"天数{b}")
04.回文素数
题目描述
回文素数是指一个数既是素数又是回文数,例如131既是素数也是回文数
输出显示前100个回文素数,每行显示10个
示例
2 3 5 7 11 101 131 151 181 191
"""回文素数"""
# 定义一个函数判断是否为素数
def prime_number(n):
# 能被除1和本身整除返回false
if n > 2:
for i in range(2, n):
if n % i == 0:
return False
# 不能则返回true
return True
# 定义一个函数判断是否是回文数
def palindrome_number(n):
n = str(n)
c = ""
for i in n:
c = i + c
return c == n
# 定义一个初始数num和输出100个回文素数count(0-99)
num = 1
count = 0
# 循环输出100个回文素数
while count < 100:
# 初始数n开始累加
num += 1
# 调用函数
if prime_number(num) and palindrome_number(num):
# 满足条件就找下一个
count += 1
print(num, end=" ")
# 10个数一行输出
if count % 10 == 0:
print()
# 初始数n开始累加
num += 1
05.反素数
题目描述
反素数是指一个将其逆向拼写后也是一个素数的非回文数,例如17和71都是素数但不是回文数,且反转后依旧是素数
输出显示前100个反素数,每行显示10个
"""反素数"""
# 定义一个函数判断是否为素数
def prime_number(n):
if n > 2:
for i in range(2, n):
if n % i == 0:
return False
return True
# 定义一个函数判断是否是回文数
def palindrome_number(n):
n = str(n)
c = ""
for i in n:
c = i + c
return c == n
# 定义一个函数判断是否为反素数
def antiprimes_number(n):
# 转化为字符串
n_str = str(n)
# 反向输出
n1 = n_str[::-1]
# 判断原来的数和反过来的数是否为素数并不是回文数
if prime_number(n) and prime_number(int(n1)) and not palindrome_number(n):
return True
else:
return False
# 定义一个初始数num和输出100个回文素数count(0-99)
num = 1
count = 0
# 循环输出100个回文素数
while count < 100:
# 初始数n开始累加,再判断
num += 1
# 调用函数
if antiprimes_number(num):
# 满足条件就找下一个
count += 1
print(num, end=" ")
# 10个数一行输出
if count % 10 == 0:
print()
06.双素数
题目描述
双素数是指一对差值为2的素数,例如3和5就是一对双素数,5和7也是一对双素数
输出显示小于1000的双素数
"""双素数"""
#判断是否为素数
def prime_number(n):
if n > 2:
for i in range(2, n):
if n % i == 0:
return False
return True
#用循环遍历小于1000的数
for num in range(3,1000):
#调用函数,使prime_number为True
if prime_number(num) and prime_number(num+2):
#打印出一对素数
print(num,num+2)
07.梅森素数
如果一个素数可以写成$2^p-1$的形式,其中p是某个正整数,那么这个素数就称作梅森素数
输出p≤31的所有梅森素数
"""梅森素数"""
#判断是否为素数
def prime_number(n):
if n > 2:
for i in range(2, n):
if n % i == 0:
return False
return True
#遍历p<=31
for p in range(1,32):
#梅森素数满足条件
mp = 2**p-1
#调用函数
if prime_number(mp):
print(f"第{p}个梅森素数为{mp}")
08.堆叠相加
题目描述
现有堆叠相加模式$a+aa+aaa+aaaa+aaaaa+......$
例如:$2+22+222+2222+22222$,其中a为2,且有5组数字
输入输出描述
输入两个数据分别为数字a和组数n
输出按照堆叠相加模式算出的和
示例
输入:
3 4
输出:
3702
解释:
3 + 33 + 333 + 3333 = 3702
"""堆叠相加"""
#定义堆叠相加的函数
def stack_additive(a,n):
total =0
#堆叠i次
for i in range(1,n+1):
#转化为字符串再自身堆叠
s=str(a)*i
#堆叠后相加
total +=int(s)
return total
#提示输入
a = input("请输入数字:")
n = int(input("请输入组数:"))
#调用函数
s=stack_additive(a,n)
print(s)
09.检测密码
题目描述
一些网站会给密码强加一些规则:
(1)密码必须至少有8个字符
(2)密码只能包含英文字母和数字
(3)密码应该至少包含两个数字
(4)密码应该至少包含两个大写字母
如果密码符合规则,输出Yes;否则输出No
输入输出描述
输入一串密码
输出该密码是否符合规则
示例1
输入:
123456ab
输出:
No
示例2
输入:
123abcABC
输出:
Yes
"""
密码检验
"""
def detect_password(pwd):
"""检测密码"""
number_cnt = 0 # 数字计数器
upper_cnt = 0 # 大写字母计数器
if len(str(pwd)) < 8:
print("密码长度不足8位,不符合要求!")
return False
for c in str(pwd):
if not (65 <= ord(c) <= 90 or 97 <= ord(c) <= 122 or 48 <= ord(c) <= 57):
print("密码中包含非法字符,不符合要求!")
return False
if 48 <= ord(c) <= 57: # 判断包含一个数字就更新一次计数器
number_cnt += 1
if 65 <= ord(c) <= 90: # 判断包含一个大写字母就更新一次计数器
upper_cnt += 1
# 必须包含2个以上的数字和大写字母
# 3. 逻辑表达式,简化写法
return number_cnt >= 2 and upper_cnt >= 2
# 2. 三元运算写法
# return True if number_cnt >= 2 and upper_cnt >= 2 else False
# 1. 格式化的写法
# if number_cnt >= 2 and upper_cnt >= 2:
# return True
# return False
password = input("请输入密码:")
result = detect_password(password)
print("检测结果:", result)
10.指定等级
题目描述
读入学生成绩,获取最高分best,然后根据下面的规则赋等级值:
(1)如果分数≥best-10,等级为A
(2)如果分数≥best-20,等级为B
(3)如果分数≥best-30,等级为C
(4)如果分数≥best-40,等级为D
(5)其他情况,等级为F
输入输出描述
输入两行,第一行输入学生人数n,第二行输入n个学生的成绩
输入n行,表示每个学生的成绩等级
示例
输入:
4
40 55 70 58
输出:
学生0分数为40,等级为C
学生1分数为55,等级为B
学生2分数为70,等级为A
学生3分数为58,等级为B
"""指定等级"""
#定义赋等级值规则
def assign_grade(scores):
#找到最大值
best = max(scores)
#定义一个空列表
grades = []
#用for循环让满足条件的等级值追加到grades列表中
for score in scores:
if score >= best - 10:
grades.append("A")
elif score >= best - 20:
grades.append("B")
elif score >= best - 30:
grades.append("C")
elif score >= best - 40:
grades.append("D")
return grades
#提示输入数据
n = int(input("请输入学生人数n: "))
#将输入的数据转换为list表
scores = list(map(int, input(f"请输入{n}个学生的成绩: ").split()))
#调用函数
grades = assign_grade(scores)
#输出学生序号,成绩,等级
for i, g in enumerate(grades):
print(f"学生{i}的成绩为{scores[i]}, 等级为{g}")