本节主要内容:

1.lambda匿名函数

2.sorted()

3.filter()

4.map()

5.递归函数

6.二分法

一.lambda匿名函数

为了解决一些简单的需求而设计的一句话函数

  1. # 计算n的n次方
  2. def func(n):
  3. return n**n
  4. print(func(10))
  5.  
  6. f = lambda n: n**n
  7. print(f(10))

lambda表示的是匿名函数.不需要用def来声明,一句话就可以声明出一个函数

语法:

函数名 = lambda 参数 : 返回值

注意:

1.函数的参数可以有多个.多个参数之间用逗号隔开

2.匿名函数不管多复杂.只能写一行,且逻辑结束后直接返回数据

3.返回值和正常函数一样,可以是任意数据类型

匿名函数并不是说一定没有名字.这里前面的变量就是一个函数名.说它是匿名的原因是我们通过__name__

查看的时候是没有名字的,统一叫lambda.在调用的时候没有什么特别之处.像正常的函数调用即可.

二.sorted()

排序函数

语法:sorted(Iterable,key=None,reverse = False)

Iterable:可迭代对象

key:排序规则(排序函数),在sorted内部会将可迭代对象中的每个元素传递给这个函数的参数.根据函数运算的结果进行排序.

reverse:是否倒叙.Ture:倒叙,False:正序

  1. lst = [1, 5, 3, 4, 6]
  2. lst2 = sorted(lst)
  3. print(lst) # 原列表不会改变
  4. print(lst2) # 返回的新列表是经过排序的
  5.  
  6. dic = {1: "A", 3: "C", 2: "B"}
  7. print(sorted(dic)) # 如果是字典,则返回排序过后的key

和函数组合使用

  1. # 根据字符串长度进行排序
  2. lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]
  3.  
  4. # 计算字符串长度
  5. def func(s):
  6. return len(s)
  7.  
  8. print(sorted(lst, key=func))

和lambda组合使用

  1. lst=[{'id':3,'name':'taihei','age':18},
  2. {'id':1,'name':'alex','age':28},
  3. {'id':2,'name':'taibai','age':58},
  4.  
  5. {'id':4,'name':'henhei','age':38}]
  6.  
  7. # 根据年龄排序
  8. def func(s):
  9. return s['age']
  10.  
  11. print(sorted(lst, key=lambda dic:dic["age"]))

三.filter()

筛选函数

语法: filter(function,Iterable)

function: 用来筛选的函数.在filter中会自动的把iterable中的元素传递给function.然后根据function返回的Ture或者False来判断是否保留此项数据

Iterable:可迭代对象

  1. lst = ["渴望", "年轮", "家有儿女", "蜗居", "49天", "浪漫满屋"]
  2.  
  3. # 把后面的可迭代对象中的每一个元素交给前面的函数。 根据函数返回的True或者False。 判断是否保留该元素
  4. f = filter(lambda s: len(s) > 2, lst)
  5. print("__iter__" in dir(f))
  6. for el in f:
  7. print(el)
  8.  
  9. lst=[{'id':3,'name':'taihei','age':18},
  10. {'id':1,'name':'alex','age':28},
  11. {'id':2,'name':'taibai','age':58},
  12. {'id':4,'name':'henhei','age':38}]
  13.  
  14. # 筛选年龄大于等于38的人
  15. print(list(filter(lambda ren: ren['age']>=38, lst)))

四.map()

映射函数

语法:map(function,Iterable)可以对可迭代对象的每一个元素进行映射.分别取执行function

  1. lst = [2, 3, 4,5, 6, 7, 1]
  2. # 计算列表中的每一项的平方
  3.  
  4. # 映射
  5. # 把可迭代对象中的每一个元素拿出来交给前面的函数执行. 保留最后的执行结果
  6. m = map(lambda x: x*x, lst)
  7. for el in m:
  8. print(el)
  9.  
  10. # 给出一个列表
  11. lst = ["alex_123", "alex_456", "wusir_123", "wusir_456", "alex_789"]
  12. #
  13. # 正确的用户名: alex
  14. # 密码:456
  15. # alex_456
  16. print(list(map(lambda s : " yes" if s=="alex_456" else "false" , lst)))
  17.  
  18. print(list(map(lambda s: s.split("_")[0] == 'alex' and s.split("_")[1] == "",lst)))

