python学习笔记(3) - 高级特性

python学习笔记(三) - 高级特性

一. 切片

切片操作和java中的subList类似,就是获取一个子列表

比如L=['zhangsan','lisi','wangwu'] 那么L[0, 2]表示从索引0开始取,直到索引2(不含2), 正好2个元素。如果第一个索引为0, 还可以省略.

下面我们创建一个0-99的数列: L = range(100)

1. 获取前10个数: L[:10]

2. 获取后10个数: L[-10:]    # 倒数第一个元素的索引是-1

3. 获取前11-20个数: L[10:20]

4. 获取前10个数,每两个取一个: L[:10:2]

5. 所有数中,每5个取一个:L[: : 5]

tuple, 字符串‘xxx’ 或 Unicode字符串u'xxx'也可以使用切片操作


二. 迭代

python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上

1. 迭代dict:

d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
    print key
dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。

默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(), 如果要同时迭代key和value,可以用for k, v in d.itervalues()

2. 判断对象是否可迭代:(通过collections模块的iterable类型判断)

from collections import Iterable
print isinstance('abc', Iterable) # str是否可迭代 (True)
print isinstance([1,2,3], Iterable) # list是否可迭代 (True)  
print isinstance(123, Iterable) # 整数是否可迭代 (False)
3. 迭代索引和元素本身:(通过enumerate函数把list变成索引-元素对)
>>> for i, value in enumerate(['A', 'B', 'C']):
...     print i, value
...
0 A
1 B
2 C

三. 列表生成式

1. 生成列表

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
2. 带条件的列表生成式:(筛选出仅偶数的平方)
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
3. 双层循环生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
4. 多个变量的列表生成式
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> for k, v in d.iteritems():
...     print k, '=', v
... 
y = B
x = A
z = C


四. 生成器

list不是一次性生成,而是在循环的过程中不断推算出后续的元素,这种一边循环一边计算的机制称为生成器。

L = [x * x for x in range(10)] # list  - 中括号
g = (x * x for x in range(10)) # generator  - 小括号

定义generator的另一种方法:

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

generator函数在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

如:定义一个generator,依次返回数字1, 3, 5

def odd():
    print 'step 1'
    yield 1
    print 'step 2'
    yield 3
    print 'step 3'
    yield 5

o = odd()
print o.next()  # step1 1
print o.next()  # step2 2 
print o.next()  # step3 3