python3基础(七)-递归函数和匿名函数

1、递归函数

函数内调用自己本身函数,就叫做递归函数。
计算一个数字的阶乘n!=1*2*3*4*......*n
公式演变:
n! = 1 * 2 * 3 * 4 * ...... * (n - 2) * (n - 1) * n
    = n * (n - 1) * (n - 2) * ...... * 4 * 3 * 2 * 1
    = n * (n - 1)!
注意:
1、在函数的内部调用自己本身。
2、递归函数本质是一个方法的循环调用。有可能出现死循环。
3、一定要定义递归的边界(什么时候退出循环)

def factorial(n):
	if n < 0:
		print("负数没有阶乘")
	elif n == 0 or n == 1:
		#定义函数的终止条件
		return 1
	else:
		#定义函数的阶乘
		return n * factorial(n - 1)

a = factorial(10)
print(a)

2、匿名函数

用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。lambda函数的语法只包含一个语句:
lambda [arg1 [, arg2, ......, argn]]:expression    # lambda 参数 : 表达式
例如:
普通的函数实现一个简单的加法。
def add(a, b):
    return a + b
print(add(11, 22))
使用匿名函数的方式实现一个简单的加法:
func = lambda x, y : x + y
print(func(11, 22))    #func虽然是一个变量,但是就相当于是一个函数了

常用招数-使用匿名函数方式实现动态函数:
def test(a, b, fuction):
    result = function(a, b)    #在此函数里面,并未指定对a,b两个变量的操作方式,最终的结果与传入的匿名函数的实现方式为结果
    return result
print(11, 22, lambda x, y : x + y)    #此处传入的匿名函数对a, b两个参数的操作为执行相加

list.sort(key=None,reverse=False)    #排序函数,有两个默认参数,key是指定按照什么参数来进行排序,reverse是指定按升序还是降序,True为降序,False为升序
例如:
nums=[1, 3, 6, 2, 4]
nums.sort()    #如果不带参数,则代表sort()函数会取出nums当中每个元素,赋值给key,然后做对比排序。由于列表当中的元素是数字类型,所以是可以比对大小进行排序的。
然而如果列表当中的值是一个一个的字典呢?
stus=[{"name":"zs", "age":"10"},{"name":"ls", "age":"30"},{"name":"ww", "age":"20"}]
如果调用stus.sort()则会报错。因为字典与字典之间无法进行对比排序,比如{"name":"zs", "age":"10"}和{"name":"ls", "age":"30"}是完全无法比对的。
然而字典之间的比对,我们一般不是通过字典本身来进行比对排序,是通过字典内的某一个值进行排序,这种情况下应该怎么办呢?
因为sort()函数在比对时,会将每个值取出,赋值给key,那么在比对数值类型的列表的时候,key就是一个变量,特别方便比较。而如果key被人为的指定成了一个匿名函数呢?当key被赋值成一个字典的时候,是不是就可以通过匿名方法的参数,获取到这个字典,然后再通过表达式取出字典当中的某一个值后,再重新赋值给key,这样就可以进行比较了。
例如:
stus.sort(key = lambda x : x["name"])    #通过匿名函数取出字典变量当中的name值作对较
stus.sort(key = lambda x : x["age"])    #通过匿名函数取出字典变量当中的age值作对较

在上述的例子当中,虽然实现了函数的动态,但是整个程序却是死的,代码执行结果永远固定不变,那么怎么实现由用户输入指令呢?
def test(a, b, fuction):
    result = function(a, b)
    return result
func=input("请输入")    #在python2当中,这样就可以了
func_new=eval(func)    #由于在python3当中输入的内容全部被当成字符串,所以需要使用eval函数进行转换
print(11, 22, func_new)

那么lambda x, y : x + y则是由用户输入,则实现了动态程序。

3、数据交换

a=11
b=22
a,b=b,a
可变类型不能作为字典的key

作者:沧水巫云
博客:http://blog.csdn.NET/amir_zt/
以上原创,转载请注明出处,谢谢。
https://blog.csdn.net/amir_zt/article/details/83090567

猜你喜欢

转载自blog.csdn.net/u011635351/article/details/83090567
今日推荐