实验8:函数
(1)理解函数的作用。
(2)掌握函数的定义方法。
(3)掌握函数的调用方法。
(4)了解函数形参和实参的区别。
(5)掌握具有默认值参数的函数定义及调用方法。
(6)掌握全局变量与局部变量在函数中的使用方法。
(7)掌握具有可变数量参数的函数定义及调用方法。
(8)了解参数按名称传递的函数定义及调用方法。
(9)掌握递归函数的定义方法。
(1)有个记者去南极采访一群企鹅
他问第一只企鹅:“你每天都干什么?”
企鹅说:“吃饭 睡觉 打豆豆!”
接着又问第2只企鹅,那只企鹅还是说:“吃饭 睡觉 打豆豆!”
记者带着困惑问其他的企鹅,答案都一样,就这样一直问了99只企鹅。
当走到第100只小企鹅旁边时,记者走过去问它:每天都做些什么啊?
那只小企鹅回答:吃饭,睡觉.
那人惊奇的又问:你怎么不打豆豆?
小企鹅撇着嘴巴,瞪了记者一眼:我就是豆豆!!!!
编写一个函数用来描述记者与这100只企鹅对话的全过程,并在主程序中测试该函数。
代码部分:
def reporter():
print("你天天都在揍嘛啊")
def qie():
print("吃饭睡觉打豆豆咯")
def doudou():
print("我就是豆豆!!!")
if __name__ == '__main__':
for i in range(1,101):
reporter()
if i!=100:
print("第{}只企鹅说:".format(i),end='')
qie()
else:
doudou()
输入:
输出:
省略94只企鹅 你天天都在揍嘛啊 第95只企鹅说:吃饭睡觉打豆豆咯 你天天都在揍嘛啊 第96只企鹅说:吃饭睡觉打豆豆咯 你天天都在揍嘛啊
第97只企鹅说:吃饭睡觉打豆豆咯 你天天都在揍嘛啊 第98只企鹅说:吃饭睡觉打豆豆咯 你天天都在揍嘛啊 第99只企鹅说:吃饭睡觉打豆豆咯
你天天都在揍嘛啊 我就是豆豆!!!
(2)2016年,微信朋友圈中曾疯传“手机尾号暴露你的年龄”,其算法如下:(a)看一下你手机号的最后一位;(b)把这个数字乘以2;(c)然后加上5;(d)再乘以50;(e)把得到的数加上1766;(f)用这个数减去你出生的那一年,现在得到一个新的数字,该数字的最后两位就是你的实际年龄(本规则仅适用于年龄在100岁以内的人)。编写函数计算年龄,参数为手机号最后一位和出生年份。在主程序中测试该函数,该函数能正确反映出你的真实年龄吗?如果不能,如何修改计算规则。
代码部分:
def age(i,year):
return ((i*2+5)*50+1766-year)%100
#修改后
def age_new(i,year):
return ((i*2+5)*50+1772-year)%100
if __name__ == '__main__':
print(age(6,2002))
print(age_new(6,2002))
输入:
输出:
14
20
(3)编写一个函数,简单模拟微信发红包算法。函数有两个参数:一个参数表示红包总金额,默认值为100;另一个参数表示红包数量,默认值为15。所有随机产生的红包金额(保留两位小数)存放在一个列表(同时作为函数的返回值)中,单个红包金额最少为0.01元,所有红包金额之和应等于红包总金额。在主程序中测试该函数,并思考,如何设计出更公平的发红包算法。
代码部分:
i
mport random
def hongbao(sum=100,num=15):
hb=[]
j=0
for i in range(0,num-1):
# 随机小数,让红包的大小不会过大,以免差距过大
if sum>=100:
price=round(random.uniform(0.01,sum/5),2)
else:
price=round(random.uniform(0.01,sum/3),2)
hb.append(price)
sum=round(sum-price,2)
# 把剩下的钱全都给到最后一个
hb.append(sum)
for i in hb:
j+=i
return (hb,j)
if __name__ == '__main__':
print(hongbao(sum=200,num=15))
思考: 可以将随机单个红包金额的大小规定一个合理的范围,使得抢红包的人所得金额不会差距太大,尽量公平
输出:
([28.5, 6.56, 16.11, 11.8, 14.52, 13.78, 15.67, 25.94, 2.37, 8.71, 1.0, 2.43, 12.94, 9.81, 29.86], 200.0)
(4)编写一个递归函数,计算下面的级数:m(i)=1/3+2/5+3/7+4/9+…+i/(2i+1)
代码部分:
sum=0
def calc_series(n):
global sum
if n==0:
return sum
sum+=n/(2*n+1)
return calc_series(n-1)
if __name__ == '__main__':
print("递归算法:",calc_series(5))
print("直接算:",1/3+2/5+3/7+4/9+5/11)
输入:
输出:
递归算法: 2.060894660894661
直接算: 2.060894660894661
(5)编写程序,求,要求定义一个lambda()函数用来求。
代码部分:
import math
sum=0
# 求加号右边
f=lambda x:(1+math.log(x))/(2*math.pi)
for i in range(1,101):
sum+=f(i)
# 求总和
s=math.e**3+sum
print(s)
输入:
输出:
93.89195084920446
这一次实验算是用的时间最长的一次了(除了pygame),虽然有五道题目,但复杂度是要比之前高的,前三题的题目理解上花费了一些时间,没理解的太好,也算是照着自己的理解将代码写了出来,应该是符合题目要求了。第四个使用到了递归算法,递归算法我运用的不是很熟练,所以理清思路还是有点困难的,用了一些时间。最后一个算式计算来说,还是要熟练使用math模块的,lambda函数使用起来确实不太熟悉,还是得对照着PPT进行研究。只要能自己写出来想明白,那难度还是尚可的。