Python 高级特性 2

列表生成式

列表生成式就是指类似这样的代码:[x for x in range(1, 11)]

  1. >>> L = [x for x in range(1, 11)]
  2. >>> L
  3. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成了一个列表L,从110的列表,一共(11-1)-1 = 9个元素。

L这个列表也可以这样生成:L = list(range())

  1. >>> L= list(range(1, 11))
  2. >>> L
  3. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

关于列表生成式,我们在介绍几个实例:

要生成[1x1, 2x2, 3x3, …, 10x10]怎么做?

  1. >>> [x * x for x in range(1, 11)]
  2. [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

使用两层循环,可以生成全排列:

  1. >>> [m + n for m in 'ABC' for n in 'XYZ']
  2. ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

列出当前目录下的所有文件和目录名,可以通过一行代码实现:

  1. import os # 导入os模块,模块的概念后面讲到
  2. L = [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
  3. print(L)

运行:

  1. ['.idea', 'dict_set.py', 'qiepian.py']

列表生成式也可以使用两个变量来生成list

  1. d = {'x': 'A', 'y': 'B', 'z': 'C' }
  2. L = [k + '=' + v for k, v in d.items()]
  3. print(L)

运行:

  1. ['y=B', 'x=A', 'z=C']

把一个list中所有的字符串变成小写

  1. L = ['Hello', 'World', 'IBM', 'Apple']
  2. l = [s.lower() for s in L]
  3. print(l)

运行:

  1. ['hello', 'world', 'ibm', 'apple']

总结:

列表生成式生成的是list。使用的是[]符号。

生成器 (generator)

介绍生成器

创建一个生成器,只要把一个列表生成式[]改成()

  1. >>> L = [x * x for x in range(10)]
  2. >>> L
  3. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  4. >>> g = (x * x for x in range(10))
  5. >>> g
  6. <generator object <genexpr> at 0x1022ef630>

创建Lg的区别仅在于最外层的[]()L是一个list,而g是一个generator

Q:生成器是干什么用的?

A:受到内存限制,列表容量肯定是有限的。创建一个包含100万个元素的列表,会占用很大的存储空间。如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

通过next()函数获得generator的下一个返回值

  1. >>> next(g)
  2. 0
  3. >>> next(g)
  4. 1
  5. >>> next(g)
  6. 4
  7. >>> next(g)
  8. 9
  9. >>> next(g)
  10. 16
  11. >>> next(g)
  12. 25
  13. >>> next(g)
  14. 36
  15. >>> next(g)
  16. 49
  17. >>> next(g)
  18. 64
  19. >>> next(g)
  20. 81
  21. >>> next(g)
  22. Traceback (most recent call last):
  23. File "<stdin>", line 1, in <module>
  24. StopIteration

后面没有更多的元素时,抛出StopIteration的错误。

不断调用next(g)函数是一种麻烦的方法,正确的方法是使用for循环:

  1. >>> g = (x * x for x in range(10))
  2. >>> for n in g:
  3. ... print(n)
  4. ...
  5. 0
  6. 1
  7. 4
  8. 9
  9. 16
  10. 25
  11. 36
  12. 49
  13. 64
  14. 81

通过for循环来迭代它,并且不需要关心StopIteration的错误。

创建一个函数生成器 (generator function

迭代器(Iterator

讲过了迭代Iterable)。现在讲讲迭代器

Q:什么是迭代器

A:可以直接作用于for循环的对象统称为可迭代对象Iterable;可以被next()函数调用并不断返回下一个值的对象称为迭代器IteratorIterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。

PythonIterator对象表示的是一个数据流.

判断一个对象是否是可迭代对象Iterable

可以使用isinstance()判断一个对象是否是Iterable对象:

  1. >>> from collections import Iterable
  2. >>> isinstance([], Iterable)
  3. True
  4. >>> isinstance({}, Iterable)
  5. True
  6. >>> isinstance('abc', Iterable)
  7. True
  8. >>> isinstance((x for x in range(10)), Iterable)
  9. True
  10. >>> isinstance(100, Iterable)
  11. False

总结:

可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yieldgenerator function

判断一个对象是否是迭代器Iterator

使用isinstance()判断一个对象是否是Iterator对象:

  1. >>> from collections import Iterator
  2. >>> isinstance((x for x in range(10)), Iterator)
  3. True
  4. >>> isinstance([], Iterator)
  5. False
  6. >>> isinstance({}, Iterator)
  7. False
  8. >>> isinstance('abc', Iterator)
  9. False

总结:

可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

如何将一个Iterable变成Iterator

把list、dict、str等Iterable变成Iterator可以使用iter()函数:

  1. >>> isinstance(iter([]), Iterator)
  2. True
  3. >>> isinstance(iter('abc'), Iterator)
  4. True

总结:

Pythonfor循环本质上就是通过不断调用next()函数实现的,例如:

  1. for x in [1, 2, 3, 4, 5]:
  2. pass

实际上完全等价于:


  1. # 首先获得Iterator对象:
  2. it = iter([1, 2, 3, 4, 5])
  3. # 循环:
  4. while True:
  5. try:
  6. # 获得下一个值:
  7. x = next(it)
  8. except StopIteration:
  9. # 遇到StopIteration就退出循环
  10. break

参考网站:

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431756919644a792ee4ead724ef7afab3f7f771b04f5000

Learning Python 011 高级特性 2的更多相关文章

  1. Learning Python 011 高级特性 1

    Python 高级特性 1 切片 将L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']列表中前上个3个元素: L = ['Michael', 'Sarah ...

  2. Python的高级特性8:你真的了解类,对象,实例,方法吗

    Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...

  3. Python的高级特性7:闭包和装饰器

    本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...

  4. python的高级特性:切片,迭代,列表生成式,生成器,迭代器

    python的高级特性:切片,迭代,列表生成式,生成器,迭代器 #演示切片 k="abcdefghijklmnopqrstuvwxyz" #取前5个元素 k[0:5] k[:5] ...

  5. python函数高级特性

    掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...

  6. Python的高级特性(切片,迭代,生成器,迭代器)

    掌握了python的数据类型,语句和函数,基本上就可以编出很多有用的程序了. 但是在python中,并不是代码越多越好,代码不是越复杂越好,而是越简单越好. 基于这个思想,就引申出python的一些高 ...

  7. python的高级特性3:神奇的__call__与返回函数

    __call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用. 也许说的比较抽象,举个例子就会明白. In [107]: f = abs In [ ...

  8. Python之高级特性

    一.切片 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']取出前三个元素 , 笨方法就是通过下标一个一个获取 [L[0], L[1], L[2]]Pyt ...

  9. Python的高级特性12:类的继承

    在面向对象的程序设计中,继承(Inheritance)允许子类从父类那里获得属性和方法,同时子类可以添加或者重载其父类中的任何方法.在C++和Java的对象模型中,子类的构造函数会自动调用父类的构造函 ...

随机推荐

  1. Data Structure Linked List: Merge Sort for Linked Lists

    http://www.geeksforgeeks.org/merge-sort-for-linked-list/ #include <iostream> #include <vect ...

  2. ios中文模糊搜索兼容问题

    $(function(){ var cpLock = true; $("input[name='name']").off().on({ compositionstart: func ...

  3. php使用mysql数据库时中文不显示或显示异常解决方法

    如果出现标题所述问题,需从四个层面解决问题 1 项目文件是否为utf8编码 右键项目文件->properties->Resource->Text file encoding-> ...

  4. Spring 相关

    1. spring的bean的scope属性范围  参考:http://jiangshuiy.iteye.com/blog/1667316 原理分析(bean的scope属性范围) scope用来声明 ...

  5. 《机器学习实战》学习笔记第九章 —— 决策树之CART算法

    相关博文: <机器学习实战>学习笔记第三章 —— 决策树 主要内容: 一.CART算法简介 二.分类树 三.回归树 四.构建回归树 五.回归树的剪枝 六.模型树 七.树回归与标准回归的比较 ...

  6. 复选框 ajax取得后台页面

    首先判断是否勾选了复选框 $("input[name='product']").click(function () { if($(this).prop("checked& ...

  7. 如何搭建一个GitHub在自己的服务器上?

    摘自:http://blog.csdn.net/yangzhenping/article/details/43937595

  8. ZSetOperations

    有序集合,默认按照score升序排列,存储格式K(1)==V(n),V(1)=S(1)(K=key,V=value,S=score) 1.add(K,V,S):添加 2.count(K,Smin,Sm ...

  9. ES查看segment大小

    摘自:http://www.aboutyun.com/thread-17078-1-1.html Segment Memory Segment不是file吗?segment memory又是什么?前面 ...

  10. .dhpcd导致cpu飙升问题

    因公司有业务服务器在阿里云上面,阿里云后台报警说,“有恶意程序在挖矿”,引起了高度重视,于是我登陆服务器进行排查. 登陆云服务器:系统centos7.5 第一步使用top查看资源情况. top 可以清 ...