sql调用自定义函数_Python 自定义函数(三) 匿名函数和递归调用
一、匿名函数
所谓匿名函数就是为了简化函数的定义,使用 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时,汉诺塔问题的求解过程如下图所示:
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
上一篇: 基于AOP的日志输出自定义注解
下一篇: 自定义checkbox样式