推导式是从一个或多个迭代器快速简洁的创建数据结构的一种办法,它可以将循环和条件判断结合,从而可以避免语法冗长的代码。

推导式:一行代码生成一个列表(字典、集合)

注意:元组没有推导式

基本语法:[结果 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生成器表达器笔记及面试坑相关推荐

  1. python中的字典推导式_python 字典推导式(经典代码)(22)

    文章首发微信公众号,微信搜索:猿说python 在昨天的文章中,我们介绍了关于字典推导式使用方法其实也类似,也是通过循环和条件判断表达式配合使用,不同的是字典推导式返回值是一个字典,所以整个表达式需要 ...

  2. 字典推导式_Python基础-推导式

    作者:Zarten知乎专栏:Python基础深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 概述 python ...

  3. python用列表推导式_python 列表推导式使用详解

    所谓的列表推导式,就是指的轻量级循环创建列表. 基本使用方式 # 创建一个0-10的列表 a = [x for x in range(11)] print(a) """ ...

  4. python if else用法_python列表推导式中使用if-else

    今天在处理自动化邮件数据时碰到数据行中包含字符串后,从hive中拿到的整数型数据自动转化成了浮点数,严重影响美观性.因此想到了用列表推导式来做转化,将其中的数字型数据全部转化为整型,而字符型数据保留原 ...

  5. python双重for循环 列表推导式_Python 列表推导式

    列表推导式(list comprehension)是利用其它列表创建新列表的一种方式.它的工作方式类似于for循环,例如: >>> [x*x for x in range(10)] ...

  6. python 阴阳师 识别图像_Python采集阴阳师式神全图鉴图片

    https://yys.res.netease.com/pc/zt/20161108171335/data/shishen_big_beforeAwake/201.png https://yys.re ...

  7. python滑动验证码处理_python+selenium滑动式验证码解决办法

    from selenium importwebdriverfrom selenium.webdriver.support.ui import WebDriverWait #等待元素加载的 from s ...

  8. python 面试生成器和迭代器_Python 中的迭代器与生成器

    导读 这篇文章主要介绍了 python 当中的迭代器与生成器,在涉及到大数量的场景应该考虑使用迭代器与生成器. 原文链接: https://russellgao.cn/python-iter/ 可迭代 ...

  9. python狗狗年龄换算_Python之美——一只数据狗的笔记[长期更新]

    两年前咬咬牙跳了Matlab的坑,入手了Python,从此一发不可收的成了PY的重度依赖者.本人研究工作皆涉及大量的数据处理工作,PY和R作为数据分析的两驾马车,得其一者得天下.另外,我接触的许多软件 ...

  10. python模仿windows文件管理_python – 在Windows中显示文件的资源管理器属性对话框...

    这样做的方法是调用Windows ShellExecuteEx() API传递属性动词.有各种高级Python包装器,但我没有成功地使用属性动词.相反,我会使用好老的ctypes. import ti ...

最新文章

  1. HA: Dhanush靶机渗透测试
  2. 在终端输入命令打开mac自带的python工具IDLE
  3. 套接字编程——基于UDP协议
  4. leetcode 刷题142 143
  5. 从信息瓶颈理论一瞥机器学习的“大一统理论”
  6. 利用CountDownLatch实现的一个简单的线程同步场景
  7. C# 7.1、7.2特性追踪
  8. armeabi和armeabi-v7a的区别
  9. 生成器(generator)
  10. java一次性查询几十万,几百万数据解决办法
  11. js阻止鼠标右击_使用JS 禁止键盘快捷方式和禁止鼠标右键操作弹窗提示
  12. 极域电子书包课堂管理系统怎么控屏_极域电子教室控屏时,怎么解除?
  13. matlab求一维热传导方程数值解代码,一维热传导方程的数值解
  14. linux公社_又一个Linux发行版宣告死亡!曾经是最好的桌面版BSD操作系统
  15. 手游上线前的五种测试的基础方法
  16. 网络爬虫讲解(附java实现的实例)
  17. 通过Tomtit实现Perl6开发工作流程的自动化
  18. python 提取出字符串括号中的内容,正则表达式
  19. 《统计学》第八版贾俊平 思维导图
  20. 轮询,长连接,长轮询原理及实现方式,优缺点

热门文章

  1. ubuntu16.xxx安装mysql5.0项目迁移环境搭建
  2. 0302借软件工程触IT
  3. 敏感之敏感 工资的多种可能性
  4. @RequiredArgsConstructor(onConstructor = @__(@Autowired)) Intellij IDEA如何去掉@Autowired 注入警告的方法
  5. 如何获取maven命令执行后成功与否的返回值
  6. mybatis利用mapper代理的方法实现多条件查询
  7. 美图个性化推荐的实践与探索
  8. javascript amp;amp; 和 || 最清晰的描述
  9. CMD窗口居中的方法(转)
  10. php mysql占位符_php中的占位符