代理迭代

  a = [1, 2, 3]
for i in iter(a):
print(i)
for i in a.__iter__():
print(i)

这里的两个方法是一样的,调用iter()其实就是简单的调用了对象的__iter__()方法。

使用生成器创建新的迭代器

  def frange(start, stop, increment):
x = start
while x < stop:
yield x
x += increment
for n in frange(0, 4, 0.5):
print(n)
print(list(frange(0, 4, 0.5)))

看下面这个

>>> def countdown (n):
... print ('Starting to count from', n)
... while n > 0:
... yield n
... n -= 1
... print ('Done!')
...
>>> # Create the generator, notice no output appears
>>> c = countdown(3)
>>> c
<generator object countdown at 0x1006a0af0>>>> next(c)
Starting to count from 3
3>>> next(c)
2>>> next(c)
1>>> next(c)
Done!
Traceback (most recent call last):
File "<stdin>", line 1, in < module >
StopIteration

一个生成器函数主要特征是它只会回应在迭代中使用到的 next 操作。 一旦生成器函数返回退出,迭代终止。我们在迭代中通常使用的for语句会自动处理这些细节,所以你无需担心。

  def frange(start, stop, increment):
x = start
while x < stop:
yield x
x += increment
for n in frange(, , 0.5):
print(n)
print(list(frange(, , 0.5)))

反向迭代

  a = [1, 2, 3, 4]
for x in reversed(a):
print(x, end=' ')

主要想说的是,对象重写__reversed__()方法即可调用reversed()进行反向迭代

itertools的一些使用

  def count(n):
while True:
yield n
n += 1
c = count(0)
import itertools
for x in itertools.islice(c, 10, 20):
print(x, end=" ") with open('test.txt') as f:
for line in f:
print(line, end='')
print(format('开始部分的注释不显示', '*>30'))
with open('test.txt') as f:
for line in itertools.dropwhile(lambda line: line.startswith('#'), f):
print(line, end='') items = ['a', 'b', 'c']
#items的所有可能组合,不包含相同元素
for p in itertools.permutations(items):
print(p, end=' ')
print()
#指定长度的所有排序
for p in itertools.permutations(items, 2):
print(p, end=' ')

如果遇到一些复杂的迭代器的使用,可以先看看itertools里有没有可用的方法。

同时迭代多个序列

  a = [1, 2, 3]
b = ['w', 'x', 'y', 'z']
for i in zip(a,b):
print(i)
输出:
(1, 'w')
(2, 'x')
(3, 'y')
for i in itertools.zip_longest(a, b):
print(i)
输出:
(1, 'w')
(2, 'x')
(3, 'y')
(None, 'z')

不同序列上的迭代

  import itertools
a = [1, 2, 3, 4]
b = ['x', 'y', 'z']
for x in itertools.chain(a, b):
print(x)

这样比 a + b 在进行迭代要好很多

展开嵌套的序列

  from collections import Iterable
def flattern(items, ignore_types=(str, bytes)):
for x in items:
if isinstance(x, Iterable) and not isinstance(x, ignore_types):
yield from flattern(x)
else:
yield x
items = [1, 2, [3, 4, [5, 'hello world'], 7], 8]
for x in flattern(items):
print(x, end=' ')

def count(n):    while True:      yield n      n += 1  c = count(0)  import itertools  for x in itertools.islice(c, 10, 20):    print(x, end=" ")      with open('test.txt') as f:    for line in f:      print(line, end='')  print(format('开始部分的注释不显示', '*>30'))  with open('test.txt') as f:    for line in itertools.dropwhile(lambda line: line.startswith('#'), f):      print(line, end='')        items = ['a', 'b', 'c']  #items的所有可能组合,不包含相同元素  for p in itertools.permutations(items):    print(p, end=' ')  print()  #指定长度的所有排序  for p in itertools.permutations(items, 2):    print(p, end=' ')

python cookbook 迭代器与生成器的更多相关文章

  1. python基础—迭代器、生成器

    python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...

  2. python之迭代器与生成器

    python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...

  3. Python之迭代器和生成器

    Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...

  4. 【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  5. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  6. Python之迭代器,生成器

    迭代器 1.什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. from collections import Iterable l = [1,2,3,4] t ...

  7. python之迭代器、生成器与面向过程编程

    目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...

  8. day13 python学习 迭代器,生成器

    1.可迭代:当我们打印 print(dir([1,2]))   在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...

  9. Python之迭代器及生成器

    一. 迭代器 1.1 什么是可迭代对象 字符串.列表.元组.字典.集合 都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? from collections import Itera ...

随机推荐

  1. 关于解决 http 状态码200,php 文件有输出,但是不显示模板文件的问题

    一 问题 给公司搭建一个在线测试站点之后,在浏览器地址栏输入 "http://xxx.xxx.xxx/index.php",页面什么都没显示.调出浏览器的开发者工具查看,http ...

  2. 使用ALAssetsLibrary读取所有照片

    一. ALAssetsLibrary 介绍 ALAssetsLibrary 提供了访问iOS设备下”照片”应用下所有照片和视频的接口: 从 ALAssetsLibrary 中可读取所有的相册数据,即  ...

  3. 给UITextField设置头或尾空白

    有时候,我们需要在UITextField的头尾加入一些空白,如下图所示: 其中,黄色和红色部分代表空白. 实现起来,比较简单,只需要设置UITextField的leftView.leftViewMod ...

  4. PHP面试题及答案解析(1)—PHP语法基础

    1. strlen( )与 mb_strlen( )的作用分别是什么? strlen和mb_strlen都是用于获取字符串长度.strlen只针对单字节编码字符,也就是说它计算的是字符串的总字节数.如 ...

  5. vim 基本常用设置

    1. :set number   设置行号 2. :set relativenumber 设置相对行号 3. :set hlsearch 设置搜索高亮 4. :set noh       关闭搜索高亮 ...

  6. [转] 查看HDFS文件系统数据的三种方法

    1.使用插件——Hadoop-Eclipse-Plugin此方法需要借助Eclipse,插件的安装及使用请参考博文使用Eclipse编译运行MapReduce程序_Hadoop2.6.0_Ubuntu ...

  7. macbook 下SDK Manager 的更新[即使Google被屏蔽了也无所谓]

    废话少说,直接说操作步骤: 1. 改动/etc/hosts文件: 右键单击Finder,选择前往目录,输入/private/etc/,敲回车键.将文件/etc/hosts复制到桌面(由于权限受限.无法 ...

  8. 匿名函数块级作用域以及在JQuery中的应用

    最近经常回在群里面看到有些朋友问如下这样的js写法该如何理解的的问题,虽然可能对匿名函数有些理解,但是有时候看到JQuery源码或者其他JS库中同样的写法时,就有点不理解了,今天再次分享下这方面的知识 ...

  9. 好员工去哪儿了:高端IT白领荒胜过春节保姆荒

    来自:http://tech.163.com/14/0312/07/9N4BLV8S000915BD.html 于是,你看到的就是这样一幕悖论:一群手握大把工作机会的雇主,在面对一群眼巴巴等待工作机会 ...

  10. Visual Studio的 Apache Cordova 插件CTP3.0发布!

    北京时间12号晚23点开始的Connect()活动上,微软发布了一系列激动人心的消息! .NET开源了!以后.NET将可在Linux和Mac OS平台上运行! VS免费了!!如果你是学生,个人开发者, ...