#函数递归
是一种特殊的函数嵌套调用,在调用一个函数的过程中,又直接或间接的调用该函数本身
递归必须要有两个明确的阶段:
 递推:一层一层递归调用下去,强调每进入下一层递归问题的规模都必须有所减少
 回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推
   开始一层一层回溯
 递归的本质在于通过不断地重复逼近一个最终的结果
 python解释器的内存管理机制为了防止其无限制占用内存,对函数的递归调用做了最大的层级限制
(1)递归的调用方式,直接调用、间接调用:
直接调用:
def f1():
    print('from f1')
    f1()
f1()

间接调用:
def bar():
    print('from bar')
    foo()

def foo():
    print('from foo')
    bar()
foo()

import sys
print(sys.getrecursionlimit())  #归队循环的值默认是1000行
sys.setrecursionlimit(10)     #可以更改默认循环取值的行数
def foo(n):
    print('from foo',n)
    foo(n+1)
foo(0)

题目一:递归询问年龄的举例
#理解递归实际是在逼近一个最终的结果(例如询问年龄的举例)
#从第五个人开始每一次的循环都是往记过靠近了一步,
#递归和while循环相比,只需要知道限定好最终结果就行
# age(5) = age(4) + 2   34
# age(4) = age(3) + 2   32
# age(3) = age(2) + 2   30
# age(2) = age(1) + 2   28
# age(1) = 26

# age(n) = age(n-1) + 2 #n > 1
# age(1) = 26           #n = 1

def age(n):
    if n == 1:
        return 26    #回溯要有一个明确的结束条件
 res=age(n-1)+2
    return res
print(age(5))

题目二:递归取嵌套列表的值
#递归取嵌套列表的值
num=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]]
def tell(num):
    for n in num:
        if type(n) is list:  #判断for循环取出的是不是列表类型
            tell(n)
        else:
            print(n)
tell(num)
# 输出结果为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

(2)二分法在里边中查找到指定的一个数字
nums=[1,3,7,9,12,23,34,45,56,67,78,89,100]
def search(search_num,nums):
    print(nums)
    if len(nums) == 0:
        print('不在列表中')
        return
    mid_index=len(nums) // 2
    if search_num > nums[mid_index]:
        #确定在右半边查找
        nums=nums[mid_index+1:]   #nums范围赋值给右半边
        search(search_num,nums)
    elif search_num < nums[mid_index]:
        #确定在左半边查找
        nums=nums[:mid_index]   #nums范围赋值给右半边    #[1, 3, 7, 9, 12, 23]  [1, 3, 7]  [1]
        search(search_num,nums)
    else:
        print('找到了')

search(23,nums)
输出结果为:
[1, 3, 7, 9, 12, 23, 34, 45, 56, 67, 78, 89, 100]
[1, 3, 7, 9, 12, 23]
[1, 3, 7]
[1]
找到了

(3)匿名函数的格式和应用
匿名函数:没有绑定名字,用一次就被回收
普通函数
def func(x,y):  func=函数的内存地址
    return x+y
func(1,2)
演变为匿名函数格式为:
print(lambda x,y:x+y)          #没有赋值,打印结果是函数的内存地址
print((lambda x,y:x+y)(1,2))   #x+y相当与return x+y

(4)max函数取字典中的value值的最大值(min取最小值)
max的工作原理
1、首先将可迭代对象变成迭代器对象
2、res=next(可迭代器对象),将res当作参数传给key指定的函数,然后将该函数的返回值当作判断依据

salaries={
    'egon':3000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2000
}
方式一:有名函数
def func(k):
    return salaries[k]  #将字典每次next取出的key值传给func函数,然后通过func函数返回每个对应的value值,做判断依据

print(max(salaries,key=func)) #next(iter_s) salaries可迭代对象
print(min(salaries,key=func)) #取value最小值

#赋值思路分析;
'egon', v1=func('egon')
'alex', v2=func('alex')
'wupeiqi', v3=func('wupeiqi')
'yuanhao', v4=func('yuanhao')

方式二:匿名函数实现格式如下
print(max(salaries,key=lambda k:salaries[k]))

(5)sorted函数 从大到小排序
sorted()函数,例如列表中的参数,实现从小到大排列
sorted:分类、挑选的意思 reverse:颠倒
l=[3,2,5,1,2,7,9]
print(sorted(l,reverse=False)) #默认参数reverse=False从小到大排列
print(sorted(l,reverse=True)) #默认参数reverse=False从大到小排列

(6)map函数 映射
实验效果:使用map映射函数将每个名字后面添加good
map的工作原理
1 首先将可迭代对象变成迭代器对象
2 res=next(可迭代器对象),将res当作参数传给第一个参数指定的函数,
然后将该函数的返回值当作map的结果之一
names=['张三','李四','王五','赵六']
方式一:列表推导式
print([name+'good' for name in names])
方式二:map+无参函数调用
name=map(lambda x:x+"good",names)
print(name)        #在python2中直接打印出来就是列表
print(list(name))  #在python3中,name有iter和next,所以更加优化空间输出结果为迭代器

