python 实验八 函数 (上)

Posted The Qing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 实验八 函数 (上)相关的知识,希望对你有一定的参考价值。

1.“吃饭,睡觉,打豆豆”是网络上最为流行的小笑话之一,这则笑话的具体内容如下。
有个记者去南极采访一群企鹅。
他问第一只企鹅:“你每天都做什么?”企鹅说:“吃饭,睡觉,打豆豆!”接着又问第二只企鹅:“你每天都做什么?”企鹅说:“吃饭,睡觉,打豆豆!”接着又问第三只企鹅:“你每天都做什么?”企鹅说:“吃饭,睡觉,打豆豆!”…记者带着困惑问其他的企鹅,答案都一样,就这样一直问了99只企鹅。当走到第100只小企鹅旁边时,记者问他:“你每天都做什么?”那只小企鹅回答:“吃饭,睡觉。”记者惊奇的又问:“你怎么不打豆豆?”小企鹅撇着嘴:,瞪了记者一眼说:“我就是豆豆!”请编写一个程序,要求如下:
(1)编写一个函数用来描述记者与这100只企鹅对话的全过程,其输出格式为
记者问第1只企鹅:“你每天都做什么?”企鹅说:“吃饭,睡觉,打豆豆!”
记者问第2只企鹅:“你每天都做什么?”企鹅说:“吃饭,睡觉,打豆豆!”

记者问第99只企鹅:“你每天都做什么?”企鹅说:“吃饭,睡觉,打豆豆!”
记者问第100只企鹅:“你每天都做什么?”企鹅说:“吃饭,睡觉,我就是豆豆!”

(2)在主程序下测试该函数。

def interview():
    for n in range(1, 100):
        print('记者问第{}只企鹅:“你每天都做什么?”企鹅说:“吃饭,睡觉,打豆豆!”'.format(n))
    print('记者问第100只企鹅:“你每天都做什么?”企鹅说:“吃饭,睡觉,我就是豆豆!”')


interview()

输出结果
在这里插入图片描述

2.以下为输出韩国流行歌曲Nobady一段歌词(有修改)的代码,

print(‘I want nobody nobody but you’)
print(‘I want nobody nobody but you’)
print(‘How can i be with another’)
print(“I don’t want any other”)
print(‘I want nobody nobody but you’)
print(‘I want nobody nobody but you’)
print(‘I want nobody nobody but you’)

请将上述代码中的重复部分抽象(定义)成一个函数,并在主程序中调用该函数,以使源代码显得更简洁一些。

def nobody(n):
    for i in range(n):
        print('I want nobody nobody but you')


nobody(2)
print('How can i be with another')
print("I don't want any other")
nobody(3)

输出结果

I want nobody nobody but you
I want nobody nobody but you
How can i be with another
I don't want any other
I want nobody nobody but you
I want nobody nobody but you
I want nobody nobody but you

3.编写isOdd()函数,该函数应有一个整数参数,如果该参数为奇数,函数返回True,否则返回Flase。最后在主程序中测试该函数。

def isOdd(n):
    return n % 2 != 0


n = int(input('输入一个整数:'))
print(f'{n}是奇数') if isOdd(n) else print(f'{n}不是奇数')

输出样例

输入一个整数:62
62不是奇数

4.按如图所示的流程进行计算,若开始输入的x的值为正数,最后输出的结果为656,请编程输出符合条件的x的值。
在这里插入图片描述

def fun(n):
    while (n - 1) / 5 > 0:
        n = (n - 1) / 5
    return n


print(fun(656))

输出结果

0.8

5.2016年,微信朋友圈中曾疯传“手机尾号暴露你的年龄”,其算法如下:看一下你手机号的最后一位;把这个数字×2;然后加上5;再×50;把得到的数加上1766;用这个数-你出生的那一年,现在得到一个新的数字,该数的最后两位就是你的实际年龄。(本规则仅适用于年龄在100岁以内的人)。
现在,请解决以下问题:
(1)编写一个函数,该函数有两个参数:一个参数为手机号最后一位;另一个参数为四位数的出生年份该函数最后返回按照上述规则计算出来的年龄。

