一、函数的递归

  1. '''
  2. 1 什么是函数递归
  3. 函数递归调用(是一种特殊的嵌套调用):在调用一个函数的过程中,又直接或间接地调用了该函数本身
  4.  
  5. 递归必须要有两个明确的阶段:
  6. 递推:一层一层递归调用下去,强调每进入下一层递归问题的规模都必须有所减少
  7. 回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推(明确的结束条件即递归出口)
  8. 开始一层一层回溯
  9.  
  10. 递归的精髓在于通过不断地重复逼近一个最终的结果
  11. 递归(Recursion),在数学与计算科学中,是指在函数定义中使用函数自身的方法
  12. 2、为什么要用函数递归
  13.  
  14. 3、如何用
  15. '''
  16.  
  17. # 递归的优缺点:
  18. # 优点:
  19. # 递归是代码看起来更加整洁、优雅
  20. # 可以用递归将复杂任务分解成简单的子问题
  21. # 使用递归比使用一些嵌套迭代更容易
  22. #
  23. # 缺点:
  24. # 递归的逻辑很难调试、跟进
  25. # 递归调用的代价高昂(效率低),因为占用了大量的内存和时间
  26.  
  27. # import sys
  28. # print(sys.getrecursionlimit()) #可以限制递归的次数,防止无限递归,过多的占用内存
  29. # # sys.setrecursionlimit(3000) #可以设置递归的次数
  30. # def foo(n):
  31. # print('from foo',n)
  32. # foo(n+1) #直接有调用了函数自己本身
  33. # foo(0)
  34.  
  35. # 递归间接的调用它本身
  36. # def bar():
  37. # print('from bar')
  38. # foo()
  39. #
  40. # def foo():
  41. # print('from foo')
  42. # bar()
  43. # foo()
  44.  
  45. # 递归的应用:
  46. # 知道第一个人的年龄,计算第五个人的年龄
  47. # age(5) = age(4) + 2 #递归一层一层的进行下去,递归的问题规模都在减少
  48. # age(4) = age(3) + 2
  49. # age(3) = age(2) + 2
  50. # age(2) = age(1) + 2
  51. # age(1) = 26 #递归必须要有一个明确的结束条件
  52.  
  53. # age(n) = age(n-1) + 2 #n > 1
  54. # age(1) = 26 #n = 1
  55.  
  56. # def age(n):
  57. # if n == 1:
  58. # return 26 #递归有一个明确的结束条件
  59. # return age(n-1) + 2 #一层一层的递推下去,问题的规模不断的缩小
  60. #
  61. # print(age(5))
  62.  
  63. # 取出嵌套列表中的每一个元素
  64. # 递归的循环:
  65. # l=[1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]
  66. # def tell(l):
  67. # for item in l:
  68. # if type(item) is list:
  69. # #继续进入下一层递归
  70. # tell(item)
  71. # else:
  72. # print(item)
  73. # tell(l)
  74.  
  75. # 有一个从小到大排列的整型数字列表
  76. # nums=[1,3,7,11,22,34,55,78,111,115,137,149,246,371]
  77. # # 10 in nums
  78. # for item in nums:
  79. # if item == 10: #使用for循环要将其中的每一个循环一遍可能才能找到我们想要找的值
  80. # print('find it')
  81. # break
  82. # else:
  83. # print('not exists')
  84.  
  85. # 二分法:
  86. #使用二分法可以快速找到我们要找的值
  87. # nums=[1,3,7,11,22,34,55,78,111,115,137,149,246,371]
  88. # def search(search_num,nums): #传入要查找的数字,和要比较的原列表
  89. # print(nums)
  90. # if len(nums) == 0: #经过二分法后得到的列表,列表长度为0,说明进行最后一个二分法也没有匹配成功,说明要查找的数字不在列表中
  91. # print('not exists')
  92. # return #直接结束函数的运行
  93. # mid_index=len(nums) // 2 #拿到列表的长度进行二分法取整 5----比较----[1,2,3,4,5,6]------第一次索引3-----切片[4:]----->[5,6]
  94. # if search_num > nums[mid_index]: #拿要查询的数字与二分法得到的索引对应列表中的值进行比较大小,
  95. # # in the right
  96. # nums=nums[mid_index+1:] #此时筛选掉列表中一半的值,使用切片拿到筛选到的结果
  97. # search(search_num,nums) #使用递归的方法,传入要查询的值,和新得到的列表,进一步进行判断
  98. # elif search_num < nums[mid_index]: #查询的数小于二分法中得到的中间值,则使用切片拿到左半边的列表的所有值
  99. # # in the left
  100. # nums=nums[:mid_index]
  101. # search(search_num,nums) #重复递归,直到切出我们要查询的值
  102. # else:
  103. # print('find it') #要查询的值既不大于也不小于二分法得到得值,切分的结果也不为空列表,说明要查询的数字肯定在列表中,即找到要查询的值
  104. # search(31,nums)
  105.  
  106. # nums=[i for i in range(101)]
  107. # # print(nums)
  108. # def tell(search_num,nums):
  109. # if len(nums)==0:
  110. # print('要查找的数字不在列表中')
  111. # return
  112. # mid_index=len(nums)//2
  113. # if search_num>nums[mid_index]:
  114. # nums=nums[mid_index+1:]
  115. # tell(search_num,nums)
  116. # elif search_num<nums[mid_index]:
  117. # nums=nums[:mid_index]
  118. # tell(search_num,nums)
  119. # else:
  120. # print('find it')
  121. # tell(35,nums)