五.递归

在函数中调用函数本身,就是递归

  1. def func():
  2. print("我是谁")
  3. func()
  4. func()

在python中递归的深度最大是1000,但是到不了1000,一般是998

  1. def foo(n):
  2. print(n)
  3. n += 1
  4. foo(n)
  5. foo(1)

递归的应用:

我们可以使用递归来遍历各种树形结构,比如我们的文件夹系统.可以使用递归来遍历该文件夹中的所有文件

  1. import os
  2.  
  3. def read(filepath,n):
  4. files = os.listdir(filepath) # 获取到当前文件夹中的所有文件
  5. for fi in files: # 遍历文件夹中的文件,这里获取的只是本层文件名
  6. fi_d = os.path.join(filepath,fi) # 加入文件夹 获取文件夹+文件
  7. if os.path.isdir(fi_d): #如果该路径下的文件是文件夹
  8. print("\t"*n,fi)
  9. read(fi_d,n+1) #继续进行相同的操作
  10. else:
  11. print("\t"*n,fi) #递归出口.最终在这里隐含着return
  12.  
  13. # 递归遍历目录文件下的所有文件
  14. read("d:/python课件及作业",0)

六.二分查找

二分查找,每次能够排除掉一半的数据.查找的效率非常高.但是局限性比较大.必须是有序序列才可以使用二分查找

要求:查找的序列必须是有序序列.

  1. # 判断n是否在lst中出现.
  2. # 二分查找---非递归算法
  3. lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
  4. n = int(input("请输入一个数字:"))
  5. left = 0
  6. right = len(lst)-1
  7. while left <= right :
  8. mid = (left + right) // 2
  9. if n < lst[mid] :
  10. right = mid - 1
  11. elif n > lst[mid] :
  12. left = mid + 1
  13. else :
  14. print("找到了")
  15. break
  16. else:
  17. print("没找到")
  1. # 普通递归版二分法:
  2. def binary_search(lst,n,left,right):
  3. if left <= right:
  4. mid = (left+right)//2
  5. if n < lst[mid]:
  6. right = mid - 1
  7. elif n > lst[mid]:
  8. left = mid + 1
  9. else:
  10. return mid
  11. return binary_search(lst,n,left,right) # 这个return必须要加.否则接收到的永远是None
  12. else:
  13. return -1
  14.  
  15. lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
  16. n = int(input("请输入一个数字:"))
  17. left = 0
  18. right = len(lst)-1
  19. print(binary_search(lst,n,left,right))
  1. # 另类二分法,很难计算位置.
  2. def binary_search(lst,n):
  3. left = 0
  4. right = len(lst) - 1
  5. if left > right:
  6. print("不在这里")
  7. return False
  8. mid = (left+right) // 2
  9. if n < lst[mid]:
  10. return binary_search(lst[:mid],n)
  11. elif n > lst[mid]:
  12. return binary_search(lst[mid+1:], n)
  13. else:
  14. print("在这里")
  15. return True
  16.  
  17. lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
  18. n = int(input("请输入一个数字:"))
  19. print(binary_search(lst,n))

