学习7: 列表生成式,生成器,迭代器,可迭代对象

1) 列表生成式,即创建列表的方式

列表生成式,这里是中括号[]

>>> [x*x for x in range(0,10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
>>> [m + n for m in ‘ABC‘ for n in ‘XYZ‘]
[‘AX‘, ‘AY‘, ‘AZ‘, ‘BX‘, ‘BY‘, ‘BZ‘, ‘CX‘, ‘CY‘, ‘CZ‘]
>>> 

2) 生成器(Generator)
生成器有两种方法:第一个是通过生成器表达式来创建,另外一种是通过定义带有yield的函数来实现。

生成器, 这里是小括号()

>>> (x*x for x in range(0,10))
<generator object <genexpr> at 0x0000000000C15240>
>>> 

说明:从这个可以看出生成器和列表生成的区别:列表生成式直接返回了表达式的结果列表, 而生成器是一个对象,该对象包含了对表达式结果的计算引用。
前者如果数据量太大时候会占用很大内存,而生成器保存的只是一个计算对象,不会占用很大内存。

如果上述算法比较复杂,不好写在一个(),那么可以使用定义一个包含yield的函数来实现,这个就是第二种实现方法。
如果一个函数定义中包含了yield关键字,这个函数就不再是普通函数,而是一个generator object。
要想调用这个函数,需要使用next()函数,并且遇到yield语句返回(可以把yield理解为return)。例如:

def test():
    print "one"
    yield
    print "two"
    yield
    print ‘three‘
    yield
t=test()
t.next()
t.next()

输出结果为:
one
two
[Finished in 0.2s]

说明:首先创建生成器对象实例t,然后通过next方法调用函数,每一次执行到yield语句会被终止,并在下次该实例再次执行next方法时候继续执行。所以第一个next方法打印one,第二个next打印two.
test().next()
test().next()
输出结果为:
one
one
[Finished in 0.2s]
说明:注意必须是同一个实例不断调用next方法,如上这种调用方法达不到想要的效果。

def test():
    print "one"
    yield
    print "two"
    return
    print "testing"
    yield
    print ‘three‘
    yield
t= test()
t.next()
t.next()

说明:如果生成器中有return,在执行过程中 return,则直接抛出 StopIteration 终止迭代。

def readfile(file_name):
    seek_option=0
    while True:
        with open(file_name) as f:
            f.seek(seek_option)
            data = f.readline()
            if data:
                yield data
                seek_option = f.tell()
            else:
                return
print readfile(‘README.md‘)
file = readfile(‘README.md‘)
for data in file:
    print data
for data in readfile(‘README.md‘):
    print data

说明: 上述定义了一个读取文件的生成器。生成器一般可以和for循环配合使用,这样可以迭代生成器元素,而不使用next方法。

3)迭代器(Iterators)
任何具有__next__()方法的对象都是迭代器。
所以生成器是一种特殊的迭代器,任意一个生成器都属于迭代器。

4)可迭代对象
可迭代对象可以为任意对象,不一定非得是基本数据结构,只要这个对象可以返回一个iterator。
可迭代对象通过iter函数可以转化为迭代器,如下例a是一个可迭代对象,而b是一个迭代器。
实际在for循环的过程中也都是将可迭代对象首先转化成迭代器,然后通过next方法读取元素直到抛出异常。

>>> a=[1,2,3,4]
>>> b=iter(a)
>>> type(a)
<type ‘list‘>
>>> type(b)
<type ‘listiterator‘>
>>> b.next()
1
>>> b.next()
2
>>> 
时间: 2024-08-06 02:57:31

学习7: 列表生成式,生成器,迭代器,可迭代对象的相关文章

python列表生成式&amp;生成器&amp;迭代器

一.列表生成式 什么是列表生成式? 列表生成式是快速生成列表的一种方式.(貌似有些废话) 更专业点的说法:列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 在python2.7里 举个例子,要生成list [1,2,3,4,5],可以用range(1,6) >>> range(1,6) [1, 2, 3, 4, 5] 但是如果要生成[1x1,2x2,3x3,4x4,5x5]怎么做呢? 普通青年做法: >>&

5.1.24 Python之列表生成式、生成器、可迭代对象与迭代器

语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterable.Iterator与Generator之间的关系 一.语法糖的概念 "语法糖",从字面上看应该是一种语法."糖",可以理解为简单.简洁.其实我们也已经意识到,没有这些被称为"语法糖"的语法,我们也能实现相应的功能,而 "语法糖"使我们可以更加简洁.快速的实现这些功能. 只是Python解释器会把这

python-基础 生成式 生成器 迭代器 JSON pickl

目录 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 列表生成式,是Python内置的一种极其强大的生成list的表达式. 现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现? 1 >>> a 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 3 >>> b =

迭代器/可迭代对象/生成器

先上本文主题: 迭代器一定是可迭代对象,可迭代对象不一定是迭代器; 可迭代对象要满足什么条件才能使用 for 正确遍历; 生成器一定是迭代器. 如何判断是否是迭代器/可迭代对象 from collections.abc import Iterator,Iterable t = [] # 是否为迭代器 isinstance(t,Iterator) # 是否为可迭代对象 isinstance(t,Iterable) 可迭代对象 实现了__iter__魔法方法,就是可迭代对象. class Test:

列表生成式,迭代器&amp;生成器

一.列表生成式 用例--使列表数值都加上1 1 li = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 li_tmp = [i+1 for i in li] 3 li = li_tmp 4 print("new list:"+str(li)) #[1, 2, 3, 4, 5, 6, 7, 8, 9,10] li_dic =  [{1:3+i,2:4+i} for i in range(5)] #[{1: 3, 2: 4}, {1: 4, 2: 5}, {1: 5,

python学习笔记——列表生成式与生成器

1.列表生成式(List Comprehensions) python中,列表生成式是用来创建列表的,相较于用循环实现更为简洁.举个例子,生成[1*1, 2*2, ... , 10*10],循环用三行: 1 L = [] 2 for i in range(1,11): 3 L.append(i*i) 列表生成式只用一行,前面是生成规则,后面是初始元素,最后还可以加上判断条件: 1 [i*i for i in range(1, 11)] 列表生成式还可以实现多层循环,以及判断,刚刚的栗子再写复杂一

17. Python 生成式 &nbsp; 生成器 &nbsp; 迭代器

1.      生成式和生成器 列表生成式是python受欢迎的一种语法之一,通过一句简洁的语法,就能对元组元素进行过滤,还可以对得到的元素进行转换处理. 语法格式: [exp for val in collection if condition] 相当于 result = [] for val in collection: if (condition): result.append(exp) 例子: a = [x*x for x in xrange(10) if x%2 == 0] print

s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法

python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf-8_*_ 或者将字符串单独声明: a = "中文".encode("utf-8") 函数式编程 函数式编程中的函数指代的是数学中的函数. 函数式编程输入如果确定,则输出一定是确定的.函数中并没有很多逻辑运算 python是一个面向对象的语言,只是一部分支持函数式编程.

python之迭代器、生成器、可迭代对象

迭代器 iterator 迭代,即一些事要重复好多次,就像在循环中做的那样. 一个对象是否可迭代,全都取决于这个对象是否有__iter__方法,只要该对象实现了__iter__方法,调用对象的__iter__方法,就回返回一个迭代器,这个迭代器一定具有next方法(调用这个方法时不需要任何参数),在调用这个迭代器的next方法时,迭代器就回返回它的下一个值,当迭代器中没有值可以返回了,就回抛出一个名为StopIteration的异常,停止迭代. 准确的说,一个实现了__iter__方法的对象是可