二、匿名函数

  1. # 有名函数:基于函数名重复使用
  2. # def func():
  3. # print('from func')
  4. #
  5. # func() #有名函数可以被重复的调用
  6. # func()
  7. # func()
  8.  
  9. # 匿名函数:没有绑定名字的下场是用一次就回收了
  10. # def func(x,y): #func=函数的内存地址
  11. # return x + y
  12. # print((lambda x,y:x+y)) #<function <lambda> at 0x0000015F53212BF8>对应一个函数的内存地址,所以加括号就可以调用
  13. # res=(lambda x,y:x+y)(1,2) #冒号左边是参数,右边是匿名函数的返回值
  14. # print(res) #返回值为:3
  15.  
  16. # f=lambda x,y:x+y #匿名函数又赋值给了一个变量,通常匿名函数都是结合其他内置函数使用的,且只使用一次
  17. # print(f)
  18. # print(f(1,2))
  19.  
  20. # 匿名函数与下面的内置函数结合的应用
  21. #max min map filter sorted
  22. salaries={
  23. 'egon':3000,
  24. 'alex':100000000,
  25. 'wupeiqi':10000,
  26. 'yuanhao':2000
  27. }
  28.  
  29. # max的工作原理
  30. #1 首先将可迭代对象变成迭代器对象
  31. #2 res=next(可迭代器对象),将res当作参数传给key指定的函数,然后将该函数的返回值当作判断依据
  32. def func(k):
  33. return salaries[k] #比较的依据即执行函数体代码,拿到的返回值
  34. print(max(salaries,key=func)) #next(iter_s),max取出来的值永远不会变,key改变比较依据,最终拿到的还是max进行next的结果
  35. #可以将上式转换成匿名函数的形式,即max结合匿名函数的应用
  36. # 'egon', v1=func('egon')
  37. # 'alex', v2=func('alex')
  38. # 'wupeiqi', v3=func('wupeiqi')
  39. # 'yuanhao', v4=func('yuanhao')
  40.  
  41. # max+lambda 的应用
  42. # min+lambda 的应用
  43. salaries={
  44. 'egon':3000,
  45. 'alex':100000000,
  46. 'wupeiqi':10000,
  47. 'yuanhao':2000
  48. }
  49. print(max(salaries,key=lambda k:salaries[k])) #next(iter_s)max内有两个参数,左变是要比较的迭代的对象,右边是key=一个函数
  50. print(min(salaries,key=lambda k:salaries[k])) #next(iter_s)
  51.  
  52. # l=[10,1,3,-9,22]
  53. # l1=sorted(l,reverse=False) #sorted默认是按照从左到右,从小到大的顺序进行排列的,reverse默认为Flase
  54. # print(l1)
  55.  
  56. # l2=sorted(l,reverse=True) #reverse=True时,排列顺序则变为从大到小的顺序进行排列
  57. # print(l2)
  58.  
  59. # sorted+lambda应用
  60. # 将字典中所有人名按照薪资,从大到小的顺序进行排列
  61. salaries={
  62. 'egon':3000,
  63. 'alex':100000000,
  64. 'wupeiqi':10000,
  65. 'yuanhao':2000
  66. }
  67. #排列对象可迭代对象,比较方式:通过value进行比较,排列顺序:按照从大到小的顺序
  68. print(sorted(salaries,key=lambda k:salaries[k],reverse=True))
  69.  
  70. names=['张明言','刘华强','苍井空','alex']
  71. # map的工作原理
  72. #1 首先将可迭代对象变成迭代器对象
  73. #2 res=next(可迭代器对象),将res当作参数传给第一个参数指定的函数,然后将该函数的返回值当作map的结果之一
  74.  
  75. # map+lambda 的应用
  76. aaa=map(lambda x:x+"_SB",names) #map跟两个参数,左边是一个函数,右边是一个可迭代对象,
  77. print(aaa) #<map object at 0x000001FDB7D39A90>是一个迭代器,使用list就可以迭代取出其中的值
  78. print(list(aaa)) #['张明言_SB', '刘华强_SB', '苍井空_SB', 'alex_SB']
  79.  
  80. print([name+"_SB" for name in names]) #['张明言_SB', '刘华强_SB', '苍井空_SB', 'alex_SB']------列表生成式的应用
  81.  
  82. # filter的工作原理
  83. #1 首先将可迭代对象变成迭代器对象
  84. #2 res=next(可迭代器对象),将res当作参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下res
  85. names=['alexSB','egon','wxxSB','OLDBOYSB']
  86. # print([name for name in names if name.endswith('SB')])
  87.  
  88. # filter+lambda 的应用
  89. aaa=filter(lambda x:x.endswith('SB'),names) #filter左边跟一个函数,右边跟一个可迭代对象
  90. print(aaa) #<filter object at 0x00000157DB717A20>---filter产生的也是一个迭代器,通过list也可以迭代取出其中的值
  91. print(list(aaa)) #['alexSB', 'wxxSB', 'OLDBOYSB']

