一、匿名函数

匿名函数主要是为了解决一些简单需求而设计的一种函数,匿名函数的语法为:

lambda 形参: 返回值

先来看一个例子:

# 计算n的n次方
In[2]: lst = lambda n: n ** n # 这里的lst就是一个匿名函数
In[3]: print(lst(3))
27

使用匿名函数需要注意的几点:

  • 函数的参数可以有多个,多个参数之间⽤逗号隔开
  • 匿名函数不管多复杂. 只能写⼀⾏, 且逻辑结束后直接返回数据
  • 返回值和正常的函数⼀样, 可以是任意数据类型

二、内置函数补充

sorted

sorted是python内置的一个用于排序的函数,它接收三个参数,语法为;

sorted(Iterable, key=None, reverse=False)
  • Iterable: 接收一个可迭代对象,sorted内部会去循环可迭代对象取出元素
  • key: 排序规则(排序函数),sorted将每次从可迭代对象中取出的数据会传递给这个排序函数的参数,根据函数运算的结果进行排序
  • reverse: 控住是否倒叙,True为倒叙,默认为False正序
# 根据字符串⻓度进⾏排序
In[7]: lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]
In[8]: lst2 = sorted(lst, key=lambda s: len(s))
In[9]: print(lst2)
['狐仙', '麻花藤', '冈本次郎', '中央情报局']

sorted如果不传作排序用的函数,那么它默认是按照在字符编码中的顺序来排的:

In[10]: lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]
In[11]: lst2 = sorted(lst)
In[12]: lst2
Out[12]: ['中央情报局', '冈本次郎', '狐仙', '麻花藤']
In[14]: print(ord('中'))
20013
In[15]: print(ord('冈'))
20872
In[16]: print(ord('狐'))
29392
In[17]: print(ord('麻'))
40635

filter

filter是python中内置的一个过滤的函数,其用法跟sorted差不多:

filter(function, iterable)
  • function: ⽤来筛选的函数. 在filter中会⾃动的把iterable中的元素传递给function. 然后

    根据function返回的True或者False来判断是否保留此项数据
  • iterable: 可迭代对象
In[21]: lst = [{'id':1,'name':'alex','age':28},
...: {'id':2,'name':'taibai','age':58},
...: {'id':3,'name':'taihei','age':18},
...: {'id':4,'name':'henhei','age':38}] In[22]: ret2 = filter(lambda x: x['age'] >= 38, lst)
...: [print(x) for x in ret2]
{'id': 2, 'name': 'taibai', 'age': 58} # 从结果来看,年龄小于38的都被过滤掉了
{'id': 4, 'name': 'henhei', 'age': 38} Out[22]: [None, None]

map

映射函数map,使用语法为:

map(function, iterable)

可以对可迭代对象中的每⼀个元素进⾏映射. 分别取执⾏function(其语法和sorted、filter相似)

In[23]: names=['oldboy','alex','wusir']

In[24]: m = map(lambda s: s + '123', names)           # 在每个字符串后加上123

In[25]: print(list(m))                                # map返回的也是一个可迭代对象,使用list会去循环遍历元素
['oldboy123', 'alex123', 'wusir123']

三、递归

在函数中调⽤函数本⾝. 就是递归

def func():
print("我是谁")
func() func()

在python中最大递归深度为1000:

In[26]: import sys

In[27]: sys.getrecursionlimit()           # 虽然我们查询到的结果是1000,但是实际上却跑不到1000,通常是998或者997
Out[27]: 1000

递归的应用:计算斐波那契数列 f(0) = 1 f(1) = 1 f(n) = f(n-1) + f(n-2)

In[35]: def fib(n):
...: if n == 0:
...: return 1
...: if n == 1:
...: return 1
...: return fib(n-1) + fib(n-2)
...: In[36]: fib(5)
Out[36]: 8 In[37]: fib(10)
Out[37]: 89

总结:

  • 递归函数总是涉及到压栈和出栈的过程
  • 递归函数总是压栈,知道遇到退出条件,然后出栈
  • Python中递归函数有深度限制,可以通过sys.getrecursionlimit()得到深度限制,可以通过sys.setrecursionlimit调整递归深度限制
  • 递归函数在Python非常慢,并且有深度限制,所以 因尽量避免使用递归

四、二分法查找

⼆分查找. 每次能够排除掉⼀半的数据. 查找的效率非常⾼. 但是局限性比较⼤. 必须是有

序序列才可以使⽤⼆分查找

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

(1) 使用基本的算法实现:

lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]

n = int(input("请输入一个数字n:"))      # 56

left = 0                              # 左边界
right = len(lst) - 1 # 末尾的索引 右边界
while left <= right: # 当左边界大于右边界结束循环 mid = (left + right) // 2 # 求中间的索引坐标
if n < lst[mid]: # 判断你的数字和中间数的大小比较 .
right = mid - 1 # 右边界往左移动 elif n > lst[mid]:
left = mid + 1 # 左边界往右移动 else:
print("找到了") # 找到了目标数字
break
else: # 当左比右大, 循环结束. 没有找到目标数
print("没找到")

(2)使用递归实现:

lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]