python学习 day014打卡 内置函数二&递归函数的更多相关文章

  1. python学习 day013打卡 内置函数

    本节主要内容: 内置函数: 内置函数就是python给你提供的.拿来直接用的函数,比如print,input等等.截止到python版本3.6.2 python一共提供了68个内置函数.他们就是pyt ...

  2. Python学习(八) —— 内置函数和匿名函数

    一.递归函数 定义:在一个函数里调用这个函数本身 递归的最大深度:997 def func(n): print(n) n += 1 func(n) func(1) 测试递归最大深度 import sy ...

  3. python学习之路-4 内置函数和装饰器

    本篇涉及内容 内置函数 装饰器 内置函数 callable()   判断对象是否可以被调用,返回一个布尔值 1 2 3 4 5 6 7 8 9 10 11 num = 10 print(callabl ...

  4. Python学习笔记——常用的内置函数

    一.yield def EricReadlines(): seek = 0 while True: with open('D:/temp.txt','r') as f: f.seek(seek) da ...

  5. python学习三十八天常用内置函数分类汇总

    python给我们提供丰富的内置函数,不用去写函数体,直接调用就可以运行,很方便快速给我提供开发所需要的函数. 1,查内存地址 id() 变量的内存地址 id() 2,输入输出 input()  pr ...

  6. Python内置函数二 (递归函数,匿名函数,二分法)

    匿名函数 lambda() 语法: lambad  参数 : 返回值 def func(a,b): return a * b print(func(2,5)) a = lambda a ,b : a* ...

  7. python学习笔记六:内置函数

    一.数学相关 1.绝对值:abs(-1) 2.最大最小值:max([1,2,3]).min([1,2,3]) 3.序列长度:len('abc').len([1,2,3]).len((1,2,3)) 4 ...

  8. 【python】dir(__builtins__)查看python中所用BIF(内置函数)

    dir(__builtins__)查看python中所用BIF(内置函数)

  9. 查看python内部模块命令,内置函数,查看python已经安装的模块命令

    查看python内部模块命令,内置函数,查看python已经安装的模块命令 可以用dir(modules) 或者用 pip list或者用 help('modules') 或者用 python -m  ...

随机推荐

  1. 网站图标 favicon.ico

    默认情况下,浏览器访问一个网站的时候,同时还会向服务器请求“/favicon.ico”这个URL,目的是获取网站的图标. 若没有配置的话,Django就会返回一个404错误,并且浏览器接收到这个404 ...

  2. 转:C#清除回收站

    SHEmptyRecycleBin是一个内核API方法,该方法能够清空回收站中的文件,该方法在C#中需要手动的引入方法所在的类库.该方法在C#中的声明语法如下: [DllImportAttrbute( ...

  3. FTP搭建 共享上网 穿透内网外网

    1.ftp原理介绍 FTP只通过TCP连接,没有用于FTP的UDP组件.FTP不同于其他服务的是它使用了两个端口, 一个数据端口和一个命令端口(或称为控制端口).通常21端口是命令端口,20端口是数据 ...

  4. 专题8:javascript函数详解

    函数是一段可以反复调用的代码块.函数还能接受输入的参数,不同的参数会返回不同的值. 函数的声明 JavaScript 有三种声明函数的方法. (1)function 命令 function命令声明的代 ...

  5. Zabbix客户端(被监控端)安装配置

    1) 创建用户 groupadd zabbix useradd -g zabbix zabbix 2)zabbix软件包下载,安装 zabbix-2.2.6 http://jaist.dl.sourc ...

  6. getElementsByClassName方法的封装

    Element.prototype.getElementsByClassName = function(searchClass,node,tag){ if(document.getElementsBy ...

  7. html介绍和head标签

      一.web标准 web准备介绍: w3c:万维网联盟组织,用来制定web标准的机构(组织) web标准:制作网页遵循的规范 web准备规范的分类:结构标准.表现标准.行为标准. 结构:html.表 ...

  8. deepin安装Python3.6和pip

    1.安装python3.6 sudo apt-get install python3.6 2.修改软连接 sudo ln -s /usr/local/bin/python3.6 /usr/bin/py ...

  9. P4381 [IOI2008]Island(基环树+单调队列优化dp)

    P4381 [IOI2008]Island 题意:求图中所有基环树的直径和 我们对每棵基环树分别计算答案. 首先我们先bfs找环(dfs易爆栈) 蓝后我们处理直径 直径不在环上,就在环上某点的子树上 ...

  10. fjwc2019 D1T1 全连(dp+树状数组)

    #178. 「2019冬令营提高组」全连 显然我们可以得出一个$O(n^2)$的dp方程 记$f(i)$为取到第$i$个音符时的最大分数,枚举下一个音符的位置$j$进行转移. 蓝后我们就可以用树状数组 ...