1.画出函数的组成部分并给出标注。为每个部分写出简短的定义。
函数的三个基本组成部分是:定义域、函数和值域。
定义域是函数可以接受的输入值集合。
函数是将一个集合(定义域)中的元素对应到另一个集合(值域)中的元素的规则。
输入值称为自变量,输出值称为因变量。
2.编写菜单:
(a)编写任何软件时,通常都有一个相同的任务,即显示菜单并要求用户在菜单上进行选择。手机上的菜单就是一个实例。菜单选项有信息、通讯录、游戏、设置、媒体和网络(或其他)。写一个函数displayMenu,向用户显示菜单,并允许用户做出选择(使用input)。
def displayMenu():
print("----------------------菜单---------------------")
print("---------------1、信息-----------------------")
print("---------------2、通讯录--------------------")
print("---------------3、游戏-----------------------")
print("---------------4、设置-----------------------")
print("---------------5、媒体和网络--------------")
print("---------------6、其他-----------------------")
choose=input("请你输入要操作的选项(1-6的整数):")
return choose
(b)写一个函数获取用户的选择,调用相应的函数。(提供有意义的函数名称,不必编写其他函数的定义。)
def getChoose():
return displayMenu()
3、编写函数将两个足球队的最后得分作为参数输入,输出哪个队获胜或者比赛终止。请引用变量名“Team1”或“Team2"。该函数不返回任何内容。
def getResult(Team1,Team2):
if Team1<Team2:
print("队伍2获胜")
elif Team1>Team2:
print("队伍1获胜")
else:
print("平手,比赛终止")
4、编写函数,输入英文句子(字符串),输出句子中元音的个数和辅音的总个数。该函数不返回任何内容。请注意句子可能包含特殊字符,如点、破折号等。
用isalpha()函数排除非字母字符,只有是字母字符的才做下一步判断。
def count_vowels_consonants(sentence):
vowels = 'aeiouAEIOU'
vowel_count = 0
consonant_count = 0
for char in sentence:
if char.isalpha():
if char in vowels:
vowel_count += 1
else:
consonant_count += 1
print(f"元音个数: {vowel_count}")
print(f"辅音个数: {consonant_count}")
5、斐波拉契数列是:1,1,2,3,5,8,13…。可以看到,第一个和第二个数字均为1。此后每个数字是前两个数字的总和。
(a)编写函数来输出Fibonacci序列的前n个数字。
(b)编写函数,显示序列中的第n个数字。
(a)
def fibonacci_sequence(n):
"""
输出 Fibonacci 序列的前 n 个数字。
"""
if n <= 0:
print("n 必须大于 0")
return
fibonacci_nums = [1, 1]
if n == 1:
print(fibonacci_nums[0])
elif n == 2:
print(", ".join(map(str, fibonacci_nums)))
else:
for i in range(2, n):
next_num = fibonacci_nums[-1] + fibonacci_nums[-2]
fibonacci_nums.append(next_num)
print(", ".join(map(str, fibonacci_nums)))
(b)
def nth_fibonacci(n):
"""
显示 Fibonacci 序列中的第 n 个数字。
"""
if n <= 0:
print("n 必须大于 0")
return
if n == 1 or n == 2:
print(1)
else:
a, b = 1, 1
for i in range(3, n + 1):
a, b = b, a + b
print(b)
6.假设你在互联网上在线购买东西。如果你是会员,在网站购买会得到10%的折扣。此外,因为是父亲节,还会获得额外的5%折扣。
编写函数,输入购买商品的价格和布尔变量(表示是否为会员)。使用适当的折扣,并返回该商品的最终价格。注:该商品的价格不必是整数。
def getPrice(price,is_vip):
if is_vip:
return price*0.9*0.95
else:
return price*0.95
7.闰年在公历系统中是能被4整除但不能被100整除,或者能被400整除的那些年份。例如1896年、1904年和2000年是闰年,但1900年不是。写一个数,输入为年份,输出是否为闰年。
def is_run(year):
if (year%4==0 and year%100!=0) or year%400==0:
print("%d是闰年。"%year)
else:
print("%d不是闰年。"%year)
8:这个函数实现什么功能?对于num=5,该函数返回什么?
def Func(num):
total =0
while num> 0:
total=total +num*(num-1)
num=num-1
return total
循环中循环变量一直减1,直到不大于0,跳出循环。
每次循环将当前数字和小它1的数字相乘,然后把结果加到total中
最后返回total
所以函数的功能是:计算1*2+2*3+。。。+(num-1)*n
当num=5时,1*2+2*3+3*4+4*5=40
9.这个函数实现什么功能?如果x=5,该函数返回什么?
def Func(x):
total = 0
for i in range(x):
total += i*(i-1)
return total
循环从0到x-1
功能:计算1*2+2*3+。。。+(x-1)*(x-2)
当x=5时,1*2+2*3+3*4=20
10.这个函数实现什么功能?返回值是什么?
def Func():
num=1.0
total =0
while num < 100:
total = 1/num
num+=1
return total
循环变量从初始值1.0到不小于100,也就是99。
循环时,total=1/num
返回值为1/99
11、错误检查时给出有意义的错误消息,是编程中非常重要的组成部分。以下面的场景为例:顾客每月支付信用卡账单。卡的信用额度是1000美元。最低还款额始终是20美元。假设信用卡还款额为P美元。编写函数makePayment§,参数为信用卡的总还款额($P),输出为"Success”或者“Retry”。试想实现此函数时所有可能发生的错误。例如,如果还款不足20美元,该程序应提醒用户还款少于最低还款额。
def makePayment(P):
# 信用额度
credit_limit = 1000
# 最低还款额
minimum_payment = 20
# 检查还款金额是否小于最低还款额
if P < minimum_payment:
return ("错误: 还款金额 %f美元少于最低还款额%f美元" %(P,minimum_payment ))
# 检查还款金额是否超出信用额度
if P > credit_limit:
return ("错误: 还款金额 %f美元超出信用额度 %f美元" %(P,credit_limit ))
# 还款成功
return "Success"
12.你购买了打往印度的国际电话卡,电话卡公司有一些优惠政策:
(a)如果用信用卡支付5美元或10美元,没有额外赠品。
(b)支付25美元,你会得到价值3美元的额外电话时间。
(e)支付50美元,你会得到价值8美元额外的电话时间。
(d)支付100美元,你会得到价值20美元的额外电话时间。
编写函数,输入用户希望获得的金额,返回用户得到的总价值。注:除上述情况外,不允许出现其他情况。
def jiazhi(money):
if money==5 or money==10:
return money
elif money==25:
return money+3
elif money==50:
return money+8
elif money==100:
return money+20
13.编写函数,输入为质量,返回与其相当的能量。(E=mc²)。使用米-千克-秒单位制。
def energy(m):
return m*c*c
14.聊天:
(a)在某些聊天程序或消息应用程序中有一个限制,即可以在消息中发送的字符数。编写函数,输入为消息(字符串),检查字符数是否小于160。如果消息的长度少于160,返回该消息。如果消息的长度大于160,则只返回前160个字符组成的字符串。
(b)如果限制的是单词数而不是字符数,如何进行检查?写一个函数,只允许含20个单词的消息。
(a)
def getMessage(s):
if len(s)<=160:
return s
else:
return s[:160]
(b)
单词是以空格来分隔的,用split()
def getword(s):
n=len(s.split(" "))
if n<=20:
return s
else:
return “ ”.join(s.split(" ")[:20])
15.编写函数,输出100以内6和10的所有公倍数。在一般情况下,函数有三个输入参数:要求公倍数的两个数字(x和y)和上限z。
def gong(x,y,z):
for i in range(z):
if i%6==0 and i%10==0:
print(i)
16.用来确定是否创建独立函数的三项准则是什么?
重复性:如果某段代码会被多次重复使用,那么将其封装为独立函数是一个好主意。这样可以减少代码重复,提高代码的可维护性。
抽象性:如果某段代码实现了一个较为通用的功能,可以将其抽象为一个独立函数。这样可以增强代码的可复用性,使代码更加模块化和可理解。
复杂性:如果某段代码逻辑较为复杂,包含多个步骤或嵌套结构,那么将其封装为独立函数可以提高代码的可读性和可维护性。
19.编写函数,输入一个字符串,以如下格式存储为日期和时间(24小时制),“MM/DD/YYYY HR:MIN:SEC”并输出以下内容:
DD/MM/YYYY
HR: MIN:SEC
MM/YYYY
时间是“AM”或“PM"
函数中需要进行输入验证。例如,如果用户输入“122/04/199013:12:12",该字符串是无效的,因为一年只有12个月。考虑所有可能的错误输入,并编写代码进行处理。该函数不返回任何值。
def time(s):
month,day,year=s.split()[0].split("/")
hour,min,sec=s.split()[1].split(":")
if month<=0 or month>12 or day<1 or day>31 or year<1 or hour<0 or hour>25 or min<0 or min>59 or sec<0 or sec>59:
print("输入的日期和时间格式有误,请重新输入.")
return
print("%d/%d/%d"%(day,month,year))
print("%d:%d:%d"%(hour,min,sec))
print("%d/%d"%(month,year))
if hour<12:
print("时间是AM")
else:
print("时间是PM")
20.编写函数,输入字符串,日期和时间存储为“MM/DD/YYYYHR:MIN:SEC”格式,输出从“01/01/YYYY 00:00:00”开始计时的秒数。
import datetime
def get_seconds(datetime_str):
# 1. 将输入的字符串转换为datetime对象
month, day, year, hour, minute, second = map(int, datetime_str.split(" "))
input_datetime = datetime.datetime(year, month, day, hour, minute, second)
# 2. 计算从当年1月1日 00:00:00 开始的秒数
start_of_year = datetime.datetime(year, 1, 1, 0, 0, 0)
seconds = (input_datetime - start_of_year).total_seconds()
return int(seconds)
21.编写函数,显示A~B(含)范围中,所有位上的数字都属于集合[1,3,4,8,9]的数字。检查是否A小于或等于B,否则交换这两个数字。该函数有两个整型参数:A和B。
def show_valid_numbers(A, B):
# 检查A和B的大小关系
if A > B:
A, B = B, A
# 创建集合[1, 3, 4, 8, 9]
valid_digits = set([1, 3, 4, 8, 9])
# 遍历范围[A, B]内的所有数字
for num in range(A, B + 1):
# 将数字转换为字符串
num_str = str(num)
# 检查数字的每一位是否都在集合valid_digits中
flag=1 #标记,1符合,0不符合
for digit in num_str:
if int(digit) not in valid_digits:
flag=0
break #不符合flag=0并结束这个数字的循环
if flag:
print(num)
22.给出形如"{ABC}”的字符串,代表长度为3的集合。写一个函数,输入字符串为参数,并返回以逗号分隔的各种排列形式,如“{ABC,ACB,BAC,BCA,CAB,CBA}"。提示:使用多个for循环。
def a(s):
ss=s[1:-1] #去掉大括号
sss=""
for i in range(3):
for j in range(3):
for k in range(3):
if i==j or i==k or j==k:
continue
else:
sss=sss+i+j+k
sss="{"+sss
sss.replace(sss[-1],"}") #最后一个多了一个逗号,替换掉