有些人致力于把python代码写的更好,一来更符合规范且容易阅读,二来使代码在执行效率上也更有效率。那接下来针对针对迭代介绍一下:
一.并行迭代
这是在python中最常见,大家经常应该遇到的一种并行迭代,下面针对并行迭代就直接上代码了。
>>> name = ['lucy','lisi','zhangsan','tom']
>>> age = [23,54,42,31]
>>> for names,ages in zip(name,age):
... print(names,'is',ages,'years old')
...
lucy is 23 years old
lisi is 54 years old
zhangsan is 42 years old
tom is 31 years old
内建的zip函数可以用来进行并行迭代,可以把2个序列压缩在一起,然后返回一个元组的列表。关于它很重要的一点是zip可以处理不等长的序列。
二.按索引迭代
有些时候需要迭代访问序列中的对象,同时还要获取当前对象的索引,可以使用内键的enumerate函数。具体实例如下:
strings=['censorted','wsxxxqw']
>>> for index,string in enumerate(strings):
... if 'xxx' in string:
... strings[index]='[censorted]'
... print(index,string)
...
0 censorted
1 wsxxxqw
三.反转与排序迭代
其中2个有用的函数:reversed和sorted
>>> sorted([67,12,5,-23])
[-23, 5, 12, 67]
>>> list(reversed('hello,word'))
['d', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'h']
四.迭代工具itertools库
这个库增加有很多的功能,开发效率有自己决定的,能不能提高效率,看个人而言。
首先使用此库的时候用引入:
import itertool
1.累加
x = itertools.accumulate(range(10))
print(list(x))
2.连接多个列表或者迭代器
y = itertools.chain([5,7,12],range(3),[45,32,2])
print(list(y))
3.求列表或者生成器中指定数目的元素不重复的所有组合
>>> x = itertools.combinations(range(4),3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]
4.允许重复元素的组合
>>> x = itertools.combinations_with_replacement('ABC',3)
>>> print(list(x))
[('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'A', 'C'), ('A', 'B', 'B'), ('A', 'B', 'C'), ('A', 'C', 'C'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'C', 'C'), ('C', 'C', 'C')]
5.计数器,指定起始位置和步长
>>> x = itertools.count(start=20,step=-1)
>>> print(list(itertools.islice(x,0,10,1)))
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11]
- 循环指定的列表和迭代器
>>> x= itertools.cycle('ABC')
>>> print(list(itertools.islice(x,0,10,1)))
['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A']
7.按照真值函数丢弃掉列表和迭代器前面的元素
>>> x = itertools.dropwhile(lambda e:e < 5,range(10))
>>> print(list(x))
[5, 6, 7, 8, 9]
8 保留对应真值为False的元素
x = itertools.filterfalse(lambda e:e<5,(1,5,3,6,9,4))
print(list(x))
9.按照分组函数的值对元素进行分组
>>> x = itertools.groupby(range(10),lambda x:x<5 or x > 8)
>>> for c,n in x:
... print(c,list(n))
...
True [0, 1, 2, 3, 4]
False [5, 6, 7, 8]
True [9]
10.上下文使用过的函数,对迭代器进行分片
>>> x = itertools.islice(range(10),0,9,2)
>>> print(list(x))
[0, 2, 4, 6, 8]
11.产生指定数目的元素的所有排序(与顺序有关)
>>> x = itertools.permutations(range(4),3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 3), (0, 3, 1), (0, 3, 2), (1, 0, 2), (1, 0, 3), (1, 2, 0), (1, 2, 3), (1, 3, 0), (1, 3, 2), (2, 0, 1), (2, 0, 3), (2, 1, 0), (2, 1, 3), (2, 3, 0), (2, 3, 1), (3, 0, 1), (3, 0, 2), (3, 1, 0), (3, 1, 2), (3, 2, 0), (3, 2, 1)]
12 .产生多个列表和迭代器的(积)
>>> x = itertools.product('ABC',range(3))
>>> print(list(x))
[('A', 0), ('A', 1), ('A', 2), ('B', 0), ('B', 1), ('B', 2), ('C', 0), ('C', 1), ('C', 2)]
13 简单的生成一个拥有指定数目元素的迭代器
>>> x = itertools.repeat(0,5)
>>> print(list(x))
[0, 0, 0, 0, 0]
14 类似map
>>> x = itertools.starmap(str.islower,'AbcDerTY')
>>> print(list(x))
[False, True, True, False, True, True, False, False]
16 与dropwhile相反,保留元素直至真值函数值为假
>>> x = itertools.takewhile(lambda e:e<5,range(10))
>>> print(list(x))
[0, 1, 2, 3, 4]
16 生成指定数目的迭代器
>>> x = itertools.tee(range(6),2)
>>> for i in x:
... print(list(i))
...
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5]
17 类似于zip,不过较长的列表和迭代器的长度为准
>>> x = itertools.zip_longest(range(3),range(5))
>>> y = zip(range(3),range(5))
>>> print(list(x),list(y))
[(0, 0), (1, 1), (2, 2), (None, 3), (None, 4)] [(0, 0), (1, 1), (2, 2)]