day14(1)--递归、匿名函数、内置函数
一、递归
- 定义:本质上是回溯和递推
- 回溯:询问答案的过程
- 递推:推出答案的过程
- 前提:
- 回溯到一个有结果的值开始递推
- 回溯与递推的条件要有规律
- 方式:
- 直接递归:自己调用自己
- 间接递归:通过别人来调用自己
- 栈溢出问题:
- 递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
- 使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
RuntimeError: maximum recursion depth exceeded in comparison 栈溢出报错解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
- 总结:
使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。
Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题
# -*- coding: utf-8 -*-
# 完成阶乘计算 n! = 1*2*3.....*(n-1)*n=n*(n-1)!
def fact(n):
if n==1:
return 1
return fact(n-1)*n print(fact(5)) # 斐波那契 def fib(a, b, stop):
if a > stop:
return
print(a, end=' ')
fib(b, a + b, stop) fib(0, 1, 10) # 0 1 1 2 3 5 8
# 什么是递归,完成询问年龄的递归,第一个⼈年纪10岁,后一个⼈是前一个⼈年纪的3倍,依次类推,求第三个⼈年纪
def fn(n):
age = 10
if n == 1:
return age
age = fn(n - 1) * 3
return age print(fn(3)) # 90 def fn(n, age):
if n == 1:
return age
age = fn(n - 1, age) * 3
return age print(fn(3, 10)) # 90
二、匿名函数(lambda):当我们在传入函数时,有时候不需要显式的定义函数,直接传入匿名函数更为方便
- 语法:lambda 参数:表达式
关键字 lambda 表示 匿名函数, 冒号(:)前的x表示函数参数,匿名函数有个限制,就是只有一个表达式,不用写return,返回值就是该表达式结果。
匿名函数优点:没有名字,因此不必担心名字冲突问题,另外,匿名函数也是个函数对象,也可以把匿名函数赋值给一个变量,在利用变量来调用函数(一般不这么操作,这样会失
去匿名函数本身的意义),也可以把匿名函数作为函数返回值使用。
# 匿名函数本质就是一个没有函数名没有函数体只有一个返回值(可以还返回一个值,或是列表字典等)的函数语法糖形式
# 一般结合内置函数使用,作为回调函数来使用
# 关键字:lambda |参数列表省略()
# 定义语法:
# lambda 参数列表:一个返回值表达式
f = lambda x, y: x + y # 如果用变量接受,则相当于有名函数,一次一般不这么用 # 应用场景:(一般不用一个变量名去接受)
# 1.匿名函数函数地址可以被一个变量接受,该函数可以作为函数名来使用,但违背初中
# 2.结合内置函数使用 : 内置函数某些参数需要一个函数地址
# 可以赋值一个有名函数名,也可以直接赋值匿名函数 def fn(arg):
print(arg)
return arg ls = [100, 200, 30, 40]
res = max(ls) res2 = max(ls, key=fn)
print('_____________________________________________')
print(res)
print('****************************************************')
res1 = max(ls, key=lambda ele: ele)
print(res1)
三 、内置函数
# 内置函数 iterable = [1, 2, 3, 4, 5, 65, 4]
res = max(iterable, key=lambda x: x) # 参数:可迭代对象遍历的元素,但绘制:作比较的值
print(res) iterable = {
'Bob': 12000,
'Tom': 37000,
'Jerry': 7600,
'Zero': 1200,
} res = max(iterable, key=lambda x: x)
print(res)
res = max(iterable, key=lambda x: iterable[x])
print(res) print('&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&') iterable = {
'Bob': {'no': 120, 'money': 120500},
'Tom': {'no': 130, 'money': 120040},
'Jerry': {'no': 10, 'money': 1200230},
'Zero': {'no': 1120, 'money': 120100}
}
res = max(iterable, key=lambda k: iterable[k]['no'])
print(res)
res = max(iterable, key=lambda x: iterable[x]['money'])
print(res) print('&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&') iterable = {
'Bob': [121, 120500],
'Tom': [20, 1205120],
'Jerry': [10, 120510],
'Zero': [120, 1220500],
}
# sorted 方法排序
res = sorted(iterable, key=lambda x: iterable[x][0]) # 按员工号排序
print(res)
res = sorted(iterable, key=lambda x: iterable[x][1]) # 按员工号排序
print(res) # map :映射
res = map(lambda x: x + 10, [1200, 3600, 4000, 2300])
print(list(res)) # reduce: 合并
from functools import reduce res = reduce(lambda f, n: f * n, [1, 2, 3, 4, 5]) # 阶乘5!
print(res) #
'''
# 重点:
# 反射
# getattr()
# setattr()
# delattr()
# classmethod()
# staticmethod()
# super() # 名称空间《==》可执行字符串
# exec()
# enumerate()
# isinstance()
# len()
# max()
# min()
# object()
# open()
# range()
# abs() 求绝对值
'''
print(abs(-10)) #
# all() 全真才真,可迭代元素所有元素全我真才真
print(all([1, 2, 3])) # True
print(all([1, 2, None])) # False
print(all([1, '', None])) # False
print(any([0, 1, None])) # True any元素有真则真 # bin()求二进制 oct()8进制 # eval(可以理解为将字符串去除 ,形成可执行对象
day14(1)--递归、匿名函数、内置函数的更多相关文章
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- python 匿名函数&内置函数
匿名函数:为了解决那些功能很简单的需求而设计的一句话函数怎么定义匿名函数: cal = lambda x : x*x # cal是函数名,lambda是定义匿名函数的关键字 冒号前面的额x是参数即函数 ...
- python学习day11 函数Ⅲ (内置函数与lambda表达式)
函数Ⅲ(内置函数&lambda表达式) 1.函数小高级 函数可以当做变量来使用: def func(): print(123) func_list = [func, func, func] # ...
- Python学习笔记014——迭代工具函数 内置函数enumerate()
1 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 2 语法 enumerate(sequ ...
- python 函数--内置函数
一.内置函数 内置函数是python自带的一系列常用函数. 二.python3中内置函数 内置功能 abs() delattr() hash() memoryview() set() ...
- Python——day14 三目运算、推导式、递归、匿名、内置函数
一.三目(元)运算符 定义:就是 if...else...语法糖前提:简化if...else...结构,且两个分支有且只有一条语句注:三元运算符的结果不一定要与条件直接性关系 cmd = input ...
- Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...
- python基础之递归,匿名,内置函数
递归函数: 什么是递归函数? 函数递归调用:在调用一个函数的过程中,又直接或间接地调用了该函数本身. 递归必须要有两个明确的阶段: ①递推:一层一层递归调用下去,强调:每进入下一层问题规模减少 ②回溯 ...
- Python 函数递归-三元表达式-列表生成式-字典生成式-匿名函数-内置函数
上节课复习: 1. 无参装饰器 def 装饰器名字(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res ...
- python基础12_匿名_内置函数
一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, ...
随机推荐
- 1970年// iPhone “变砖”后可继续正常使用的解决方案
0.解决方案 说话先说重点,“变砖”后的iphone怎么正常使用. 拆开后盖,给电源和处理器之间断下电就OK了. 1.事件来源 对于iPhone和iPad,把时间手动设置到1970年5月以前会出现“变 ...
- swipper的一个小坑
今天闲着没事用swipper写轮播图时,发现swipper的控制不起作用,当时就很难受, 后来经过自己的仔细排查发现,用了swipper4的语法,结果引入的CSS和JS都是Swipper3版本的. 特 ...
- eclipse安装其他颜色主题包
eclipse安装其他颜色主题包: 用Help-Install new software安装的时候,work with的URL是 http://eclipse-color-theme.github.c ...
- Android加载图片的策略
实现图片缓存也不难,需要有相应的cache策略.这里我采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且 ...
- Android 7.0 新特性
Android7.0提供新功能以提升性能.生产效率和安全性. 关于Android N的性能改进,Android N建立了先进的图形处理Vulkan系统,能少的减少对CPU的占用.与此同时,Androi ...
- Android内存优化(三)详解内存分析工具MAT
前言 在这个系列的前四篇文章中,我分别介绍了DVM.ART.内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT. 1.概述 在进行内存分析时,我们可以使用M ...
- NoHttp封装--06 NoHttp之队列、队列优先级
public class Main { /** * 程序入口 */ public void start() { // 第一种,先进先出的队列 // YolandaLinkedQueue queue = ...
- PHP 生成器语法
一般你在迭代一组数据的时候,需要创建一个数据,假设数组很大,则会消耗很大性能,甚至造成内存不足. //Fatal error: Allowed memory size of 1073741824 by ...
- [20180918]文件格式与sql_id.txt
[20180918]文件格式与sql_id.txt --//记录测试中遇到的一个问题.这是我在探究SQL*Net more data from client遇到的问题.--//就是实际oracle会把 ...
- 自动化测试基础篇--Selenium单选框(Radio)复选框(CheckBox)
摘自:https://www.cnblogs.com/sanzangTst/p/7686602.html 一.什么是单选框.复选框? 二.单选框:radio 三.复选框:checkbox 四.判断是否 ...