【Python3之匿名函数及递归】

一、匿名函数及内置函数补充

1.语法

Python使用lambda关键字创造匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义一个函数。

语法:

lambda [arg1[, arg2, ... argN]]: expression

例:

普通函数

def func(x,y):
    return x+y

print(func)
print(func(1,2))

输出

<function func at 0x102b31f28>
3

等价的匿名函数

#匿名函数
f=lambda x,y:x+y
print(f)

print(f(1,2))

输出

<function <lambda> at 0x107a55f28>
3

2.匿名函数配合内置函数的用法

  • max,min,zip,sorted的用法
  • max(arg1, arg2, *args[, key]) #key=keyfunc

salaries={
‘e‘:3000,
‘a‘:100000000,
‘w‘:10000,
‘y‘:2000
}

print(max(salaries))  #默认比较key值大小
res=zip(salaries.values(),salaries.keys())  #以values比较
print(max(res))

  • 配合匿名函数实现上面功能

salaries={
‘e‘:3000,
‘a‘:100000000,
‘w‘:10000,
‘y‘:2000
}

def func(k):
    return salaries[k]

print(max(salaries,key=func))   #传递函数
print(max(salaries,key=lambda k:salaries[k]))   #配合匿名函数,比较values
print(min(salaries,key=lambda k:salaries[k]))
# print(sorted(salaries,key=lambda x:salaries[x],reverse=True)) #默认的排序结果是从小到到

输出

a
a
y

补充:

  • map(functioniterable...)
  • 对可迭代函数‘iterable‘中的每一个元素应用‘function’方法,将结果作为list返回。

例:

l=[‘a‘,‘w‘,‘y‘]
res=map(lambda x:x+‘_12‘,l)
print(res)
print(list(res))

nums=(2,4,9,10)
res1=map(lambda x:x**2,nums)
print(list(res1))

输出

<map object at 0x108e0bef0>
[‘a_12‘, ‘w_12‘, ‘y_12‘]
[4, 16, 81, 100]
  • reduce(function, sequence[, initial]) -> value
  • 对sequence中的item顺序迭代调用function,函数必须要有2个参数。要是有第3个参数,则表示初始值,可以继续调用初始值,返回一个值。
l=[1,2,3,4,5]
print(reduce(lambda x,y:x+y,l,10))  #10+1+2+3+4+5

输出

25

  • filter(function or None, sequence) -> list, tuple, or string
  • 对sequence中的item依次执行function(item),将执行结果为True(!=0)的item组成一个List/String/Tuple(取决于sequence的类型)返回,False则退出(0),进行过滤。
l=[‘a_SB‘,‘w_SB‘,‘y‘,‘egon‘]

res=filter(lambda x:x.endswith(‘SB‘),l)
print(res)
print(list(res))

输出

<filter object at 0x10bc43ef0>
[‘a_SB‘, ‘w_SB‘]

二、递归调用

1.定义

递归就是在过程或函数里调用自身,在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

递归的两个阶段:

递归和回溯

2.递归思想

例:

阶乘函数的定义是:
N! = factorial(N) = 1 * 2 * 3 * ... * N

那么可以用这种方法来看阶乘函数:
factorial(N) = N!
             = N * (N - 1)!
             = N * (N - 1) * (N - 2)!
             = N * (N - 1) * (N - 2) * ... * 3 * 2 * 1
             = N * factorial(N - 1)

于是我们有了阶乘函数的递归版本:

def factorial(n):
    if n == 0 or n == 1: return 1
    else: return (n * factorial(n - 1))

print(factorial(6))

可以很轻易的得到,6!的结果是720。

每一个递归程序都遵循相同的基本步骤: 
1.初始化算法。递归程序通常需要一个开始时使用的种子值(seed value)。要完成此任务,可以向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值。 
2.检查要处理的当前值是否已经与基线条件相匹配(base case)。如果匹配,则进行处理并返回值。 
3.使用更小的或更简单的子问题(或多个子问题)来重新定义答案。 
4.对子问题运行算法。 
5.将结果合并入答案的表达式。 
6.返回结果。

3.用途