(7)filter函数 过滤
# filter过滤
names=['张三good', '李四good', '王五', '赵六good']
方式一:
print([name for name in names if name.endswith('good')])
方式二:
name=filter(lambda x:x.endswith('good'),names)
print(list(name))

python递归函数、二分法、匿名函数、(sorted、map、filter内置函数应用)的更多相关文章

  1. map内置函数、lambda表达式、快捷生成想要的列表、filter内置函数

      map函数                             语法 map(function, iterable, ...) 参数 function -- 函数,有两个参数 iterable ...

  2. [JSP][JSTL]页面调用函数--它${fn:}内置函数、是推断字符串是空的、更换车厢

    页面中调用函数--之${fn:}内置函数 函数描写叙述 fn:contains(string, substring) 假设參数string中包括參数substring,返回true fn:contai ...

  3. python 内部函数,以及lambda,filter,map等内置函数

    #!/usr/bin/python #encoding=utf-8 def back(): return 1,2, "xxx" #python 可变参数 def test(*par ...

  4. python基础--递归、三元表达式、列表(字典)生成式、匿名函数、常用的内置函数

    函数的递归:函数在调用阶段直接或者间接的又调用自身 递归的两个阶段: 1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都是应该下降的,直接有一个最终的结束条件(这个结束条 ...

  5. day16 函数的用法:内置函数,匿名函数

    思维导图需要补全 : 一共有68个内置函数: #内置:python自带 # def func(): # a = 1 # b = 2 # print(locals()) # print(globals( ...

  6. Python之路【第四篇】: 函数、递归、内置函数

    一. 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 while True: i ...

  7. Python中生成器,迭代器,以及一些常用的内置函数.

    知识点总结 生成器 生成器的本质就是迭代器. 迭代器:Python中提供的已经写好的工具或者通过数据转化得来的. 生成器:需要我们自己用Python代码构建的 创建生成器的三种方法: 通过生成器函数 ...

  8. Python语法速查: 1. 数据类型与内置函数

    返回目录 (1)常用内置数据类型 分类 类型名称 描述 数字 int 整数 float 浮点数 complex 复数 bool 布尔值 序列 str 字符串(不可变序列) list 列表 tuple ...

  9. 跟着ALEX 学python day3集合 文件操作 函数和函数式编程 内置函数

    声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  一. 集合 集合是一个无序的,不重复的数据组合,主要作用如下 1.去重 把一个列表变成集合 ,就自动去重 ...

  10. Python学习之路6☞函数,递归,内置函数

    一python中的函数 函数是逻辑结构化和过程化的一种编程方法. python中函数定义方法: def test(x): "The function definitions" x+ ...

随机推荐

  1. Elasticsearch-分片原理1

    Elasticsearch版本:6.0 Elasticsearch基于Lucene,采用倒排索引写入磁盘,Lucene引入了按段搜索的概念,来动态更新索引. 一个Lucene索引包含一个提交点和三个短 ...

  2. 中国区 Azure 服务和定价模式概述

    由世纪互联运营的 Microsoft Azure 是第一个在中国正式商用,符合中国政府相关法规要求的国际化公有云服务.本文剖析了由世纪互联运营的 Microsoft Azure 的运营模式.采购模式. ...

  3. Linq语法学习_增删篇。

    关键词: select from where in into join on equals orderby descending thenby Table<TEntity> Default ...

  4. 【转】 iOS学习之NSBundle介绍和使用

    bundle是一个目录,其中包含了程序会使用到的资源.这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in).对应bundle, cocoa提供了类NSBun ...

  5. tpcc-mysql的安装和使用

    tpcc-mysql介绍 TPC(Tracsaction Processing Performance Council) 事务处理性能协会是一个评价大型数据库系统软硬件性能的非盈利的组织,TPC-C是 ...

  6. WPF知识点全攻略11- 命令(Command)

    先看一下命令的简单使用: <Window.CommandBindings> <CommandBinding Command="ApplicationCommands.Cut ...

  7. 剑指offer58 二叉树的下一个结点

    自己写的 class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(pNode == NULL) return ...

  8. 简单的cocos2dx笔试题

    1.参数传递有几种方式?值传递.指针传递.引用传递 2.指针和引用有什么分别:如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗? 1.指针是一个变量,存储一个地址,指向内存的一个存储单元: ...

  9. git 指令记录

    由于之前一直用svn 用git也是用图形化的工具 还是要了解一下git指令 因为都是版本控制工具 有很多相似之处 所以理解起来也比较轻松 仓库: github上面的项目 工作目录下面的所有文件都不外乎 ...

  10. CentOS7 中使用 firewall-cmd 控制端口和端口转发

    0X00 firewalld 守护进程 firewall-cmd命令需要firewalld进程处于运行状态.我们可以使用systemctl status/start/stop/restart fire ...