def fun(m, n):
    return ((m * 2 + 5) * 50 + 1766 - n) % 100


m = int(input('请输入手机号最后一位:'))
n = int(input('请输入四位出生年份:'))
print(fun(m, n))

输出样例

请输入手机号最后一位:5
请输入四位出生年份:2000
16

(2)在主程序中,测试该函数,该函数能正确反映出你的真实年龄吗?如果不能,如何修改计算规则?
不能正确反映,把得到的数加上1770就可以实现

def fun(m, n):
    return ((m * 2 + 5) * 50 + 1770 - n) % 100    


m = int(input('请输入手机号最后一位:'))
n = int(input('请输入四位出生年份:'))
print(fun(m, n))

输出样例

请输入手机号最后一位:8
请输入四位出生年份:2000
20

6.编写一个程序,在主程序中求1900~2020年中所有的闰年,每行输出5个年份。闰年即能被4整除,但不能被100整除,或者能被400整除的年份。要求定义一个函数isLeap(),该函数用来判断某年是否为闰年,是闰年则函数返回True,否则返回Flase。

def isLeapYear(year):
    return year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)


count = 0
for n in range(1900, 2021):
    if isLeapYear(n) is True:
        print(n, end='\\t')
        count += 1
        if count % 5 == 0:
            print()

输出结果

1904 1908 1912 1916 1920
1924 1928 1932 1936 1940
1944 1948 1952 1956 1960
1964 1968 1972 1976 1980
1984 1988 1992 1996 2000
2004 2008 2012 2016 2020

7.编写一个函数,求一个正整数n的各位数字之和,并在主程序中测试该函数。

def fun(n):
    sum = 0
    for i in str(n):
        sum += int(i)
    return sum


def fun2(n):
    ls = [int(c) for c in str(n)]
    return sum(ls)


def fun3(n):
    ls = list(map(int, str(n)))
    return sum(ls)


count = 0
n = eval(input('正整数n:'))
print(f'{n}各位数之和为:{fun(n)}')
print(f'{n}各位数之和为:{fun2(n)}')
print(f'{n}各位数之和为:{fun3(n)}')

输出样例

正整数n:189
189各位数之和为:18
189各位数之和为:18
189各位数之和为:18

8.求出所有符合下列条件的三位正整数:分别乘以3、4、5、6、7后得到的整数的各位数字之和都相等。
输入示例:
x=180:x3=540,x4=720,x5=900,x6=1080,x7=1260
x=198:x
3=594,x4=792,x5=990,x6=1188,x7=1386

x=999:x3=2997,x4=3996,x5=4995,x6=5994,x*7=6993

def fun(n):
    ls = [int(c) for c in str(n)]
    return sum(ls)


count = 0
for n in range(100, 1000):
    if fun(n) == fun(n * 3) == fun(n * 4) == fun(n * 5) == fun(n * 6) == fun(n * 7):
        count += 1
        print(f"x={n}: x*3={n * 3}, x*4={n * 4}, x*5={n * 5}, x*6={n * 6}, x*7={n * 7}")
print(f"共有{count}个符合条件的三位数")

输出结果

x=180: x3=540, x4=720, x5=900, x6=1080, x7=1260
x=198: x
3=594, x4=792, x5=990, x6=1188, x7=1386
x=297: x3=891, x4=1188, x5=1485, x6=1782, x7=2079
x=360: x
3=1080, x4=1440, x5=1800, x6=2160, x7=2520
x=396: x3=1188, x4=1584, x5=1980, x6=2376, x7=2772
x=450: x
3=1350, x4=1800, x5=2250, x6=2700, x7=3150
x=495: x3=1485, x4=1980, x5=2475, x6=2970, x7=3465
x=549: x
3=1647, x4=2196, x5=2745, x6=3294, x7=3843
x=594: x3=1782, x4=2376, x5=2970, x6=3564, x7=4158
x=639: x
3=1917, x4=2556, x5=3195, x6=3834, x7=4473
x=693: x3=2079, x4=2772, x5=3465, x6=4158, x7=4851
x=792: x
3=2376, x4=3168, x5=3960, x6=4752, x7=5544
x=819: x3=2457, x4=3276, x5=4095, x6=4914, x7=5733
x=891: x
3=2673, x4=3564, x5=4455, x6=5346, x7=6237
x=900: x3=2700, x4=3600, x5=4500, x6=5400, x7=6300
x=909: x
3=2727, x4=3636, x5=4545, x6=5454, x7=6363
x=918: x3=2754, x4=3672, x5=4590, x6=5508, x7=6426
x=936: x
3=2808, x4=3744, x5=4680, x6=5616, x7=6552
x=945: x3=2835, x4=3780, x5=4725, x6=5670, x7=6615
x=990: x
3=2970, x4=3960, x5=4950, x6=5940, x7=6930
x=999: x3=2997, x4=3996, x5=4995, x6=5994, x*7=6993
共有21个符合条件的三位数