递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(比如Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。(比如树的遍历,图的搜索)   

递归的缺点:递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

4.二分法

l = [1, 2, 10,33,53,71,73,75,77,85,101,201,202,999,11111]

def search(find_num,seq):
    if len(seq) == 0:
        print(‘not exists‘)
        return
    mid_index=len(seq)//2
    mid_num=seq[mid_index]
    print(seq,mid_num)
    if find_num > mid_num:
        #in the right
        seq=seq[mid_index+1:]
        search(find_num,seq)
    elif find_num < mid_num:
        #in the left
        seq=seq[:mid_index]
        search(find_num,seq)
    else:
        print(‘find it‘)

search(77,l)
search(72,l)
search(-100000,l)

输出

[1, 2, 10, 33, 53, 71, 73, 75, 77, 85, 101, 201, 202, 999, 11111] 75
[77, 85, 101, 201, 202, 999, 11111] 201
[77, 85, 101] 85
[77] 77
find it
[1, 2, 10, 33, 53, 71, 73, 75, 77, 85, 101, 201, 202, 999, 11111] 75
[1, 2, 10, 33, 53, 71, 73] 33
[53, 71, 73] 71
[73] 73
not exists
[1, 2, 10, 33, 53, 71, 73, 75, 77, 85, 101, 201, 202, 999, 11111] 75
[1, 2, 10, 33, 53, 71, 73] 33
[1, 2, 10] 2
[1] 1
not exists

时间: 2024-10-14 04:49:13

【Python3之匿名函数及递归】的相关文章

第16天 匿名函数,递归,二分法,内置函数

匿名函数 1. 什么是匿名函数? 匿名函数就是用lambda关键字声明的一行没有名字的函数.既然有匿名函数,就肯定有有名函数,有名函数就是通过def关键字声明的有名字的函数. 2. 为什么要用匿名函数呢? 匿名函数的特点就是没有名字,不像有名函数,我们没有办法通过名字进行函数调用,只能在定义函数的阶段就调用调用函数,这也就决定了这样的函数只能被调用一次这个特点.(注意此处的调用一次只是说只能被一个时间调用一次)不仅如此,上面也说了匿名函数是通过lambda关键字声明的一行函数,这也就决定了匿名函

day23 内置函数,匿名函数,递归

Python之路,Day11 = Python基础11 内置函数divmod(x, y)   # (商, 模)enumerate(可迭代对象)     # (序号,值)eval(字符串) # 把字符串当成命令执行set({1,2,3})   # 可变集合(增删改)frozenset({1,2,3})        # 不可变集合globals()   # 查看全局变量locals()   # 查看局部变量isinstance(3, int)     # 查看3是不是int类型pow(3,3)  

在NewLisp中实现匿名函数的递归

匿名函数在很多语言中的表现形式大概如下: (lambda (n)   (* (+ n 1) (- n 1))) 只有参数列表和函数体,而没有名字.在大部分情况下没问题,但是一旦需要用到递归的话,就有点麻烦了,因为不知道如何去递归的调用一个匿名函数. 在学术界中有一些解决这个问题的办法,其中一个就是Y组合子,但是那个太繁琐,而且难以通过宏自动将一个lambda变成可递归形式,没什么好处. 根据历史经验,目前比较好的办法,就是实现一个操作符,匿名函数通过这个操作符来调用自身: (lambda (n)

内置函数,匿名函数,递归

内置函数: 详查下网址 https://docs.python.org/3/library/functions.html?highlight=built#ascii divmod(x, y)   # (商, 模)enumerate(可迭代对象)     # (序号,值)eval(字符串) # 把字符串当成命令执行frozenset({1,2,3})        # 不可变集合globals()   # 查看全局变量locals()   # 查看局部变量isinstance(3, int)  

Python基础(10)_内置函数、匿名函数、递归

一.内置函数 1.数学运算类 abs:求数值的绝对值 divmod:返回两个数值的商和余数,可用于计算页面数 >>> divmod(5,2) (2, 1) max:返回可迭代对象中的元素中的最大值或者所有参数的最大值 语法:max(iterable,key,default) 1 salaries={ 2 'egon':3000, 3 'alex':100000000, 4 'wupeiqi':10000, 5 'yuanhao':2000 6 } 7 8 print(max(salari

【Python之匿名函数及递归】

一.匿名函数及内置函数补充 1.语法 Python使用lambda关键字创造匿名函数.所谓匿名,意即不再使用def语句这样标准的形式定义一个函数. 语法: lambda [arg1[, arg2, ... argN]]: expression 例: 普通函数 def func(x,y): return x+y print(func) print(func(1,2)) 输出 <function func at 0x102b31f28> 3 等价的匿名函数 #匿名函数 f=lambda x,y:x

python之内置函数、匿名函数、递归

一.内置函数 内置函数详解:http://www.runoob.com/python/python-built-in-functions.html 二.匿名函数 匿名函数就是不需要显式的指定函数 1 #这段代码 2 def calc(n): 3 return n**n 4 print(calc(10)) 5 6 #换成匿名函数 7 calc = lambda n:n**n 8 print(calc(10)) 特点: 1.lambda只是一个表达式,函数体比def简单很多 2.lambda的主体是

Day 23 (06/20)匿名函数、递归

内置函数补充: # print(divmod(73,23))## total_count=73# per_count=23## res=divmod(total_count,per_count)# if res[1] > 0:# page_count=res[0]+1## print(page_count)# ## l=['a','b','c']### for i in enumerate(l):# print(i)## dic={'name':'egon','age':18}# for i i

python内置函数、匿名函数、递归

一.内置函数 内置函数详解:http://www.runoob.com/python/python-built-in-functions.html 二.匿名函数 匿名函数就是不需要显示的指定函数 #这段代码 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n:n**n print(calc(10)) l=[3,2,100,999,213,1111,31121,333] print(max(l)) dic={'k1':1