一.列表推导式

1.列表推导式是颇具python风格的一种写法。这种写法除了高效,也更简短。

In [23]: {i:el for i,el in enumerate(["one","two","three"])}
Out[23]: {0: 'one', 1: 'two', 2: 'three'}
enumerate是内建函数,可以让列表获得“下标”的属性。
而如果不用列表推导式,上例需要这么写
In [24]: lst = ["one","two","three"]

In [25]: i = 0

In [26]: for e in lst:
....: lst[i] = '%d: %s' % (i,lst[i])
....: i +=1
....: In [27]: lst
Out[27]: ['0: one', '1: two', '2: three']

二.迭代器

迭代器属于一个临时区,安排一些元素在里面,但只用用的时候才会创建一些临时区,一旦遍历结束则临时区清空,再遍历就失效了。所以说迭代器能够减少内存的开销。

下面用代码来说明这句话的意思。

In [29]: import sys

In [30]: i = iter(range(10000))

In [32]: id(i.__next__())
Out[32]: 4388723488 In [33]: sys.getsizeof(i)
Out[33]: 48 In [34]: sys.getsizeof(i.__next__())
Out[34]: 28 In [35]: e = range(10000) In [37]: sys.getsizeof(e)
Out[37]: 48 In [38]: sys.getsizeof(list(e))
Out[38]: 90112

可以看到,如果一次性把list全部加载进来,需要90112byte内存空间,如果使用迭代器迭代,仅仅需要28byte内存空间。

ps:可以被next()函数调用并不断返回下一个值的对象称为迭代器。生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator,list,tuple,dict,str是有可迭代属性(惰性循环),但如果需要转化成可迭代对象,可以用iter()来转换,验证方式就是看对象是否有__next__方法。

三.生成器(generator)

生成器是一种特殊的迭代器。

1.什么时候需要用生成器

其实一般情况下是不需要生成器的,只有当因为性能限制下才需要用到,比如你需要用python来read一个10g的txt文件,如果一次性把10g的文件加载到内存再处理(.read()方法),内存肯定溢出了。这里如果使用生成器,就可以把读和处理交叉进行,比如使用(.readline和.readlines)就可以在循环读取的同时不断处理,这样可以节省大量内存空间。此外,还可以使用生成器生成线程池。

(ps:如果当自己写一个读写函数封装给别人使用时,那么要考虑到文件容量问题,此时应该考虑使用生成器。)

2.生成生成器的两种方法

2.1 第一种比较简单,将列表推导式的[]改称()就可以了

In [40]: g = (x*x for x in range(10))  

2.2 第二种办法就是在函数里加入yield关键字。yield和return有点类似,都可以用来返回值,不同的是yield遇到next()就返回,再次执行时从上次返回的yield语句处继续执行。

3.如何判断一个函数是否是生成器

判断生成器的办法就是查看其属性

In [41]: dir(g)
Out[41]:
['__class__',
...
'__next__',
...
'__repr__',
'__setattr__',
]

在这里可以看到g有一个__next__的魔术方法,而这是生成器所特有的属性,下面两种方式调用都可以

In [42]: g.__next__()
Out[42]: 0 In [43]: g.__next__()
Out[43]: 1 In [44]: next(g)
Out[44]: 4

Python的高级特性2:列表推导式,生成器与迭代器的更多相关文章

  1. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

  2. python高级编程之列表推导式

    1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...

  3. python之三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...

  4. python全栈开发- day14列表推导式、生成器表达式、模块基础

    一.列表推导式 #1.示例 数据量小 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i fo ...

  5. python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)

    一.列表生成式 生成1-100的列表 li = [] for i in range(1,101): li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期 ...

  6. python之生成器(~函数,列表推导式,生成器表达式)

    一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...

  7. python 学习笔记二 (列表推导式)

    2018年年初写了第一篇博客,说要做一个认真的技术人 https://www.cnblogs.com/yingchen/p/8455507.html 今天已经是11月19日了,这是第二篇博客,看来坚持 ...

  8. python序列(八)列表推导式实列

    1.列表推导式列表推导能非常简洁的构成一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形. 格式:[表达式 for 变量 in 列表]或[表达式 for 变量 in 列表 if 条件] 过滤 ...

  9. python基础-三元表达式/列表推导式/生成器表达式

    1.三元表达式:如果成立返回if前的内容,如果不成立返回else的内容 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' ...

随机推荐

  1. Android之登录时密码的保护

    在很多的Android项目中都需要用户登录.注册.这样的话在开发中做好保护用户密码的工作就显得尤为重要.这里我把自己的密码保护方法记录下来. 这是我建了一个保存密码的文件,以便于检查自己保存密码或者上 ...

  2. 浅谈GridLayout(网格布局)

    Android 4.0 布局-->GridLayout 网格布局 以行列单元格的形式展示内部控件排列,可以实现类似计算机键盘效果 ,也可以实现可自动变行的标签群效果 使用GridLayout , ...

  3. 心理控制方法——阅读Notes

    1.自助式情感手术 祛除自我意象中的伤疤的要点 2. 你制造错误,但是错误不应造就你    你身上的缺点不是你的错  3. 不仅要原谅别人,也要原谅自己 4. 怨恨是一条通向失败的道路 5. 注意来 ...

  4. C#八皇后问题 枚举值

    记得刚出道的时候, 有考虑怎么面试, 以及可能会遇到的面试题, 有一个人说了一下 八皇后问题, 据说要用 sql 语句写出来, 暂时我 写了一个C#版本的, 经测验,八皇后算法结果为 92种, 这个与 ...

  5. TechEd2013 Shanghai Hol Session PPT Share

    上个月去上海参加了TechEd 2013,并且参与了Hands-on-Lab环节,作为讲师引导大家完成<Local DB in WP8>实验的内容.由于实验的内容采用MVVM架构完成,因此 ...

  6. C# 重载运算符

    如果你想让自己定义的类型可以用运算符进行运算,那么可以通过重载运算符来实现: 示例: class Salary { public int RMB { get; set; } public static ...

  7. Java并发之CountDownLatch 多功能同步工具类

    package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * CountD ...

  8. easyui datagrid 键盘上下控制选中行

    扩展datagrid的一个方法keyCtr $.extend($.fn.datagrid.methods, { keyCtr : function (jq) {  return jq.each(fun ...

  9. SqlServer链接MySql操作步骤

    Sql Server版本 2008R2 1.从MySQL网站下载最新的MySQL ODBC驱动:http://www.mysql.com/downloads/connector/odbc/,我下载的版 ...

  10. Boost配置

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...