python课程实验8_函数

实验8:函数

1.实验目标及要求

(1)理解函数的作用。
(2)掌握函数的定义方法。
(3)掌握函数的调用方法。
(4)了解函数形参和实参的区别。
(5)掌握具有默认值参数的函数定义及调用方法。
(6)掌握全局变量与局部变量在函数中的使用方法。
(7)掌握具有可变数量参数的函数定义及调用方法。
(8)了解参数按名称传递的函数定义及调用方法。
(9)掌握递归函数的定义方法。

2. 实验主要内容

(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

3.心得体会

这一次实验算是用的时间最长的一次了(除了pygame),虽然有五道题目,但复杂度是要比之前高的,前三题的题目理解上花费了一些时间,没理解的太好,也算是照着自己的理解将代码写了出来,应该是符合题目要求了。第四个使用到了递归算法,递归算法我运用的不是很熟练,所以理清思路还是有点困难的,用了一些时间。最后一个算式计算来说,还是要熟练使用math模块的,lambda函数使用起来确实不太熟悉,还是得对照着PPT进行研究。只要能自己写出来想明白,那难度还是尚可的。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值