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

本文详细介绍了如何在Python中定义和调用函数,包括参数传递、匿名函数、嵌套函数、递归、变量类型、作用域,以及使用装饰器进行参数检查。通过实例展示了斐波那契数列计算、字符串操作和数学问题解决方法。
摘要由CSDN通过智能技术生成

一、主要目的

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中的按值传递和按引用传递的区别,以及如何通过这些方式在函数间传递数据。我还学会了如何使用默认参数、关键字参数和可变参数,这让函数调用更加灵活。此外,我掌握了匿名函数、嵌套函数和递归函数的创建和使用。通过递归函数编写斐波那契数列和计算人的年龄问题,我深刻体会到了递归在解决某些类型问题时的优雅和效率。在变量类型和作用域方面,我了解了局部变量和全局变量的区别,以及如何在函数内部正确地引用和修改它们。我学会了利用作用域规则来保护代码不受外界不必要的干扰。对于实验内容的每一部分,我都进行了详尽的测试,以确保我的函数按预期工作。调试和测试不仅帮助我发现并修复了代码中的错误,也让我对编写的程序有了更深的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xixixi77777

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

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

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

打赏作者

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

抵扣说明:

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

余额充值