9.在主程序中输入一个整数n,判断该数是否为完数。所谓完数,是一些特殊的自然数,它所有的真因子(即除了自身以外的约束)的和,恰好等于它本身。如6=1+2+3,所以6是完数。要求定义一个函数,用来判断某个整数是否未完数,是完数则函数返回1,否则返回0。最后在主程序中测试该函数。

def fun(n):
    s = 0
    for i in range(1, n):
        if n % i == 0:
            s = s + i
    return 1 if s == n else 0


def fun2(n):
    ls = [i for i in range(1, n) if n % i == 0]
    return 1 if sum(ls) == n else 0


n = int(input('请输输入一个整数:'))
print(f'{n}是完数') if fun(n) == 1 else print(f'{n}不是完数')
print(f'{n}是完数') if fun2(n) == 1 else print(f'{n}不是完数')

输出样例

请输输入一个整数:65
65不是完数
65不是完数

10题
在这里插入图片描述

def fun(m, n):
    ls = [i ** m for i in range(1, n + 1)]
    return sum(ls)


print(fun(1, 100) + fun(2, 50) + fun(-1, 10))

输出结果

47977.92896825397

11.求s=a+aa+aaa+…+aaa…aaa,其中a是1~9之间的某个数字,n是一个正整数。例如:
当a=2,n=5时,s=2+22+222+2222+22222=24690.要求定义一个函数,该函数根据参数a和n的值返回表达式a+aa+aaa+…+aaa…aaa的值,并在主程序中测试该函数。

def fun(a, n):
    s = 0
    item = 0
    for i in range(n):
        item = item * 10 + a
        s += item
    return s


def fun2(a, n):
    s = 0
    for i in range(1, n + 1):
        s += int(str(a) * i)
    return s


def fun3(a, n):
    ls = [int(str(a) * i) for i in range(1, n + 1)]
    return sum(ls)


a, n = eval(input("输入a和n[用逗号分隔]:"))
s = fun(a, n)
print(f"若a={a},n={n},则s=a+aa+aaa+...+aaa...aaa={s}")
s = fun2(a, n)
print(f"若a={a},n={n},则s=a+aa+aaa+...+aaa...aaa={s}")
s = fun3(a, n)
print(f"若a={a},n={n},则s=a+aa+aaa+...+aaa...aaa={s}")

输出样例

输入a和n[用逗号分隔]:3,6
若a=3,n=6,则s=a+aa+aaa+…+aaa…aaa=370368
若a=3,n=6,则s=a+aa+aaa+…+aaa…aaa=370368
若a=3,n=6,则s=a+aa+aaa+…+aaa…aaa=370368

12.编写一个函数,简单的模拟微信发红包算法。函数有两个参数:一个参数是红包的总金额,默认值为100;另一个参数表示红包数量,默认值为15.所有随机产生的红包金额(保留两位小数)存放在一个列表(同时作为函数的返回值)中,单个红包金额最少为0.01元,所有红包金额之和应等于红包总金额。最后在主程序中测试该函数,要求对函数的默认值也进行测试。

import random


def redPacket1(money=100, number=15):
    ls = []
    for n in range(number - 1):
        lucky_money = random.uniform(0.01, money - (number - 1 - n) * 0.01)
        lucky_money = round(lucky_money, 2)
        ls.append(lucky_money)
        money = money - lucky_money
    ls.append(round(money, 2))
    return ls