三、内置函数

  1. # 掌握
  2. # res='你好'.encode('utf-8') #encode编码成bytes格式
  3. # print(res) #b'\xe4\xbd\xa0\xe5\xa5\xbd'
  4. #
  5. # res=bytes('你好',encoding='utf-8')
  6. # print(res) #b'\xe4\xbd\xa0\xe5\xa5\xbd'
  7.  
  8. # 参考ASCII表将数字转成对应的字符
  9. # print(chr(65))
  10. # print(chr(90))
  11. # 参考ASCII表将字符转成对应的数字
  12. # print(ord('A'))
  13. #
  14.  
  15. #3是11//3取整,2是11%3取余
  16. # print(divmod(11,3)) #(3, 2)---可以用再页面的显示页数,如淘宝购物页面信息,有1001条信息,一页最多显示100条,则此时需要11页才能将所有的信息显示完
  17.  
  18. # l=['a','b','c']
  19. # for item in enumerate(l): #enumerate经for循环,取出可迭代对象的索引与其对应的值
  20. # print(item)
  21.  
  22. # l='[1,2,3]'
  23. # l1=eval(l) #eval将字符串中的列表取出来,从而可以对其进行取值
  24. # print(l1,type(l1))
  25. # print(l1[0])
  26.  
  27. # eval的应用---------------------可以将字符串转换为列表、字典、元组
  1. s1="['egon',18,'male']"
    s2="{'name':'egon','age':18,'sex':'male'}"
    s3="('egon',18,'male')"
    print(eval(s1))
    print(eval(s2))
    print(eval(s3))
    print(type(eval(s1)))
    print(type(eval(s2)))
    print(type(eval(s3)))
  1. # with open('a.txt',encoding='utf-8') as f:
  2. # data=f.read()
  3. # print(data,type(data))
  4. # dic=eval(data) #将从文件中取出的字符串中的表达式,通过eval转换成字典
  5. # print(dic['sex'])
  6.  
  7. # print(pow(3,2,2)) # (3 ** 2) % 2 #1--------pow中三个参数,即3的2次方除2取余
  8.  
  9. # print(round(3.3)) #round四舍五入
  10.  
  11. # print(sum(range(101))) #求和------1到100的和
  12.  
  13. # module=input('请输入你要导入的模块名>>: ').strip() #module='asdfsadf'
  14. # m=__import__(module) #引入模块的名字
  15. # print(m.time())
  16.  
  17. # 面向对象里的重点
  18. classmethod
  19. staticmethod
  20. property
  21.  
  22. delattr
  23. hasattr
  24. getattr
  25. setattr
  26.  
  27. isinstance
  28. issubclass
  29.  
  30. object
  31.  
  32. super
  33.  
  34. # 了解
  35. # print(abs(-13)) #取一个数的绝对值
  36. # print(all([1,2,3,'d'])) #列表中的数的bool值均为True时,结果才为True
  37. # print(all([])) #all规定空列表的bool值为True
  38.  
  39. # print(any([0,None,'',1])) #any 只要列表中的bool值有一个为True,整体的bool值就为True
  40. # print(any([0,None,'',0])) #any 列表中的所有bool值为False,整体的bool值就才为False
  41. # print(any([])) #any规定空列表的bool值为False
  42.  
  43. # print(bin(3)) #11 #将十进制转换为二进制
  44. # print(oct(9)) #11 #将十进制转换为八进制
  45. # print(hex(17)) #11 #将十进制转换为十六进制
  46.  
  47. # print(callable(len)) #检测对象是否可以被调用,可被调用指的是对象能否被()括号的方法
  48.  
  49. # import time
  50. # print(dir(time)) #列举出所有:time.名字 #dir以列表的形式,列出time下的所用的方法
  51.  
  52. # s=frozenset({1,2,3}) # 不可变集合,frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法。
  53. # s1=set({1,2,3}) # 可变集合,有add(),remove()等方法。既然是可变的,所以它不存在哈希值
  54.  
  55. a=1111111111111111111111111111111111111111111111
  56. # print(globals())
  57. # print(locals()) #此时站在全局和局部均有a值
  58. # def func():
  59. # x=222222222
  60. # print(globals()) #此时的全局仍然有'a': 1111111111111111111111111111111111111111111111, 'func': <function func at 0x0000015990572BF8>
  61. # print(locals()) #此时站在局部只有{'x': 222222222}
  62. # func()
  63.  
  64. # hash([1,2,3]) #可变类型不可hash
  65. # hash(123) #不可变类型可以hash
  66. #
  67. # def func():
  68. # """
  69. # 文档注释
  70. # :return:
  71. # """
  72. # pass
  73. #
  74. # print(help(func)) #help可以查看定义函数内的文档注释,
  75.  
  76. # print(help(len))
  77. # print(help(max))
  78.  
  79. l=['a','b','c','d','e']
  80. # s=slice(1,4,2) #先拿到列表切片的范围
  81. # print(l[s]) #直接通过列表范围对列表进行切分
  82. # 等价于:
  83. # print(l[1:4:2]) #列表中去切片
  84.  
  85. # print(vars()) #表示方差,用在算法中的numpy中

