实验四 函数

实验四 函数

一、实验学时:2学时

二、实验目的

  1. 掌握函数定义和调用的用法。
  2. 掌握递归函数的执行过程。
  3. 掌握位置参数、关键参数、默认值参数与长度可变参数的用法。
  4. 理解函数调用时参数传递的序列解包用法。
  5. 理解变量作用域。
  6. 掌握lambda表达式的定义与用法。
  7. 掌握生成器函数工作原理。

三、实验内容

  1. 编写函数,实现根据键盘输入的长、宽、高之值计算长方体体积。
  2. 编写函数,使用递归函数f(n)实现斐波那契数列中小于等于参数n的所有值。
  3. 编写函数,从键盘输入一个整数,判断其是否为完全数。所谓完全数,是指这样的数,该数的各因子(除该数本身外)之和正好等于该数本身,例如:6=1+2+3,28=1+2+4+7+14。
  4. 编写函数,从键盘输入参数n,使用递归函数H(n)实现下列特征方程中小于等于参数n的所有值。 H(0)=0; H(1)=1; H(2)=2; H(n)= H(n-1)+9H(n-2)-9H(n-3)
  5. 编写函数,实现折半查找。
  6. 编写函数,从键盘输入参数x和n,计算并显示形如x+xx +xxx + xxxx + xxxxx+xxx…xxx+ 的表达式前n项的值。
  7. 编写函数,从键盘输入参数n,计算并显示表达式1 +1/2 –1/3 + 1/4 –1/5 + 1/6+… +(-1)n/n 的前n项之和。
  8. 编写函数,从键盘输入一字符串,判断该字符串是否为会回文,所谓回文是指,从前向后读和从后向前读是一样的。
  9. 编写函数,从键盘输入一字符串,把其中的各个字符颠倒,标点符号不颠倒,例如,‘I enjoy reading!’,经过函数调用后变为‘gnidaer yojne I’。
  10. 佩奇去超市购买54元巧克力和53元果冻,货币面值有20、10、2、1元,按付款货币数量最少原则,佩奇需要付给超市多少数量的货币,编写函数实现该算法。

四、实验结果

  1. 编写函数,实现根据键盘输入的长、宽、高之值计算长方体体积。
    题目思路:注意判断数据合法,然后函数返回长乘宽乘高即可。
    程序代码:
"""
程序名:实验4.1.py
功能:实现根据键盘输入的长、宽、高之值计算长方体体积。
日期:2022.4.8
版本:1.0
"""
# 长方体体积
def cubic_volume(a, b, c):
       if a > 0 and b > 0 and c > 0:  # 判断数据合法!
           return a * b * c
       else:
           print("数据不合法!")
           return 0
a1, b1, c1 = map(eval, input("请依次输入长方体的长、宽、高(以空格隔开):").split())  # 以split将字符串以空格为分隔符分割逐个赋值给a,b,c
if cubic_volume(a1, b1, c1):
       print(f"长方体的体积为{cubic_volume(a1, b1, c1):.1f}")  # 格式化输出体积保留一位小数

运行结果截图:
图片描述

  1. 编写函数,使用递归函数f(n)实现斐波那契数列中小于等于参数n的所有值。
    题目思路:设置好n=1和n=2时函数值为1,当n大于2的时候,函数递归调用,返回 f(n-1)+f(n-2)。然后用循环输出即可。
    程序代码:
"""
程序名:实验4.2.py
功能:使用递归函数f(n)实现斐波那契数列中小于等于参数n的所有值。
日期:2022.4.8
版本:1.0
"""
# 斐波那契数列
def f(n):
       if n == 1 or n == 2:  # 第一项和第二项都是1
           return 1
       return f(n - 1) + f(n - 2)  # 每一项等于前两项之和
a = eval(input("请输入n的值:"))
for i in range(1, a+1):
       print(f(i),end=' ')  # 循环逐个输出

运行结果截图:
图片描述

  1. 编写函数,从键盘输入一个整数,判断其是否为完全数。所谓完全数,是指这样的数,该数的各因子(除该数本身外)之和正好等于该数本身,例如:6=1+2+3,28=1+2+4+7+14。
    题目思路:通过n对1-n-1取余如果为0则为因子,最后把这些因子加起来和n判断,如果相等则为完全数。
    程序代码:
"""
程序名:实验4.3.py
功能:从键盘输入一个整数,判断其是否为完全数。
所谓完全数,是指这样的数,该数的各因子(除该数本身外)之和正好等于该数本身,例如:6=1+2+3,28=1+2+4+7+14。
日期:2022.4.8
版本:1.0
"""
# 完全数
def perfect_num(n):
       a = 0
       for j in range(1, n):
           if n % j == 0:
               a += j
       if a == n:
           print(f"数{n}是完全数")
       else:
           print(f"数{n}不是完全数")
num = eval(input("请输入一个整数:"))
if type(num) == int:
       perfect_num(num)
else:
       print("数据不合法")

运行结果截图:
图片描述

  1. 编写函数,从键盘输入参数n,使用递归函数H(n)实现下列特征方程中小于等于参数n的所有值。 H(0)=0; H(1)=1; H(2)=2; H(n)= H(n-1)+9H(n-2)-9H(n-3)
    题目思路:和上一道题一样,先把前三个元素设置好,之后进行H(n)递归调用H(n-1)+9H(n-2)-9H(n-3) 。
"""
程序名:实验4.4.py
功能:从键盘输入参数n,使用递归函数H(n)实现下列特征方程中小于等于参数n的所有值。
 H(0)=0; H(1)=1; H(2)=2; H(n)= H(n-1)+9H(n-2)-9H(n-3)
日期:2022.4.8
版本:1.0
"""
# 特征方程
def H(n):
       if n == 0 or n == 1 or n == 2:  # 前三个数的值分别为0,1,2
           return n
       return H(n - 1) + 9 * H(n - 2) - 9 * H(n - 3)  # H(n)= H(n-1)+9H(n-2)-9H(n-3)
num = eval(input("请输入n的值:"))
for i in range(0, num + 1):
       print(H(i), end=' ')  # 利用循环输出即可

运行结果截图:
图片描述
图片描述

  1. 编写函数,实现折半查找。
    题目思路:跟递归排序思想类似,设有一个从小到大的序列,取中间的元素m进行比较,如果等于需要查找的元素x则返回元素m,若x大于m则再从右边的区间查找,若x小于m则再从左边的区间查找,这样每次减少一半的查找范围。注意必须是有序序列,因此需要先把某个序列排序。
    程序代码:
"""
程序名:实验4.5.py
功能:实现折半查找。
 H(0)=0; H(1)=1; H(2)=2; H(n)= H(n-1)+9H(n-2)-9H(n-3)
日期:2022.4.8
版本:1.0
"""
# 二分查找
def binary_search(list1, l, r, num):
       if l > r:  # 递归结束条件
           return -1
       mid = (l + r) // 2
       if num < list1[mid]:
           r = mid - 1
       elif num > list1[mid]:
           l = mid + 1
       else:
           return mid
       return binary_search(list1, l, r, num)
list2 = list(map(eval, input("请输入一系列数据(空格隔开):").split()))  # 输入一系列数存到列表中
print(list2)
list2.sort()  # 二分查找需要一个有序序列
a = eval(input("请输入要查找的数:"))
if binary_search(list2, 0, len(list2) - 1, a) == -1:  # 递归结束条件是-1,表示找到最后没找到那个数
       print(f"表中没有{a}这个数")
else:  # 结束条件未触发表示找到那个数了
       print(f"表中有{a}这个数")

运行结果截图:
图片描述
图片描述

  1. 编写函数,从键盘输入参数x和n,计算并显示形如x+xx +xxx + xxxx + xxxxx+xxx…xxx+ 的表达式前n项的值。
    题目思路:初始字符串为"x",利用循环每次都给字符串后面加上"+“和i个"x“,例如第二次加上”+ xx",就这样循环到最后即可以得到字符串”x+xx+xxx+xxxx“,利用eval进行计算,如果eval参数是表达式,则eval()计算表达式。即可。
    程序代码:
"""
程序名:实验4.6.py
功能:从键盘输入参数x和n,计算并显示形如x+xx +xxx + xxxx + xxxxx+xxx…xxx+ 的表达式前n项的值。
日期:2022.4.8
版本:1.0
"""
# 重复求和
def Repeat_sum(x1, n1):
       result = x1  # 初始字符串为"x"
       for i in range(2, n1 + 1):
           result += ' + ' + x1 * i  # 利用循环逐个给result字符串加上"+" "i个x"
       print(result + " = " f"{eval(result)}")  # 如果eval参数是表达式,则eval()计算表达式
x = input("请输入参数x:")
n = eval(input("请输入参数n:"))
Repeat_sum(x, n)

运行结果截图:
图片描述

  1. 编写函数,从键盘输入参数n,计算并显示表达式1 +1/2 –1/3 + 1/4 –1/5 + 1/6+… +(-1)n/n 的前n项之和。
    题目思路:和上题一样,初始字符串为"1",每次给字符串后面加上“-或者+”和“1/i”,利用if条件判断偶数位+奇数位-。到最后就可以得到字符串“1+1/2-1/3+1/4…”,利用eval进行计算,如果eval参数是表达式,则eval()计算表达式。即可。
    程序代码:
"""
程序名:实验4.7.py
功能:从键盘输入参数n,计算并显示表达式1 +1/2 –1/3 + 1/4 –1/5 + 1/6+… +(-1)n/n 的前n项之和。
日期:2022.4.8
版本:1.0
"""
# 墨卡托级数 展开n项
def Mercator_series(n1):
       result = "1"  # 初始字符串为"1"
       for i in range(2, n1 + 1):
           if i % 2 != 0:
               result += " - "  # 奇数位为"-"
           else:
               result += " + "  # 偶数位为"+"
           result += "1/" + str(i)  # 第i位置的数为"操作符"+"1/i"
       print(result + " = " + f"{eval(result):.4f}")  # 如果eval参数是表达式,则eval()计算表达式,f"{}:.4f"保留表达式结果为四位小数
n = eval(input("请输入参数n:"))
Mercator_series(n)

运行结果截图:
图片描述

  1. 编写函数,从键盘输入一字符串,判断该字符串是否为会回文,所谓回文是指,从前向后读和从后向前读是一样的。
    题目思路:把字符串转置,然后和转置前的比较,这样能判断是否为回文。转置可以使用切片。注意判断字符串非空。
    程序代码:
"""
程序名:实验4.8.py
功能:从键盘输入一字符串,判断该字符串是否为会回文,所谓回文是指,从前向后读和从后向前读是一样的。
日期:2022.4.8
版本:1.0
"""
# 回文判断
def palindrome(s):
       if s[::-1] == s:  # 用切片转置s然后和s比较
           print(f"{s}是回文")
       else:
           print(f"{s}不是回文")
a = input("请输入一个字符串:")
while not a:  # 判断输入是否合法
       print("输入的字符串为空!")
       a = input("请重新输入一个字符串:")
palindrome(a)

运行结果截图:
图片描述
图片描述
图片描述

  1. 编写函数,从键盘输入一字符串,把其中的各个字符颠倒,标点符号不颠倒,例如,‘I enjoy reading!’,经过函数调用后变为‘gnidaer yojne I’。
    题目思路:首先应该先把标点符号去掉,因为标点符号不颠倒,去标点符号可以先把所有的英文标点符号存到一个字符串里,然后通过循环,利用remove函数把标点符号置空。颠倒可以用切片将字符串转置。然后输出。
    程序代码:
"""
程序名:实验4.9.py
功能:从键盘输入一字符串,把其中的各个字符颠倒,标点符号不颠倒。
例如,‘I enjoy reading!’,经过函数调用后变为‘gnidaer yojne I’。
日期:2022.4.8
版本:1.0
"""
# 字符串转置
def reversal(s):
       remove_chars = '!\"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~' # 英文标点符号
       for i in remove_chars:
           s = s.replace(i, '')  # 循环中利用replace函数将标点去除
       s = s[::-1]  # 利用切片转置
       print(f"转置后的字符串为:{s}")
a = input("请输入一字符串:")
reversal(a)

运行结果截图:
图片描述
图片描述

  1. 佩奇去超市购买54元巧克力和53元果冻,货币面值有20、10、2、1元,按付款货币数量最少原则,佩奇需要付给超市多少数量的货币,编写函数实现该算法。
    题目思路:基本思路就是优先用面值大的,用107去整除20得5,再用余数去除10…以此类推。得到货币数量最少。
    程序代码:
"""
程序名:实验4.10.py
功能:佩奇去超市购买54元巧克力和53元果冻,货币面值有20、10、2、1元,
按付款货币数量最少原则,佩奇需要付给超市多少数量的货币,编写函数实现该算法。
日期:2022.4.8
版本:1.0
"""
currency = [20, 10, 2, 1]
def currency_min(cost):
        number = 0  # 货币计数
        for i in currency:
            x = cost // i  # 某张货币需要的最大张数
            number += x  # 货币计数
            cost = cost % i  # 剩余钱数
            print(f"{i}元货币X{x}")
        print(f"最少需要付给超市{number}张货币")
cost1 = 107
currency_min(cost1)

运行结果截图:
图片描述

五、实验小结

问题与解决方法:

  1. 字符串倒置的时候使用reversed函数无法倒置,显示的时候<reversed object at 0x00000219EA977C70>,但是也没有报错。
    解决方法: reversed是列表中的转置函数,因此不能直接对字符串作用,字符串可以使用切片如s[::-1]来转置,或者把字符串转成列表再转置。
  2. 打不出英文的标点符号如" ’ \这类的符号。
    解决方法:部分标点符号因为有歧义,所以需要加\来输出,如‘\’需要输入"\“, ‘”‘需要输入”"“。这类符号都类似。
  3. 打印的时候,程序老是自动换行,如分别打印 1 2 3 4 5程序每一个数字都会换行。
    解决方法:print函数中第二个参数是end = ‘’ ,默认是end = ‘\n’ 因此如果需要输出一个接着一个中间空格分开,则需要输入end = ’ '。

心得体会:

  1. 学习到现在,已经感觉到自己写代码的能力越来越强了,对于很多题目可以很轻松的就写出来,即使有些题目可能因为对python内置函数和一些功能的不熟悉,通过查询相关函数的功能,也可以得到解决。和自己最开始学习python的时候不同,所以更加认识到上机写代码的重要性,代码方面只有通过自己手打去调试,才能够记忆深刻,增加自身能力。
  2. 函数这一节其实大部分使用的还是其他章节的内容,函数作为一个很好用的工具,可以方便我们进行一些功能的实现,如递归等等。而且函数可以让程序结构清晰,可读性好。还能够减少重复编码的工作量。在使用函数的时候要注意函数功能、函数参数的数目和顺序及各参数意义和类型、函数返回值意义和类型、以及是有参函数还是无参函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一只大狸子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值