def redPacket2(money=100, number=15):
    ls = []
    for n in range(number - 1):
        lucky_money = random.uniform(0.01, money / (number - n) * 2)
        lucky_money = round(lucky_money, 2)
        ls.append(lucky_money)
        money = money - lucky_money
    ls.append(round(money, 2))
    return ls


def redPacket3(money=100, number=15):
    money = money * 100
    ls = []
    for n in range(number - 1):
        lucky_money = random.randint(1, int(money / (number - n) * 2))
        ls.append(lucky_money / 100)
        money = money - lucky_money
    ls.append(money / 100)
    return ls


a = redPacket1()
print(a)
print(sum(a))

a = redPacket2()
print(a)
print(sum(a))

a = redPacket3()
print(a)
print(sum(a))

a = redPacket3(1000)
print(a)
print(sum(a))

a = redPacket3(1000, 20)
print(a)
print(sum(a))

a = redPacket3(10, 6)
print(a)
print(sum(a))


输出样例

[26.01, 8.72, 40.33, 23.49, 0.26, 0.2, 0.52, 0.11, 0.26, 0.03, 0.03, 0.01, 0.01, 0.01, 0.01]
100.00000000000003
[1.75, 1.26, 8.46, 11.0, 4.6, 14.26, 7.41, 12.27, 7.57, 5.77, 0.52, 3.49, 13.05, 6.94, 1.65]
99.99999999999997
[3.5, 5.78, 4.02, 4.34, 3.15, 8.3, 8.7, 13.88, 11.19, 0.96, 3.83, 6.28, 12.99, 11.91, 1.17]
100.0
[132.31, 37.31, 36.04, 46.51, 76.15, 2.73, 143.08, 60.52, 118.87, 19.65, 99.55, 33.84, 26.18, 27.67, 139.59]
999.9999999999999
[61.17, 40.94, 13.23, 25.39, 27.35, 42.43, 63.23, 80.97, 97.25, 58.35, 84.18, 11.12, 9.76, 99.41, 69.04, 34.13, 18.45, 72.78, 2.36, 88.46]
1000.0
[3.25, 1.3, 0.04, 2.68, 1.17, 1.56]
10.0

13.编写一个函数isdiff(n),用来判断参数n的各位数字是否互不相同,若互不相同,则返回1,否则返回0,并在主程序中测试该函数。

def isdiff(n):
    s = str(n)
    for i in s:
        if s.count(i) > 1:
            return 0
    else:
        return 1


def isdiff2(n):
    a = str(n)
    b = set(a)
    return 1 if len(a) == len(b) else 0


n = int(input('请输入一个正整数:'))
if isdiff(n) == 1:
    print(f'{n}的各位数字互不相同')
else:
    print(f'{n}中有重复数字')

if isdiff2(n) == 1:
    print(f'{n}的各位数字互不相同')
else:
    print(f'{n}中有重复数字')

输出样例

请输入一个正整数:69
69的各位数字互不相同
69的各位数字互不相同

14.编写一个函数,接受一个列表参数,函数返回该列表中所有正数之和。最后在主程序中测试该函数。

def fun(ls):
    _ls = [i for i in ls if i > 0]
    return sum(_ls)


def fun2(ls):
    _ls = filter(lambda n: n > 0, ls)
    return sum(_ls)


ls = eval(input('请按照列表格式输入列表元素:'))
print(f'该列表中所有正数之和为:{fun(ls)}')
print(f'该列表中所有正数之和为:{fun2(ls)}')

输出样例

请按照列表格式输入列表元素:16,15,18
该列表中所有正数之和为:49
该列表中所有正数之和为:49

以上是关于python 实验八 函数 (上)的主要内容,如果未能解决你的问题,请参考以下文章

python 实验八 函数 (下)

python 实验八 函数 (下)

python 实验八 函数 (下)

可视化实验八:利用Python绘制柱状图条形图

可视化实验八:利用Python绘制柱状图条形图

实验八——函数定义及调用总结