Python notes(7)-Python高级特性

切片:

若要在一个list或tuple中取部分元素比较繁琐,所以切片特性用以解决这个问题

L[m:n]表示,从索引(下标)m开始取,直到索引n为止,但不包括索引n。即从m取到n-1。

倒数切片(切出来的同样为逆序)同样可以,但是倒数第一个元素的索引是-1。

tuple和字符串同样可以进行切片操作,tuple切片下来也是tuple,字符串切片下来也是字符串

迭代:

给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历被称为迭代(Iteration)。

可迭代的最高变量数:???

Python的迭代与C的迭代不同,Python的迭代不仅可以用于list和tuple等有下标的数据类型,还可以作用于没有下标的类型比如dict等可迭代对象上(

只要是可迭代对象,无论有无下标,都可以迭代)

是否为可迭代数据类型的判定:

>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代

当dict迭代时,因为dict的储存不是按照list的方式排序,所以迭代出来的顺序可能不一样 dict类型有三种迭代方式 直接迭代:只能迭代出key 用 .values() 函数迭代:只能迭代出value 用 .items() 函数迭代:同时迭代出key和values

>>>for k, v in d.items():
……     print( k , v )

Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

>>> for i, value in enumerate(['A', 'B', 'C']):
...     print(i, value)
...
0 A
1 B
2 C

列表生成式:

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

例:如果要生成[1x1, 2x2, 3x3, …, 10x10

如果用循环的话:

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

如果用列表生成式:

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

for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

for循环后可以加入if判断来进行筛选

也可以用多层循环来生成全排列,如:

>>> m = '1234567890'
>>> [a+b+c+d+e for a in m for b in m for c in m for d in m for e in m]
#生成5位数字字典

运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:

>>> import os # 导入os模块,模块的概念后面讲到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']

如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错,此时使用内建的isinstance()函数可以判断一个变量是不是字符串。

生成器:

通过列表生成可以直接创建一个列表,但是受到内存的限制,列表的容量是有限的。Python的生成器可以解决这个问题。生成器与函数不同,函数的唯一入口就是函数的第一行代码,而生成器可以执行完某行代码后退出并且下次从此处再进入。

如果一个生成器具有return的话,一旦执行到函数末尾(return)就会产生一个StopIteration的错误

很多处理无穷序列的时候会用一个while的死循环保证生成器函数永远不会执行到末尾。

关于生成器我自己理解也不是很清楚,所以附上链接 http://blog.csdn.net/cn_wk/article/details/51316934