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

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

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

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

    python3--内置函数 内置函数: 截止到python 3.6.2 版本,现在python一共提供了68个内置函数:即python提供给你直接可以拿来使用的所有函数.   内置函数  (点击函数查 ...

  2. python基础10 ---匿名函数和递归

    一.匿名函数 1.lambda表达式就相当于匿名函数,其格式为: lambda 参数列表:参数表达式 2.lambda自带return值,因为匿名函数有个限制,就是只能有一个表达式,不用写return ...

  3. python基础:函数传参、全局变量、局部变量、内置函数、匿名函数、递归、os模块、time模块

    ---恢复内容开始--- 一.函数相关: 1.1位置参数: ef hello(name,sex,county='china'): pass #hello('hh','nv') #位置参数.默认参数 1 ...

  4. javascript . 04 匿名函数、递归、回调函数、对象、基于对象的javascript、状态和行为、New、This、构造函数/自定义对象、属性绑定、进制转换

    匿名函数:   没有名字的函数,函数整体加小括号不报错, 函数调用 : a:直接调用 (function (){函数体}) ( ) ; b:事件绑定 document.onlick = functio ...

  5. 《Python》 内置函数补充、匿名函数、递归初识

    一.内置函数补充: 1.数据结构相关(24): 列表和元祖(2):list.tuple list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素). tuple:将一个可迭代对象转 ...

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

    一.内置函数 1.数学运算类 abs:求数值的绝对值 divmod:返回两个数值的商和余数,可用于计算页面数 >>> divmod(5,2) (2, 1) max:返回可迭代对象中的 ...

  7. python之匿名函数、递归与二分法

    一.匿名函数 什么是匿名函数? 顾名思义就是没有名字的函数,在我们声明一个函数时会想起个什么函数名好,这个问题我想有时候会困惑大家的吧?   def func(): #正常函数声明 pass prin ...

  8. python3.x 匿名函数lambda_扩展sort

    #匿名函数lambda 参数: 表达式关键字 lambda 说明它是一个匿名函数,冒号 : 前面的变量是该匿名函数的参数,冒号后面是函数的返回值,注意这里不需使用 return 关键字. ambda只 ...

  9. python--内置函数、匿名函数、递归调用

    匿名函数 有名函数: def func1(x): print(func1) 结果: <function func1 at 0x00000000005C3E18> 匿名函数: func2=l ...

随机推荐

  1. object 覆盖 div 在IE 和Firefox 的解决方案

    问题描述 公司产品需要在三维(3D)控件上显示弹框,按钮等,然而三维控件的object覆盖了div,弹框和按钮不能显示 firefox 解决方案 最外层div的背景使用不透明背景色,必须是不透明的哦 ...

  2. ChromeExtension那些事儿

    Chrome Extension是什么呢? 简而言之,就是Chrome扩展,它是基于Chrome浏览器的,我们可以理解它为一个独立运行在Chrome浏览器下的APP,当然核心编程语言就是JavaScr ...

  3. 一行代码巧妙实现iOS返回button

    一行代码巧妙实现iOS返回button: self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[ ...

  4. JS排序

    冒泡排序 https://sort.hust.cc/1.bubbleSort.html 选择排序 https://sort.hust.cc/2.selectionSort.html 插入排序 http ...

  5. 初识homebrew

    homebrew是MAC上的一个包管理工具,用于软件安装,非常方便. homebrew安装: 命令行执行: ruby -e "$(curl -fsSL https://raw.githubu ...

  6. ssm学习(五)--加入分页插件

    之前我们的查询列表是将所有的数据查询出来,并没有做分页,当数据很少的时候,是不需要分页,但是如果数据很多的时候,所有数据显示在一个页面显然是不合适的. 之前用hibernate的时候,可以直接通过查询 ...

  7. 深入理解计算机系统_3e 第六章家庭作业 CS:APP3e chapter 6 homework

    6.22 假设磁道沿半径均匀分布,即总磁道数和(1-x)r成正比,设磁道数为(1-x)rk: 由题单个磁道的位数和周长成正比,即和半径xr成正比,设单个磁道的位数为xrz: 其中r.k.z均为常数. ...

  8. Intellij IDEA更新SVN没有提示语

    更新SVN时IDE下方没有提示语句 解决方法: 点击编辑器右下方的 Event Log 按钮 打开 Show balloons 就可以显示了.

  9. TypeScript学习笔记之接口类型

    TypeScript的接口,个人理解就是一种约束,包括各种类型的契约或者代码定义上的契约.当然,和java中的用法基本一致,接口可以被继承也可以被实现. 定义一个简单的interface interf ...

  10. 栈stack(1):栈的数组实现

    定义 栈(stack),是一个只允许在表尾端进行删除插入操作的线性表,是一种后进先出(LIFO,last in first out)的数据结构. 因此,对于栈来说,我们规定进行删除插入操作的表尾端称为 ...