def binary_search(lst, n, left, right):
if left > right:
return False
mid = (left + right) // 2
if n > lst[mid]:
left = mid + 1
# 当递归有返回值的时候. 需要写return. 否则有可能接收不到返回值
return binary_search(lst, n, left, right)
elif n < lst[mid]:
right = mid - 1
return binary_search(lst, n, left, right)
else:
print("找到了")
return True n = int(input("请输入一个数字n:")) # 178
ret = binary_search(lst, n, 0, len(lst)-1)
print(ret) # 结果:
# 请输入一个数字n:178
# 找到了
# True

切记:当递归有返回值的时候. 需要写return. 否则有可能接收不到返回值

(3)对列表切片:

def binary_search(lst, n):
if len(lst) == 0:
return False
left = 0
right = len(lst) - 1
mid = (left + right) // 2
if n > lst[mid]:
left = mid + 1
# 当递归有返回值的时候. 需要写return. 否则有可能接收不到返回值
return binary_search(lst[mid+1:], n)
elif n < lst[mid]:
right = mid - 1
return binary_search(lst[:mid], n)
else:
print("找到了")
return True

python学习笔记:第14天 内置函数补充和递归的更多相关文章

  1. python学习笔记(七)——内置函数

    builtins.py模块,是python的内建模块,在运行时会自动导入该模块.在该模块中定义了很多我们常用的内置函数,比如print,input 等. 在 builtins.py 模块中给出如下注释 ...

  2. python学习笔记(五)— 内置函数

    我们常用的‘’int,str,dict,input,print,type,len‘’都属于内置函数 print(all([1,2,3,4]))#判断可迭代的对象里面的值是否都为真 print(any( ...

  3. python学习笔记(四):生成器、内置函数、json

    一.生成器 生成器是什么?其实和list差不多,只不过list生成的时候数据已经在内存里面了,而生成器中生成的数据是当被调用时才生成呢,这样就节省了内存空间. 1. 列表生成式,在第二篇博客里面我写了 ...

  4. python学习笔记(九)内置函数

    print(all([1,2,3,4]))#判断可迭代的对象里面的值是否都为真 True print(any([0,1,2,3,4]))#判断可迭代的对象里面的值是否有一个为真 True print( ...

  5. Python学习日记(六)——内置函数和文件操作(lambda)

    lambda表达式 学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: # 普通条件语句 if 1 == 1: name = 'prime' else: name = 'c ...

  6. python 内置函数补充 or 递归 or 二分法

    一.内置函数的补充 repr() 显示出字符串的官方表示形式 chr() print(chr(20013)) # 把数字编码转换成字符串 ord() print(ord('中')) # 20013 把 ...

  7. 巨蟒python全栈开发-第14天 内置函数2 递归 二分查找

    一.今日内容总览 1.内置函数补充 repr() 显示出字符串的官方表示形式 chr() arscii码中的字,转换成位置 ord() arscii码中的位置,转换成字2.递归 自己调用自己 两个口: ...

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

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

  9. Python之路----内置函数补充与匿名函数

    内置函数补充:reversed()保留原列表,返回一个反向的迭代器 l = [1,2,3,4,5] l.reverse() print(l) l = [1,2,3,4,5] l2 = reversed ...

随机推荐

  1. 用CSS写扫描二维码图标

    代码如下: <style>.icon{margin:300px;width:30px;height:30px;position:relative}.icon .b{border:2px s ...

  2. 玩转Windows/Linux tftp命令

    tftp很好理解, 主要用来传文件, 下面以我的操作来谈谈tftp中最重要的几个命令. 一. Windows上的sftp命令(据说Linux上也是这样, 当然此处是指非嵌入式的Linux) 步骤: a ...

  3. AutoHotkey的函数对象的Bind方法绑定参数的应用

    近期在写Excel数据批处理函数,想提取某列的每个数据是否匹配某某条件的所有单元格. 这种需求比较多,比如判断的值有:单元格值,字体颜色,单元格颜色等等, 判断条件有:相同,不同,正则,或在某多行字符 ...

  4. 自动备份软件 —— Syncovery 7.98s Pro/Enterprise

    SynCovery自动备份软件原名Super Flexible Synchronizer,是目前功能最为强大的实时自动备份工具,连FTP.WebDAV等全部支持!最近从V6开始改用比较好记.易懂的新名 ...

  5. [零基础学JAVA]Java SE基础部分-02.标识符、数据类型

    转自:http://redking.blog.51cto.com/27212/114976 1.课程名称:标识符.数据类型 本季介绍了Java中的标识符的命名规则,各种关键字及数据类型的划分,并对各种 ...

  6. PHP 判断常量,变量和函数是否存在

    判断变量是否被定义:defined() if (defined('CONST_NAME')) { //do something } 判断变量是否存在:isset() ,注意变量未声明或声明时赋值为NU ...

  7. how to design Programs 学习笔记

    how to design Programs 学习笔记 */--> how to design Programs 学习笔记 目录 1. 前言 1.1. 系统化程序设计 1.2. 输入和输出 2. ...

  8. sql的寫法,推薦的寫法,全文索引提高類似like查詢的效率

    說明:logistics_detail表中每個deliver_id可能對應多個loginticsType,但是我們只要獲取最大的那一個. SELECT dm.delivery_code,dm.deli ...

  9. Selenium基础知识(8大元素定位概说)

    1. By.name() 页面源码如下: [html] : <button id="gbqfba"aria-label="Google Search" n ...

  10. java序列化报错

    Main.javat mainsr &java.util.Collections$UnmodifiableList�%1�� L listq ~xr ,java.util.Collection ...