Python中的切片、迭代、迭代器与相关函数
1、切片
使用切片常常可以以一行代码替代普通的循环。
Python中可以对序列切片,序列是指:元组、列表、字符串,这里以列表为例。
>>> L=list(range(100))
>>> L[0:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> L[:5]
[0, 1, 2, 3, 4]
>>> L[95:]
[95, 96, 97, 98, 99]
>>> L[-10]
90
>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> L[-10:-1]
[90, 91, 92, 93, 94, 95, 96, 97, 98]
>>> L[:10:2]
[0, 2, 4, 6, 8]
注意,表示切片的[]可以接在任何序列后面(例如变量、常量或函数)。
2、迭代
使用迭代而不是普通循环可以提高性能。
判断对象是否可迭代:
>>> from collections import Iterable
>>> isinstance('abc', Iterable)
True
迭代的例子:
>>> for x,y in [(1,1),(2,4),(3,9)]:
... print(x,y)
...
(1, 1)
(2, 4)
(3, 9)
3、列表生成式
使用列表生成式可以以更少的代码生成所需的列表。
生成1到10这些数字中偶数的平方的列表:
>>> [x*x for x in range(1,11) if x % 2 ==0]
[4, 16, 36, 64, 100]
4、迭代器
判断是否是迭代器(与可迭代的概念不同):
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
5、map与reduce
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,返回计算结果。
>>> from functools import reduce
>>> def add(x, y):
... return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
6、filter
>>> def is_odd(n):
... return n%2 ==1
...
>>> list(filter(is_odd,[1,2,4,5,6,9,10,15]))
[1, 5, 9, 15]
7、sorted
sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
key指定的函数将作用于list的每一个元素上
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']