【Effective Python】读书笔记-04推导与生成

这篇具有很好参考价值的文章主要介绍了【Effective Python】读书笔记-04推导与生成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 用列表推导取代 map 与 filter

因为不需要写 lambda 表达式。
可以很容易地跳过原列表中的某些数据。

# 列表推导

l = [i for i in range(5)]
# [0, 1, 2, 3, 4]
print(l)

# 字典推导

d = {i: i ** 2 for i in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
print(d)

2. 控制推导逻辑的子表达式不要超过两个

推导的时候,可以使用多个 if 条件。如果这些 if 条件出现在同一层循环内,那么它们之间默认是 and 关系,也就是必须同时成立。
在推导时,每一层的 for 子表达式都可以带有 if 条件

在表示推导逻辑时,最多只应该写两个子表达式(例如两个 if 条件、两个 for 循环,或者一个 if 条件与一个 for 循环)否则,应该采用 if 和 for 语句来实现,或编写辅助函数。

3. 用赋值表达式消除推导中的重复代码

编写推导式与生成器表达式时,可以在描述条件的那一部分通过赋值表达式定义变量,并在其他部分复用该变量,可使程序简单易读。

建议赋值表达式只出现在推导逻辑的条件之中。

4. 不要让函数直接返回列表,应该让它逐个生成列表里的值

使用生成器可以降低对内存的消耗。
生成器函数所返回的迭代器是有状态的,无法重复调用。

5. 谨慎地迭代函数所收到的参数

函数和方法收到的参数如果要迭代许多次,那就要小心,如果这些参数是迭代器的话,就可能得不到预期的值。

Python 的迭代器协议确定了容器与迭代器应该怎样跟内置的 iter 及 next 函数、for 循环及相关的表达式交互:

  • Python 执行 for x in foo 这样的语句时,实际上会调用 iter(foo),也就是把 foo 传给内置的 iter 函数。
  • iter 函数会触发名为foo.__iter__的特殊方法,该方法必须返回迭代器对象(这个迭代器对象本身要实现__next__特殊方法)
  • Python 会用迭代器对象反复调用内置的 next 函数,直到数据耗尽为止

要想让自定义的容器类型可以迭代,只需要把__iter__方法实现为生成器即可。

可以把值传给 iter 函数,检测它返回的是不是那个值本身。如果是,就说明这是个普通的迭代器,而不是一个可以迭代的容器。另外,也可以用内置的 isinstance 函数判断该值是不是 collections.abc.Iterator 类的实例。

6. 考虑用生成器表达式改写数据量较大的列表推导

要想处理大规模的数据,可以使用生成器表达式(generator expression)来做,它扩展了列表推导式与生成器机制。

生成器表达式可以组合起来,编写一条新的生成器表达式(连锁反应):

l = [1, 2, 3, 4, 5]

it = (i for i in l)

it2 = ((i + 1, i ** 2) for i in it)

print(next(it))  # 1
print(next(it2))  # (3, 4)
print(next(it))  # 3
print(next(it))  # 4

7. 通过 yield from 把多个生成器连起来用

yeild from 优化for-yeild结构:

  • 会先从嵌套进去的小生成器里面取值,如果该生成器已经用完,那么程序的控制流程就会回到 yield from 所在的这个函数之中,然后它有可能进入下一套 yield from 逻辑

更快,层次结构更分明。

8. 不要用 send 给生成器注入数据

替代方案:通过把迭代器传给函数,通过 next 函数推进该迭代器返回需要用到的参数

优点:

  • 迭代器可以来自任何地方,完全可以是动态的

缺点:

  • 必须假设输入的生成器绝对能够保证线程安全

9. 不要通过 throw 变换生成器的状态

解决办法:定义一个有状态的闭包

10. 考虑用 itertools 拼接迭代器与生成器

如果要实现比较难写的迭代逻辑,那么应该先查看 itertools 的文档(在 Python 解释器界面输入 help(itertools)文章来源地址https://www.toymoban.com/news/detail-654828.html

连接多个迭代器

过滤迭代器中的元素

到了这里,关于【Effective Python】读书笔记-04推导与生成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Effective Python 编写高质量Python代码的59个有效方法》学习笔记2

    尽量用enumerate取代range 用zip()同时遍历两个迭代器 合理使用try-except-else-finally 如果既要异常向上传播,又要在异常发生时执行清理工作,可使用try/finally结构 try/except/else结构可以清晰描述哪些异常由自己的代码处理,哪些传播到上一级 无论try块是否异常,都可用try/finally复合

    2023年04月25日
    浏览(52)
  • 【python基础语法六】迭代器,生成器,推导式和高阶函数

    内置函数: dir 获取当前对象的内置成员 高阶函数 : 能够把函数当成参数传递的就是高阶函数 (map ,filter ,reduce , sorted) 案例: 1. enumerate 2. zip 元组推导式是生成器( generator ) (1) 基本语法 (2) 优化生成器代码 (3) send 的使用方式 (给上一个 yield 发送数据) (4) yield from 的使用 (5) 案例

    2024年02月02日
    浏览(46)
  • 菜鸟教程《Python 3 教程》笔记(12):推导式

    笔记带有个人侧重点,不追求面面俱到。 出处: 菜鸟教程 - Python3 推导式 扩展阅读: Python 中的列表推导式 参考 12.1 列表推导式,将 [] 替换为 {} 。 注意: 元组推导式返回的结果是一个生成器对象。

    2024年02月10日
    浏览(45)
  • 掌握Python 机器学习 读书笔记 9 (流水线 && 算法保存)

    在机器学习里可以看到有一些必要的步骤, 这些步骤是可以作为workflow 自动化的。 而且流水线可以对每个fold来进行处理, 这样很大程度避免了数据泄露。 这也是为什么使用流水线的原因。 使用机器学习的时候很容易落入一个陷阱, 就是泄露你的训练数据到测试数据。 为

    2024年03月09日
    浏览(43)
  • 「Python系列」Python推导式

    Python推导式是一种简洁且高效的代码编写方式,可以在一行代码中完成常见的循环和集合操作。Python推导式包括列表推导式、字典推导式、集合推导式和生成器推导式。 列表推导式:可以根据一个已有的列表生成一个新的列表。 字典推导式:可以根据一个已有的字典生成一

    2024年02月19日
    浏览(22)
  • 【Python入门【推导式创建序列、字典推导式、集合推导式】(九)

    👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🔥如果感觉博主的文章还不错的

    2024年02月15日
    浏览(64)
  • 读书笔记:《HTML5开发手册》--HTML5新的结构元素

    这是补充HTML5基础知识的系列内容,其他为: 一、HTML5-- 新的结构元素 二、HTML5-- figure、time、details、mark 三、HTML5-- details活学活用 四、HTML5-- 现存元素的变化 五、HTML5 -- Web表单 虽然从事前端开发已有很长一段时间,对HTML5标签也有使用,但在语义化上面理解还不够清晰。之前

    2024年02月07日
    浏览(57)
  • 【Python】Python系列教程-- Python3 推导式(七)

    往期回顾: Python系列教程–Python3介绍(一) Python系列教程–Python3 环境搭建(二) Python系列教程–Python3 VScode(三) Python系列教程–Python3 基础语法(四) Python系列教程–Python3 基本数据类型(五) Python系列教程-- Python3 数据类型转换(六) Python 推导式是一种独特的数据处

    2024年02月07日
    浏览(43)
  • Python小姿势 - Python中的列表推导式

    Python中的列表推导式 Python中的列表推导式是一种很好的创建列表的方式。它允许你将一个操作应用于列表中的每个元素,并将结果放入一个新的列表中。 例如,假设你有一个包含数字的列表,但是你想将每个数字都乘以2,并将结果放入一个新的列表中。你可以使用以下代码

    2024年02月04日
    浏览(52)
  • Python推导式 - 最全用法

    写一段代码生成1到100之间的数字的平方的列表,答案是: 如果你这样写,你就不Pythonic了: 解释   正确的写法是使用Python的推导式: 生成一个列表,包含1到100之间是3的倍数的数字的方法: 代码: 生成一个列表,如果是3的倍数就用平方,否则就用是数字本身: 代码: 结

    2024年04月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包