函数的综合练习
案例1:
编写一个函数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))
运行结果:
案例2:
编写一个函数, 接收字符串参数, 返回一个元组,
元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
例如
输入:'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('请输入字符串:')))
运行结果:
案例3:
编写函数, 接收一个列表(包含30个1~100之间的随机整形数)
和一个整形数k, 返回一个新列表.
函数需求:
- 将列表下标k之前对应(不包含k)的元素逆序;
- 将下标k及之后的元素逆序;
[1,2,3,4,5] 2 [2,1,5,4,3]
代码:
# 导入生成随机数的包
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))
运行结果:
案例4:
模拟轮盘抽奖游戏
轮盘分为三部分: 一等奖, 二等奖和三等奖;
轮盘转的时候是随机的,
如果范围在[0,0.08)之间,代表一等奖,
如果范围在[0.08,0.3)之间,代表2等奖,
如果范围在[0.3, 1.0)之间,代表3等奖,
模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.
代码:(方法1)
import random
def rewordfun():
# 定义用来记录各个中奖等级人数的变量
onecount = 0
twocount = 0
threecont = 0
# 计算中奖等级人数
for i in range(1000):
# random.random():生成0-1的随机数
# format: 格式转换,保留两位小数
# print(random.random())
num = float(format(random.random(),'.2f'))
# print(num)
if 0 <= num < 0.08:
onecount += 1
elif 0.08 <= num < 0.3:
twocount += 1
else:
threecont += 1
# 返回各个中奖等级人数
return onecount,twocount,threecont
# 将函数返回值赋给变量
count01,count02,count03 = rewordfun()
# 定义字典
rewordDict = {'一等奖':count01,'二等奖':count02,'三等奖':count03}
# 遍历输出字典的key-value
for k,v in rewordDict.items():
print(k,'--->',v)
运行结果:
代码:(方法2)
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)
运行结果:
案例5:
题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 1**2 + 3**2 = 10
f(207) = 2**2 + 0**2 + 7**2 = 53
下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
且k*f(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:
count += 1
# 打印个数
print(count)
运行结果: