函数参数传递,匿名函数、嵌套函数、递归函数(Python实例实现)
2024-01-08 00:17:52
一、主要目的:
1.掌握函数的定义和调用方法。
2.掌握函数参数传递原理和方法。
3.掌握匿名函数、嵌套函数、递归函数的创建和调用方法。
4. 掌握变量类型和作用域。
二、主要内容和结果展示:
1.编写一个函func(n),接收一?个十进制整数n作为参数,返回一个二进制整数。
def func(n):
???? num = []
???? while n != 1 and n != 2:
???????? res = n % 2
???????? num.insert(0, res)
???????? n = int(n / 2)
???? num.insert(0, 1)
???? num = map(str, num)
???? return ''.join(num)
if __name__ == '__main__':
??? n = int(input("请输入一个十进制数:"))
??? print("返回的二进制数为",func(n))
2.编写两个函数,其中一个函数计算并返回斐波那契数列第i项(使用递归函数实现),另一个函数计算并返回斐波那契数列前?10?项的和,并对其进行测试。
def numb(i):
??? if i == 1:
??????? return 1
??? elif i == 2:
??????? return 1
??? else:
??????? return numb(i - 2) + numb(i - 1)
def sumn(n):
??? sum = 2
??? num1 = num2 = 1
??? for i in range(3,n + 1):
??????? num1, num2 = num2, num1
??????? num2 = num1 + num2
??????? sum += num2
??? return sum
if __name__ == '__main__':
??? i = int(input("请输入一个正整数:"))
??? print("斐波那契数列第%d项为%d"%(i,numb(i)) )
??? print("斐波那契数列前10项的和为",sumn(10) )
3.编写一个函数func(str),计算并返回字符串?str?中的数宇、字母及其他类型字符的个数。
def func(str):
??? num = ch = other = 0
??? for i in str:
??????? if i <= '9' and i >= '0':
??????????? num += 1
??????? elif i >= 'a' and i <= 'z':
??????????? ch += 1
??????? else:
??????????? other += 1
??? return num,ch,other
if __name__ == '__main__':
??? str = input("请输入一串字符串:")
??? print("字符串中的数字,字母及其他类型的个数为:",func(str))
4.?编写一个函数func?(strl,?str2),将字符串str1?中出现的宇符串st2?删除,然后作为函数的结果返回。
def func(str1, str2):
??? list3 = []
??? inde = str1.find(str2)
??? for i in range(0, len(str1)):
??????? if i < inde or i > inde + len(str2) - 1 :
??????????? list3.append(str1[i])
??? return ''.join(list3)
if __name__ == '__main__':
??? str1 = input("请输入字符串:")
??? str2 = input("请输入要删除的字符串:")
??? print("删除后的字符串为:",func(str1,str2))
5.?编写一个函数func?(n)?实现如下功能:
(1)如果传入的函数?n?为偶数,函数返回1/2+1/4+…+1/2n的结果。
(2)?如果传入的函数n?为奇数,两数返回1/1+1/3+…+1/(2n+1)的结果。
def func(n):
??? sum = 0
??? if n % 2 == 0:
??????? for i in range(2,2*n+2,2):
??????????? sum += 1/i
??? else:
??????? for i in range(1,2*n+3,2):
??????????? sum += 1/i
??? return sum
if __name__ == '__main__':
??? n = int(input("请输入一个整数:"))
??? print("结果为:",func(n))
6.有5个人坐在一起。向第5?个人询问其岁数,他说他比第?4个人大2岁;向第4?个人询问其岁数,他说他比第3个人大2岁;向第3个人询问其岁数,他说他比第2人大2岁;向第2个人询问其岁数,他说他比第1个人大2岁;向第1个人询问其岁数,他说他10岁。问:第5个人的岁数是多少(分别使用非递归函数和递归函数实现)?
def nofunc(n):
??? old = 10
??? for i in range(1,`n):
??????? old += 2
??? return old
def func(n):
??? if n == 1:
??????? return 10
??? else:
??????? return func(n - 1) + 2
if __name__ == '__main__':
??? print("第5个人%d岁。"%nofunc(5))
??? print("第5个人%d岁。" % func(5))
7.如果一个正整数的所有因子(包括?1,不包括它本身)之和与该数相等,则称这个数为完数。
例如,6是一个完数,因为?6=1+2+3。编写一个函数?isWs(n)判断传入的正整数是否为完数,若返回True?则是完数,若返回?False?则不是完数。
def isWs(n):
??? sum = 0;
??? for i in range(1, n):
??????? if n % i == 0:
??????????? sum += i;
??? if sum == n:
??????? return True
??? else:
??????? return False
if __name__ == '__main__':
??? n = int(input("请输入一个正整数:"))
??? flag =? isWs(n)
??? if flag == True:
??????? print(n,"是一个完数。")
??? else:
??????? print(n, "不是一个完数。")
8.验证哥德巴赫猜想:任意一个大于?2的偶数都可以表示成?2个素数之和。编写一个函数
isGDBH(n)将传入的?6~100?之间的偶数表示为?2?个素数之和,结果保存在列表中返回。例如,函数传入参数为?10,则返回[“10=3+7”,?“10=5+5"]。
import math
def isGDBH(n):
??? list1 = []
??? def isprimenum(m):
??????? for i in range(2, int(math.sqrt(m) + 1), 1):
??????????? if m % i == 0:
??????????????? return -1
??????? return 1
??? for j in range(1, int(n / 2) + 1):
??????? if isprimenum(j) == 1 and isprimenum(n - j) == 1:
??????????? list1.append("{0}={1}+{2}".format(str(n),str(j),str(n - j)) )
??? return list1
if __name__ == '__main__':
??? n = int(input("请输入一个6~100间的偶数:"))
??? print(isGDBH(n))
9.编程实现如下功能:
(1)编写3个函数,分别求三角形、矩形和圆形周长。
(2)使用装饰器对上述3个函数的传入参数进行调用和合法性检查。
import math
def decorator(func):
??? def check_call_square(x, y, z):
??????? if x > 0 and y > 0 and z > 0 and z < x + y and z > math.fabs(x - y):
??????????? return func(x, y, z)
??????? else:
??????????? return "提示:函数参数" + str(x) + "," + str(y) + "和" + str(z) + "必须为非负数且能够组成三角形!"
??? return check_call_square
@decorator
def square(x, y, z):
??? return 2 * (x + y + z)
def decorator2(func):
??? def check_call_rec(x, y):
??????? if x > 0 and y > 0 :
??????????? return func(x, y)
??????? else:
??????????? return "提示:函数参数" + str(x) +? "和" + str(y) + "必须为非负数!"
??? return check_call_rec
@decorator2
def rec(x, y):
??? return 2 * (x + y)
def decorator3(func):
??? def check_call_cir(x):
??????? if x > 0 and y > 0 :
??????????? return func(x)
??????? else:
??????????? return "提示:函数参数" + str(x) + "必须为非负数!"
??? return check_call_cir
@decorator3
def cir(x):
??? return 2 * 3.14 * x
if __name__ == '__main__':
??? x,y,z = map(int,input("请输入三角形三边长度:").split())
??? print(square(x, y, z))
??? x, y = map(int, input("请输入矩形的长宽:").split())
??? print(rec(x, y) )
??? x = int(input("请输入圆形的半径:"))
??? print(cir(x) )
三、心得体会
? 通过这次实验,我有了更深入的理解和掌握了Python中函数的定义和调用方法。我学会了如何编写具有不同功能的函数,如转换数字、计算数列和处理字符串等。这些技能对我在将来解决实际问题时是非常有价值的。在函数参数传递方面,我理解了Python中的按值传递和按引用传递的区别,以及如何通过这些方式在函数间传递数据。我还学会了如何使用默认参数、关键字参数和可变参数,这让函数调用更加灵活。此外,我掌握了匿名函数、嵌套函数和递归函数的创建和使用。通过递归函数编写斐波那契数列和计算人的年龄问题,我深刻体会到了递归在解决某些类型问题时的优雅和效率。在变量类型和作用域方面,我了解了局部变量和全局变量的区别,以及如何在函数内部正确地引用和修改它们。我学会了利用作用域规则来保护代码不受外界不必要的干扰。对于实验内容的每一部分,我都进行了详尽的测试,以确保我的函数按预期工作。调试和测试不仅帮助我发现并修复了代码中的错误,也让我对编写的程序有了更深的理解。
文章来源:https://blog.csdn.net/xixixi7777/article/details/135434441
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!