欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sql调用自定义函数_Python 自定义函数(三) 匿名函数和递归调用

程序员文章站 2024-03-26 11:23:47
...

一、匿名函数    

       所谓匿名函数就是为了简化函数的定义,使用 lambda 作为匿名函数的关键字,以此引入表达式的语法。lamdba 这个名字来自于Lisp,而Lisp则是从lambda calculus(一种符号逻辑形式)取这个名称的。

       相比较普通的自定义函数而言,lambda通过就只有一个单一的表达式,可以写出简单的函数。lambda的格式:lambda  参数1,参数2..:运算

示例:

使用普通的def自定义函数求两个数之和:

def add(a, b):    s = a + b    return sresult = add(3, 5)print(result)>>>8

使用匿名函数求两个函数之和:

func = lambda a, b: a + bresult = func(5,6)print(result)>>>11

相比之下:使用匿名函数明显比使用def的函数要方便简洁。使用匿名函数的几个规则:

1、一般就只有一行表达式,而且必须要有返回值

2、不能有return

3、可以没有参数,也可以有一个或者多个参数

1、无参数匿名函数
t = lambda :Trueprint(t())>>>True

相当于:

def func():    return Trueprint(func())>>>True
2、匿名函数与 map 函数合用

示例1:对列表的每一个元素操作都加上2

list1 = [1,3,5,7,3,8,9,1,6,8,4]s = map(lambda x:x+2,list1)print(list(s))>>>[3, 5, 7, 9, 5, 10, 11, 3, 8, 10, 6]

示例1:对列表的每一个奇数加上1,偶数不变

list1 = [1, 3, 5, 7, 3, 8, 9, 1, 6, 8, 4]s = map(lambda x: x if x % 2 == 0 else x + 1, list1)print(list(s))>>>[2, 4, 6, 8, 4, 8, 10, 2, 6, 8, 4]
3、匿名函数与 reduce 函数合用

示例1:对列表和元组中的元素进行加减乘除运算的函数

from functools import reducetuple1 = (1, 2, 3, 4, 5, 6)result = reduce(lambda x, y: x + y, tuple1)print(result)>>>21
4、匿名函数与 filter 函数合用

示例1:对列表和元组中的元素进行筛选

tuple1 = (1, 2, 3, 4, 5, 6)result = filter(lambda x: x>3, tuple1)print(tuple(result))>>>(4, 5, 6)print(list(result))>>>[4, 5, 6]
5、匿名函数与 sorted 函数合用

示例1:对字典中的键值对进行排序,降序

dict1 = [{'a': 10, 'b': 17}, {'a': 45, 'b': 67}, {'a': 17, 'b': 43}, {'a': 2, 'b': 18}, {'a': 30, 'b': 15}]result = sorted(dict1, key=lambda x: x['b'], reverse=True)print(result)>>>[{'a': 45, 'b': 67}, {'a': 17, 'b': 43}, {'a': 2, 'b': 18}, {'a': 10, 'b': 17}, {'a': 30, 'b': 15}]
5、匿名函数作为参数使用
def func(x, y, func1):    print(x, y)    print(func1)    s = func1(x, y)    print(s)func(1, 2, lambda x, y: x ** y)>>>1 2 at 0x000002472171A940>1
二、递归调用

       递归函数其实就是普通函数的一种表现形式,函数自己调用自己。递归调用有两个基本要素:

(1) 边界条件:必须要设置一个终点,不然会一直递归下去。
(2) 递归模式:大问题是如何分解为小问题的,也称为递归体。

示例1:

def sum(n):    if n == 0:        return 0    else:        return n + sum(n - 1)result = sum(10)print(result)>>>55

每一次都调用了sum函数,一直调用到sum(0)。

第1次  10 + sum(9)

第2次  10 + 9 + sum(8)

第3次  10 + 9 + 8 + sum(7)

。。。。。

第9次  10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + sum(1)

第10次  10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + sum(0)

sum(0)为0,因此该函数就是求0到10是一个元素之和

练习:

       汉诺塔问题是递归函数的经典应用,它来自一个古老传说。总共有三个立柱A、B、C,A柱上穿有大小不等的圆盘N个,较大的圆盘在下,较小的圆盘在上。要求把A柱上的圆盘全部移到C柱上,可借助B柱。每次移动只能把一个柱子最上面的圆盘移到另一个柱子的最上面。请输出移动过程。对于汉诺塔问题的求解,可以通过以下3步实现:(1)将塔A上的n -1个碟子借助C塔先移动到B塔上;(2)把塔A上剩下的一个碟子移动到塔C上;(3)将n - 1个碟子从B塔借助塔A移动到塔C上。假设碟子数n=3时,汉诺塔问题的求解过程如下图所示:

sql调用自定义函数_Python 自定义函数(三) 匿名函数和递归调用

i = 1def move(n, mfrom, mto):    global i    print("第%d步:将%d号盘子从%s -> %s" % (i, n, mfrom, mto))    i += 1def hanoi(n, A, B, C):    if n == 1:        move(1, A, C)    else:        hanoi(n - 1, A, C, B)        move(n, A, C)        hanoi(n - 1, B, A, C)n = int(input("请输入碟子的个数:"))print("移动步骤如下:")hanoi(n, 'A', 'B', 'C')
>>>请输入碟子的个数:3移动步骤如下:第1步:将1号盘子从A -> C第2步:将2号盘子从A -> B第3步:将1号盘子从C -> B第4步:将3号盘子从A -> C第5步:将1号盘子从B -> A第6步:将2号盘子从B -> C第7步:将1号盘子从A -> C
请输入碟子的个数:4移动步骤如下:第1步:将1号盘子从A -> B第2步:将2号盘子从A -> C第3步:将1号盘子从B -> C第4步:将3号盘子从A -> B第5步:将1号盘子从C -> A第6步:将2号盘子从C -> B第7步:将1号盘子从A -> B第8步:将4号盘子从A -> C第9步:将1号盘子从B -> C第10步:将2号盘子从B -> A第11步:将1号盘子从C -> A第12步:将3号盘子从B -> C第13步:将1号盘子从A -> B第14步:将2号盘子从A -> C第15步:将1号盘子从B -> C

该代码示例来自于https://blog.csdn.net/SeeTheWorld518/article/details/47957183