当前位置:
首页 > Python基础教程 >
-
Python基础(十二)
一、推导式
(一)列表推导式
-
先来看一段代码
- 建立一个空列表,向空列表中添加元素
lst = list() for i in range(5): lst.append(i) print(lst) 运行结果: [0, 1, 2, 3, 4]
- 利用列表推导式,效果一样
lst = [i for i in range(5)] print(lst) 运行结果: [0, 1, 2, 3, 4]
-
循环模式:
-
格式:
[元素 for 元素 in 可迭代对象]
- 执行流程:每次for循环将元素添加到列表中
lst = [i for i in range(5)] print(lst) 运行结果: [0, 1, 2, 3, 4]
-
格式:
-
筛选模式
筛选模式:
-
格式:
[元素 for 变量 in 可迭代对象 if 条件]
- 执行流程:执行for循环并判断元素是否符合条件,将符合条件的元素添加到列表中
lst = [i for i in range(5) if i > 2] print(lst) 运行结果: [3, 4]
-
格式:
(二)字典推导式
-
同理,先来看一段代码
- 建立一个空字典,向字典中添加键值对
dic = dict() for i in range(1, 5): dic[f"k{i}"] = i print(dic) 运行结果: {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
- 使用字典推导式,效果一样
dic = {f"k{i}": i for i in range(1, 5)} print(dic) 运行结果: {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
-
循环模式:
-
格式:
{键值对 for 元素 in 可迭代对象}
- 执行流程:执行for循环利用元素组成键值对添加到字典中
dic = {f"k{i}": i for i in range(1, 5)} print(dic) 运行结果: {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
-
格式:
-
筛选模式:
-
格式:
{键值对 for 元素 in 可迭代对象 if 条件}
- 执行流程:执行for循环并判断元素是否符合条件,利用符合条件的元素组成键值对添加到字典中
dic = {f"k{i}": i for i in range(1, 5) if i > 2} print(dic) 运行结果: {'k3': 3, 'k4': 4}
-
格式:
(三)集合推导式
- 与列表一样,这里就不再举例了
-
循环模式:
-
格式:
{元素 for 元素 in 可迭代对象}
- 执行流程:每次for循环将元素添加到集合中
st = {i for i in range(5)} print(st) 运行结果: {0, 1, 2, 3, 4}
-
格式:
-
筛选模式:
- 格式:{元素 for 变量 in 可迭代对象 if 条件}`
- 执行流程:执行for循环并判断元素是否符合条件,将符合条件的元素添加到集合中
lst = {i for i in range(5) if i > 2} print(st) 运行结果: {3, 4}
(四)推导式应用
- 来看几个推导式的应用例题
-
求字符串
s = "zxdhnbhnb"
中"h"的索引s = "zxdhnbhnb" lst = [i for i in range(len(s)) if s[i] == "h"] print(lst) 运行结果: [3, 6]
-
将下列列表中带两个"e"的元素添加到新列表
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] lst = [name for i in names for name in i if name.count("e") == 2] print(lst) 运行结果: ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
二、生成器表达式
(一)回顾:通过函数实现生成器
-
回顾一下通过函数实现生成器
-
将函数
return
变成yield
就变成了生成器
def func(): yield 1 yield 2 yield 3 g = func() print(next(g)) print(next(g)) print(next(g)) 运行结果: 1 2 3
-
将函数
(二)生成器表达式
-
通过表达式实现生成器
-
将列表推导式的方括号
[]
变成圆括号()
,就成了生成器表达式
lst = [i for i in range(5)] print(type(lst)) g = (i for i in range(5)) print(type(g)) 运行结果: <class 'list'> <class 'generator'>
- 转换成通过函数实现的生成器(二者等价)
# g = (i for i in range(5)) def func(): # 二者等价 for i in range(5): yield i g= func() print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) 运行结果: 0 1 2 3 4
-
将列表推导式的方括号
-
生成器表达式结构:
-
普通模式:
-
格式:
(元素 for 元素 in 可迭代对象)
- 运行机制:惰性机制,不取值不运行,每次取值得到一个结果
g = (i for i in range(5)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) 运行结果: 0 1 2 3 4
-
格式:
-
筛选模式:
-
格式:
(元素 for 元素 in 可迭代对象 if 条件)
- 运行机制:惰性机制,不取值不运行,每次取值得到一个满足判断条件的结果
g = (i for i in range(5) if i > 2) print(next(g)) print(next(g)) 运行结果: 3 4
-
格式:
-
-
生成器的取值方式补充:
-
之前提到过的最正宗的
next(生成器)
g = (i for i in range(5)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) 运行结果: 0 1 2 3 4
- 通过for循环取值
g = (i for i in range(5)) for el in g: print(el) 运行结果: 0 1 2 3 4
-
通过
list()
、tuple()
、set()
取值
g = (i for i in range(5)) print(list(g)) print(tuple(g)) print(set(g)) 运行结果: [0, 1, 2, 3, 4] (0, 1, 2, 3, 4) {0, 1, 2, 3, 4}
-
之前提到过的最正宗的
-
真正理解生成器的惰性机制,来看一道例题:
def add(a, b): return a + b def test(): for r_i in range(4): yield r_i g = test() for n in [2, 10]: g = (add(n, i) for i in g) print(list(g)) 运行结果: [20,21,22,23]
解析:生成器只有在取值的时候才会去运行,上述例题只有最后'print(list(g))'取值。 """ g = test() for n in [2, 10]: g = (add(n, i) for i in g) """ 所以上面的for循环可以写成如下代码: """ n = 10 g = (add(n, i) for i in (add(n, i) for i in test())) """ 最终代入得到的列表为:[20, 21, 22, 23]
三、lambda匿名函数
(一)匿名函数定义
-
python中为了解决一些简单的需求可以使用一句话定义一个函数,这就是lambda匿名函数
-
lambda语法结构:
-
函数名 = lambda 形参:返回值
# def func(x, y): # return x + y # print(func(1, 2)) func = lambda x, y: x+y # 两个函数等价 print(func(1, 2)) 运行结果: 3
-
-
注意事项:
- 形参:可以接受多个所有类型参数(位置、动态位置、默认值、动态关键字)
func = lambda a,b,*args,sex= 'alex',c,**kwargs: kwargs print(func(3, 4,c=666,name='zxd')) # 只返回kwargs 运行结果: {'name': 'zxd'}
- 返回值:只能返回一个数据(任意数据类型),必须写
func = lambda x:(x[0],x[2]) print(func('zxdnb')) 运行结果: ('z', 'd')
- 返回值也可以是三元表达式
func = lambda x,y: x if x > y else y print(func(3,100)) 运行结果: 100
(二)结合匿名函数的列表推导式
-
例一:
- 列表推导式:
g = [lambda :i+1 for i in range(3)] print([em() for em in g]) 运行结果: [3, 3, 3]
- 转换为普通代码
g = list() for i in range(3): def func(): return i + 1 g.append(func) new_g = list() for em in g: new_g.append(em()) print(new_g) 运行结果: [3, 3, 3]
-
例二:
- 列表推导式:
g = [lambda i:i+1 for i in range(3)] print([em(3) for em in g]) 运行结果: [4, 4, 4]
- 转换为普通代码
g = list() for i in range(3): def func(i): return i + 1 g.append(func) new_g = list() for em in g: new_g.append(em(3)) print(new_g) 运行结果: [4, 4, 4]
(三)结合匿名函数的生成器表达式
-
例一:
- 生成器表达式:
g = (lambda i:i+1 for i in range(3)) print([em(3) for em in g]) 运行结果: [4, 4, 4]
- 转换为函数实现的生成器:
def g(): for i in range(3): def func(i): return i + 1 yield func new_g = list() for em in g(): new_g.append(em(3)) print(new_g) 运行结果: [4, 4, 4]
-
例二:
- 生成器表达式:
g = (lambda :i+1 for i in range(3)) print([em() for em in g]) 运行结果: [1, 2, 3]
- 转换为函数实现的生成器:
def g(): for i in range(3): def func(): return i + 1 yield func new_g = list() for em in g(): new_g.append(em()) print(new_g) 运行结果: [1, 2, 3]
-
例三:
- 生成器表达式
g = (lambda x:x*i for i in range(3)) for j in [2,10]: g1 = (em(3) for em in g) print([e+j for e in g1]) 运行结果: [10, 13, 16]
- 转换为普通代码
def g(): for i in range(3): def func(x): return x * i yield func for j in [2, 10]: def g1(): for em in g(): yield em(3) new_g = list() for e in g1(): new_g.append(e + j) print(new_g) 运行结果: [10, 13, 16]
四、内置函数
-
查看解释器内置常量和内置函数的方法
-
dir(__builtins__)
-
-
Python3.6.8的内置函数(共72个)
abs all any ascii bin bool bytearray bytes callable chr classmethod compile complex copyright credits delattr dict dir divmod enumerate eval exec exit filter float format frozenset getattr globals hasattr hash help hex id input int isinstance issubclass iter len license list locals map max memoryview min next object oct open ord pow print property quit range repr reversed round set setattr slice sorted staticmethod str sum super tuple type vars zip
(一)基础函数(了解)
-
all() any() bytes() callable() chr() ord() complex() divmid() eval() exec() frozenset() help() globals() locals() hash() id() iter() next() bin() oct() int() hex() pow() repr() round() bool()
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式