Python 迭代器

   有些人致力于把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]
  1. 循环指定的列表和迭代器
>>> 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)]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值