python生成器推导式_python之推导式and生成器表达器笔记及面试坑
推导式是从一个或多个迭代器快速简洁的创建数据结构的一种办法,它可以将循环和条件判断结合,从而可以避免语法冗长的代码。
推导式:一行代码生成一个列表(字典、集合)
注意:元组没有推导式
基本语法:[结果 for循环 条件判断(可选)]
列表习题
例1:创建一个1到10的列表
解答:
(1)循环1
2
3
4lis = []
for i in range(1, 11):
lis.append(i)
print(lis)
(2)列表推导式1
2lis = [i for i in range(1, 11)]
print(lis)
例2:20以内的基数创建一个列表
解答:取余判断1lis = [ i for i in range(21) if i%2==1]
range步长1lis = [i for i in range(1,20,2)]
例3:100以内被3整除的数的平方组成一个新的列表使用range步长实现1lis = [i**2 for i in range(3, 100, 3)]
使用判断表达式实现1lis = [ i**2 for i in range(1, 100) if i%3==0]
例4:列表中包含两个e的名字组成一个新的列表返回使用for循环实现1
2
3
4
5
6names = [['tom', 'billy', 'jeffer', 'andrew', 'wesley', 'steven'], ['alice', 'jill', 'ada', 'eveal', 'eva', 'cherry']]
lis = []
for line in names:
for name in line:
if name.count('e') == 2:
lis.append(name)
使用列表推导式实现1
2names = [['tom', 'billy', 'jeffer', 'andrew', 'wesley', 'steven'], ['alice', 'jill', 'ada', 'eveal', 'eva', 'cherry']]
lis = [name for line in names for name in line if name.count('e') == 2]
字典推导式习题1语法:{key:value for循环 条件判断(可选)}
例1:使用字典推导式将[‘a’, ‘b’, ‘c’, ‘d’] 转换为 {0:’a’, 1:’b’, 2:’c’, 3:’d’}推导式使用range1
2lis = ['a', 'b', 'c', 'd']
dic = {i:lis[i] for i in range(len(lis))}
推导式使用enumerate1
2lis = ['a', 'b', 'c', 'd']
dic = {i:j for i, j in enumerate(lis)}
例2:将{‘jj’:’林俊杰’, ‘jay’:’周杰伦’, ‘jolin’:’蔡依林’}键与值对调形成新的字典1dic = {'jj':'林俊杰', 'jay':'周杰伦', 'jolin':'蔡依林'} res = {v:k for k,v in dic.items()} print(res)
集合推导式习题1集合:不可重复、可哈希
例:将以下列表去重[1, 3, 5, 3, 66, 4, 3, 5, 7]使用集合转换去重1
2lis = [1, 3, 5, 3, 66, 4, 3, 5, 7]
s = set(lis)
使用推导式去重1
2lis = [1, 3, 5, 3, 66, 4, 3, 5, 7]
s = {i for i in lis}
生成器表达式和列表推导式的区别:列表推导式比较耗内存. 一次性加载. 生成器表达式几乎不占用内存. 使用的时候才分 配和使用内存
得到的值不一样. 列列表推导式得到的是一个列表. 生成器表达式获取的是一个生成器.
生成器表达式: (结果 for 变量 in 可迭代对象 if 条件筛选)
生成器表达式可以直接获取到生成器对象. 生成器对象可以直接进行for循环. 生成器具有惰性机制.
生成器的惰性机制: 生成器只有在访问的时候才取值. 说白了. 你找他要他才给你值. 不找他要. 他是不会执行的.
下面放两个带坑面试题
1、以下代码运行结果是什么?(先不要看解释哟)1
2
3
4
5
6
7
8
9def func():
yield 222
g = func() # 生成器g
g1 = (i for i in g) # 生成器g1. 但是g1的数据来源于g
g2 = (i for i in g1) # 生成器g2. 来源g1
print(list(g)) # 获取g中的数据. 这时func()才会被执行. 打印111.获取到222. g完毕.
print(list(g1)) # 获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1 也就没有数据
了
print(list(g2)) # 和g1同理
答案:1
2
3[222]
[]
[]
2、以下代码运行结果是什么?1
2
3
4
5
6
7
8
9def add(a, b):
return a + b
def test():
for item in range(4):
yield item
g = test()
for n in [5, 10]:
g = (add(n, i) for i in g)
print(list(g))
答案:[20, 21, 22, 23]1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33以上代码分析:
首行add函数只是一个用来求和的迷惑函数
向下看
test()函数是一个生成器函数,可以看到它的值循坏下来为:0, 1, 2, 3
g = test()这行代码才开始获取生成器,然后继续向下看
for n in [5, 10]:
g = (add(n, i) for i in g)
这段代码我们来进行拆分一下变为:
n=5
g = (add(n, i) for i in g)
n=10
g = (add(n, i) for i in g)
print(list(g))
以上代码可以看出,n=5以后,我们并没有取生成器的值,所以5不会带进生成器表达式,只是执行了下一行代码g = (add(n, i) for i in g),
所以此时我们可以将代码再进行拼接下将n=10后的生成器表达式后面的g给替换为(add(n, i) for i in g)
n=10
g = (add(n, i) for i in (add(n, i) for i in g))
print(list(g))
此时我们才取值
所以可以把n等于10带进去
代码变为一下,为了区分循环变量i,我们将替换g表达式中的i改为index
g = (add(10, i) for i in (add(10, index) for index in g))
接下来我们一步一步开始走
g = (add(10, i) for i in (add(10, index) for index in [0, 1, 2, 3]))
继续
g = (add(10, i) for i in [10, 11, 12, 13])
继续g的值已经是20,21, 22, 23
print(list(g))
最后转为列表,结果当然就是[20, 21, 22, 23]
python生成器推导式_python之推导式and生成器表达器笔记及面试坑相关推荐
- python中的字典推导式_python 字典推导式(经典代码)(22)
文章首发微信公众号,微信搜索:猿说python 在昨天的文章中,我们介绍了关于字典推导式使用方法其实也类似,也是通过循环和条件判断表达式配合使用,不同的是字典推导式返回值是一个字典,所以整个表达式需要 ...
- 字典推导式_Python基础-推导式
作者:Zarten知乎专栏:Python基础深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 概述 python ...
- python用列表推导式_python 列表推导式使用详解
所谓的列表推导式,就是指的轻量级循环创建列表. 基本使用方式 # 创建一个0-10的列表 a = [x for x in range(11)] print(a) """ ...
- python if else用法_python列表推导式中使用if-else
今天在处理自动化邮件数据时碰到数据行中包含字符串后,从hive中拿到的整数型数据自动转化成了浮点数,严重影响美观性.因此想到了用列表推导式来做转化,将其中的数字型数据全部转化为整型,而字符型数据保留原 ...
- python双重for循环 列表推导式_Python 列表推导式
列表推导式(list comprehension)是利用其它列表创建新列表的一种方式.它的工作方式类似于for循环,例如: >>> [x*x for x in range(10)] ...
- python 阴阳师 识别图像_Python采集阴阳师式神全图鉴图片
https://yys.res.netease.com/pc/zt/20161108171335/data/shishen_big_beforeAwake/201.png https://yys.re ...
- python滑动验证码处理_python+selenium滑动式验证码解决办法
from selenium importwebdriverfrom selenium.webdriver.support.ui import WebDriverWait #等待元素加载的 from s ...
- python 面试生成器和迭代器_Python 中的迭代器与生成器
导读 这篇文章主要介绍了 python 当中的迭代器与生成器,在涉及到大数量的场景应该考虑使用迭代器与生成器. 原文链接: https://russellgao.cn/python-iter/ 可迭代 ...
- python狗狗年龄换算_Python之美——一只数据狗的笔记[长期更新]
两年前咬咬牙跳了Matlab的坑,入手了Python,从此一发不可收的成了PY的重度依赖者.本人研究工作皆涉及大量的数据处理工作,PY和R作为数据分析的两驾马车,得其一者得天下.另外,我接触的许多软件 ...
- python模仿windows文件管理_python – 在Windows中显示文件的资源管理器属性对话框...
这样做的方法是调用Windows ShellExecuteEx() API传递属性动词.有各种高级Python包装器,但我没有成功地使用属性动词.相反,我会使用好老的ctypes. import ti ...
最新文章
- HA: Dhanush靶机渗透测试
- 在终端输入命令打开mac自带的python工具IDLE
- 套接字编程——基于UDP协议
- leetcode 刷题142 143
- 从信息瓶颈理论一瞥机器学习的“大一统理论”
- 利用CountDownLatch实现的一个简单的线程同步场景
- C# 7.1、7.2特性追踪
- armeabi和armeabi-v7a的区别
- 生成器(generator)
- java一次性查询几十万,几百万数据解决办法
- js阻止鼠标右击_使用JS 禁止键盘快捷方式和禁止鼠标右键操作弹窗提示
- 极域电子书包课堂管理系统怎么控屏_极域电子教室控屏时,怎么解除?
- matlab求一维热传导方程数值解代码,一维热传导方程的数值解
- linux公社_又一个Linux发行版宣告死亡!曾经是最好的桌面版BSD操作系统
- 手游上线前的五种测试的基础方法
- 网络爬虫讲解(附java实现的实例)
- 通过Tomtit实现Perl6开发工作流程的自动化
- python 提取出字符串括号中的内容,正则表达式
- 《统计学》第八版贾俊平 思维导图
- 轮询,长连接,长轮询原理及实现方式,优缺点
热门文章
- ubuntu16.xxx安装mysql5.0项目迁移环境搭建
- 0302借软件工程触IT
- 敏感之敏感 工资的多种可能性
- @RequiredArgsConstructor(onConstructor = @__(@Autowired)) Intellij IDEA如何去掉@Autowired 注入警告的方法
- 如何获取maven命令执行后成功与否的返回值
- mybatis利用mapper代理的方法实现多条件查询
- 美图个性化推荐的实践与探索
- javascript amp;amp; 和 || 最清晰的描述
- CMD窗口居中的方法(转)
- php mysql占位符_php中的占位符