Python之函数的递归、匿名函数、内置函数的更多相关文章

  1. day3 函数、递归、及内置函数

    请查看我的云笔记链接: http://note.youdao.com/noteshare?id=7d5aa803981ae4375a1f648f48e7ade3&sub=5DFD553A6C5 ...

  2. python基础12_匿名_内置函数

    一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, ...

  3. 学习Python函数笔记之二(内置函数)

    ---恢复内容开始--- 1.内置函数:取绝对值函数abs() 2.内置函数:取最大值max(),取最小值min() 3.内置函数:len()是获取序列的长度 4.内置函数:divmod(x,y),返 ...

  4. Python函数04/生成器/推导式/内置函数

    Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...

  5. Python——day14 三目运算、推导式、递归、匿名、内置函数

    一.三目(元)运算符 定义:就是 if...else...语法糖前提:简化if...else...结构,且两个分支有且只有一条语句注:三元运算符的结果不一定要与条件直接性关系​ cmd = input ...

  6. python基础之递归,匿名,内置函数

    递归函数: 什么是递归函数? 函数递归调用:在调用一个函数的过程中,又直接或间接地调用了该函数本身. 递归必须要有两个明确的阶段: ①递推:一层一层递归调用下去,强调:每进入下一层问题规模减少 ②回溯 ...

  7. Python全栈开发之4、内置函数、文件操作和递归

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5476760.html 一.内置函数 Python的内置函数有许多,下面的这张图全部列举出来了,然后我会把一些常用的拿 ...

  8. python学习笔记:第14天 内置函数补充和递归

    一.匿名函数 匿名函数主要是为了解决一些简单需求而设计的一种函数,匿名函数的语法为: lambda 形参: 返回值 先来看一个例子: # 计算n的n次方 In[2]: lst = lambda n: ...

  9. python函数(6):内置函数和匿名函数

    我们学了这么多关于函数的知识基本都是自己定义自己使用,那么我们之前用的一些函数并不是我们自己定义的比如说print(),len(),type()等等,它们是哪来的呢? 一.内置函数 由python内部 ...

  10. 巨蟒python全栈开发-第13天 内置函数 匿名函数lambda

    一.今日内容总览 1.内置函数(1):并不是每一个内置函数都是那么常用 上菜:内置函数部分//思维导图:https://www.processon.com/view/link/5b4ee15be4b0 ...

