列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。如果你的代码里并不经常使用它们,那么很可能你错过了许多写出可读性更好且更高效的代码的机会。

2.2.1 列表推导和可读性

把一个字符串变成 Unicode 码位的列表

第一种方法

symbols = '$¢£¥€¤'

codes = []

# ord() ascii字符串 转换成对应的数字
for symbol in symbols:
codes.append(ord(symbol)) print(codes) # [36, 162, 163, 165, 8364, 164]

把字符串变成 Unicode 码位的另外一种写法

symbols = '$¢£¥€¤'

codes = [ord(symbol) for symbol in symbols]

print(codes)

# [36, 162, 163, 165, 8364, 164]

另一方面,列表推导也可能被滥用。以前看到过有的 Python 代码用列表推导来重复获取一个函数的副作用。

通常的原则是,只用列表推导来创建新的列表,并且尽量保持简短。

如果列表推导的代码超过了两行,你可能就要考虑是不是得用 for 循环重写了

列表推导不会再有变量泄漏的问题

Python 2.x 中,在列表推导中 for 关键词之后的赋值操作可能会影响列表推导上下文中的同名变量

'''
Python 2.x 中,在列表推导中 for 关键词之后的赋值操作可能会影响列表推导上下文中的同名变量。像下面这个 Python 2.6.6 控制台对话: ''' # python2.6.6 代码
x = 'my precious'
dummy = [x for x in 'ABC']
print x # C

x 原本的值被取代了,但是这种情况在python3中是不会出现的.

列表推导、生成器表达式,以及同它们很相似的集合(set)推导和字典(dict)推导,

在 Python 3 中都有了自己的局部作用域,就像函数似的。表达式内部的变量和赋值只在局部起作用,表达式的上下文里的同名变量还可以被正常引用,局部变量并不会影响到它们。

python3 代码

'''
列表推导、生成器表达式,以及同它们很相似的集合(set)推导和字典(dict)推导,
在 Python 3 中都有了自己的局部作用域,就像函数似的。
表达式内部的变量和赋值只在局部起作用,表达式的上下文里的同名变量还可以被正常引用,局部变量并不会影响到它们。 ''' # python3.6 代码
x = 'ABC'
dump = [ord(x) for x in x if x] print(x)
# ABC print(dump)
# [65, 66, 67]

➊ x 的值被保留了。

➋ 列表推导也创建了正确的列表

列表推导可以帮助我们把一个序列或是其他可迭代类型中的元素过滤或是加工,然后再新建一个列表

列表推导的作用只有一个:生成列表

流畅的python 读书笔记 第二章 序列构成的数组 列表推导的更多相关文章

  1. 流畅的python第二章序列构成的数组学习记录

    python内置序列类型概览 列表推导和生成器表达式 列表推导是构建列表的快捷方式,而生成器表达式可以用来创建其他任何类型的序列 列表推导的示例 >>>test = [i*2 for ...

  2. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  3. 《流畅的Python》Data Structures--第2章序列array

    第二部分 Data Structure Chapter2 An Array of Sequences Chapter3 Dictionaries and Sets Chapter4 Text vers ...

  4. 流畅的Python读书笔记(二)

    2.1 可变序列与不可变序列 可变序列 list. bytearray. array.array. collections.deque 和 memoryview. 不可变序列 tuple. str 和 ...

  5. Getting Started With Hazelcast 读书笔记(第二章、第三章)

    第二章 起步 本章就相当简单粗暴了,用一个个例子说明hazelcast怎么用. 1.map,set,list这些集合类都是开箱即用的,只要从Hazelcast的实例中获取一份就行. 2.增加了Mult ...

  6. Java Concurrency in Practice 读书笔记 第二章

    第二章的思维导图(代码迟点补上):

  7. Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)

    前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...

  8. javascript 数据结构和算法读书笔记 > 第二章 数组

    这章主要讲解了数组的工作原理和其适用场景. 定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量. javascript数组的特殊之处: jav ...

  9. 《C++ Primer》读书笔记—第二章 变量和基本类型

    声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程. 1.8比特的char类型计算机表示的实际范围是-12 ...

随机推荐

  1. C#一个关于委托和事件通俗易懂的例子

    using System; namespace Test { public class 室友 { public delegate void 这是一个委托(); public void 起床晨跑去() ...

  2. C语言中do...while(0)的妙用-避免goto

    使用goto的优雅并避免结构的混乱 将要跳转到的语句用do{-}while(0) 包起来就可以. reference #defien N 10 bool Execute() { // 分配资源 int ...

  3. Python 处理命令行参数

    optparse模块用于从命令行直接读取参数,用法基本与 argparse模块 一致,如下: #!/usr/bin/env python #-*- coding:utf-8 -*- from optp ...

  4. PL/SQL编程1-基础

    编写第一个存储过程 create or replace procedure test_pro1 is begin ','zydev'); end; / 查看错误 show error 执行存储过程 e ...

  5. 如何设置SOLR的高亮 (highlight)?

    打开SOLR的核心配置文件: solrconfig.xml 找到 standard request handler 写入以下XML配置代码: <requestHandler name=" ...

  6. Js debug模式

    在代码中需要调试的地方,输入“debugger;”:

  7. IOS实例方法和类方法的区别

    类方法和实例方法   实例方法是— 类开头是+ 实例方法是用实例对象访问,类方法的对象是类而不是实例,通常创建对象或者工具类. 在实例方法里,根据继承原理发送消息给self和super其实都是发送给s ...

  8. 微信Tinker的一切都在这里,包括源码(一)

    版权声明:本文由张绍文原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/101 来源:腾云阁 https://www.qclo ...

  9. poj3734 Blocks[矩阵优化dp or 组合数学]

    Blocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6578   Accepted: 3171 Descriptio ...

  10. Egret3D初步学习笔记四 (地形使用)

    一 导出地形 Skinedmesh没反应.得选择导出scene. 二 直接报错  三 修改错误 选择关闭程序后,仍然可以导出完成. 由于地图的lightmap.exr没法解析报错. 在获得MapCon ...