Learning Python 011 高级特性 2
Python 高级特性 2
列表生成式
列表生成式就是指类似这样的代码:[x for x in range(1, 11)]
>>> L = [x for x in range(1, 11)]
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成了一个列表L,从1到10的列表,一共(11-1)-1 = 9个元素。 
L这个列表也可以这样生成:L = list(range())。
>>> L= list(range(1, 11))
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
关于列表生成式,我们在介绍几个实例:
要生成[1x1, 2x2, 3x3, …, 10x10]怎么做?
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
使用两层循环,可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
列出当前目录下的所有文件和目录名,可以通过一行代码实现:
import os # 导入os模块,模块的概念后面讲到
L = [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
print(L)
运行:
['.idea', 'dict_set.py', 'qiepian.py']
列表生成式也可以使用两个变量来生成list:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
L = [k + '=' + v for k, v in d.items()]
print(L)
运行:
['y=B', 'x=A', 'z=C']
把一个list中所有的字符串变成小写:
L = ['Hello', 'World', 'IBM', 'Apple']
l = [s.lower() for s in L]
print(l)
运行:
['hello', 'world', 'ibm', 'apple']
总结:
列表生成式生成的是list。使用的是[]符号。
生成器 (generator)
介绍生成器
创建一个生成器,只要把一个列表生成式的[]改成()。
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
Q:生成器是干什么用的?
A:受到内存限制,列表容量肯定是有限的。创建一个包含100万个元素的列表,会占用很大的存储空间。如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
通过next()函数获得generator的下一个返回值:
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
后面没有更多的元素时,抛出
StopIteration的错误。
不断调用next(g)函数是一种麻烦的方法,正确的方法是使用for循环:
>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)
...
0
1
4
9
16
25
36
49
64
81
通过
for循环来迭代它,并且不需要关心StopIteration的错误。
创建一个函数生成器 (generator function)
迭代器(Iterator)
讲过了迭代(Iterable)。现在讲讲迭代器: 
Q:什么是迭代器? 
A:可以直接作用于for循环的对象统称为可迭代对象:Iterable;可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。
Python的Iterator对象表示的是一个数据流.
判断一个对象是否是可迭代对象Iterable
可以使用isinstance()判断一个对象是否是Iterable对象:
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
总结:
可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
判断一个对象是否是迭代器Iterator
使用isinstance()判断一个对象是否是Iterator对象:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False
总结:
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
如何将一个Iterable变成Iterator
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
总结:
Python的for循环本质上就是通过不断调用next()函数实现的,例如:for x in [1, 2, 3, 4, 5]:
pass实际上完全等价于:
# 首先获得Iterator对象: it = iter([1, 2, 3, 4, 5]) # 循环: while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break
Learning Python 011 高级特性 2的更多相关文章
- Learning Python 011 高级特性 1
		
Python 高级特性 1 切片 将L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']列表中前上个3个元素: L = ['Michael', 'Sarah ...
 - Python的高级特性8:你真的了解类,对象,实例,方法吗
		
Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...
 - Python的高级特性7:闭包和装饰器
		
本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...
 - python的高级特性:切片,迭代,列表生成式,生成器,迭代器
		
python的高级特性:切片,迭代,列表生成式,生成器,迭代器 #演示切片 k="abcdefghijklmnopqrstuvwxyz" #取前5个元素 k[0:5] k[:5] ...
 - python函数高级特性
		
掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...
 - Python的高级特性(切片,迭代,生成器,迭代器)
		
掌握了python的数据类型,语句和函数,基本上就可以编出很多有用的程序了. 但是在python中,并不是代码越多越好,代码不是越复杂越好,而是越简单越好. 基于这个思想,就引申出python的一些高 ...
 - python的高级特性3:神奇的__call__与返回函数
		
__call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用. 也许说的比较抽象,举个例子就会明白. In [107]: f = abs In [ ...
 - Python之高级特性
		
一.切片 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']取出前三个元素 , 笨方法就是通过下标一个一个获取 [L[0], L[1], L[2]]Pyt ...
 - Python的高级特性12:类的继承
		
在面向对象的程序设计中,继承(Inheritance)允许子类从父类那里获得属性和方法,同时子类可以添加或者重载其父类中的任何方法.在C++和Java的对象模型中,子类的构造函数会自动调用父类的构造函 ...
 
随机推荐
- c的详细学习(5)数组
			
到目前为止,前面介绍的都是属于基本类型的数据.除此之外,C语言还提供了一些更为复杂的数据类型,称为构造类型.数组就是最基本的构造类型.若要针对一批数据进行某种操作,采用数组是一种方便可行的方法 ...
 - GDI+在绘制验证码中的使用
			
GDI+最简单的理解就是用来绘图的.其中包括点.直线.矩形.字符串等等. 先简单来个例子,说明如何在winform窗体中绘制一条直线,并且这条直线不随着窗体的移动而消失. using System; ...
 - linux通过脚本获取内存信息
			
1 原理 脚本中通过执行free获取内存信息,然后将文本信息通过“空格”分隔符分割成字符串数组将不同信息提取出来,最后通过bc计算出百分比 2 脚本 #!/bin/shHOSTNAME=`hostna ...
 - htmlParser的使用-链接
			
基于htmlparser实现网页内容解析:http://www.cnblogs.com/coding-hundredOfYears/archive/2012/12/15/2819217.html ht ...
 - STL 之 map的用法
			
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...
 - 51nod 1196
			
题目 神犇题解:见题目讨论区曹鹏神犇的讲解. 跪烂..倒地不起.. 对于每一个合法解,我们都可以将其唯一地分解成若干个“链”.所谓链是指由那些小于n/2的字符组成的,并且最后一个字符满足2*i> ...
 - 算法(Algorithms)第4版 练习 2.2.11(3)
			
关键代码实现: public static void sort(Comparable[] input) { int N = input.length; aux = input.clone();//mu ...
 - 算法(Algorithms)第4版 练习 1.3.41
			
方法实现: //1.3.41 public Queue(Queue<Item> q) { Queue<Item> result = new Queue<Item>( ...
 - 本地文件读取(csv,txt)时字符编码问题解决
			
今天进行csv文件读取时,老是入库为空,因为其中有中文字符,我要通过中文字符映射成相应的编号(上升:1011,下降:1012),于是怎么也取不到编号.刚开始以为程序映射出了问题,最后日志打出来后,发现 ...
 - linux导出Mysql数据sql脚本