随机推荐

  1. SparkSql实现Mysql到hive的数据流动

    今天去面试了一波,因为调度系统采用了SparkSql实现数据从Mysql到hive,在这一点上面试官很明显很不满我对于Spark的理解,19年的第一个面试就这么挂了. 有问题不怕,怕的是知道了问题还得 ...

  2. JS代码高亮编辑器 ace.js

    JS代码高亮编辑器 ace.js 字数254 阅读2 评论0 喜欢0 瞎扯 ace 是 js 实现的代码编辑器 编译打包之后的 ACE 代码 官网,未提供编译好的文件 ACE 拥有的特点 语法高亮超过 ...

  3. Python基础.md

    数据结构 列表 访问 list1 = ['java','C','C++','Python'] In [10]: list1[1] Out[10]: 'C' In [11]: list1[-1] Out ...

  4. MySQL半同步主从.md

    MySQL Semisynchronous Replication 复制架构衍生史 1.普通的replication,异步同步. 搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非 ...

  5. extjs_05_grid(表格分组)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  6. django操作多数据库

    django操作多数据库 1.    添加数据库路由分配文件 在项目文件夹里创建‘database_router’文件.将下面的代码复制到该文件里. from django.conf import s ...

  7. Windows下基于Python3安装Ipython Notebook(即Jupyter)。python –m pip install XXX

    1.安装Python3.x,注意修改环境变量path(追加上python安装目录,如:D:\Program Files\Python\Python36-32) 2.查看当前安装的第三方包:python ...

  8. 详解 MNIST 数据集

    转自:https://blog.csdn.net/simple_the_best/article/details/75267863 MNIST 数据集已经是一个被”嚼烂”了的数据集, 很多教程都会对它 ...

  9. CentOS中用Nexus搭建maven私服,为Hadoop编译提供本地镜像

    系统: CentOS release 6.6 (Final) Nexus:nexus-2.8.1-bundle.tar.gz,下载地址:https://sonatype-download.global ...

  10. 最近邻规则分类(k-Nearest Neighbor )机器学习算法python实现

    综述 Cover和Hart在1968年提出了最初的近邻算法 是分类(classification)算法 输入基于实例的学习(instance-based learning),惰性学习(lazy lea ...