函数参数传递,匿名函数、嵌套函数、递归函数(Python实例实现)

发布时间:2024年01月07日

一、主要目的

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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。