Python 学习笔记-第12讲:面向对象-列表推导式和生成器

一、推导

    在 python 中,推导是利用函数或表达式按规则生成对象元素的过程。

推导式包括:

1. 列表推导式

        列表推导式是一种快速生成列表的方式。其形式是用方括号括起来的一段语句。

        l = [x * x for x in range(1, 10)]

        等效于:

l = []
for i in range(1, 10):
    lis.append(i*i)

        语法格式:

            [expr for value in collection ifcondition]

# 整除3的数字列表
numbers = [x for x in range(100) if x % 3 == 0]
将csv文件读取为字典列表

我们常常需要读取和处理csv文件的数据。处理csv数据的一个最有用的方法就是把它转换为一个字典列表。

Python

import csv
data = []
for x in csv.DictReader(open('file.csv', 'rU')):
 data.append(x)
1
2
3
4
import csv
data = []
for x in csv.DictReader(open('file.csv', 'rU')):
 data.append(x)
你可以使用列表生成式快速实现:

Python

import csv
data = [ x for x in csv.DictReader(open('file.csv', 'rU'))]
1
2
import csv
data = [ x for x in csv.DictReader(open('file.csv', 'rU'))]
DictReader类将会自动地使用csv文件的第一行作为字典的key属性名。
DictReader类返回一个将会遍历csv文件所有行的对象。这个文件对象通过open()函数产生。
我们提供了open()两个参数–第一个是csv文件名,第二个是模式。
在这例子,‘rU’有两个意思。想往常一样,‘r’表示以读模式打开文件。
‘U’表明我们将会接受通用换行符–‘n’,‘r’和‘rn’。


2. 字典推导式
        使用大括号 {} 替代 [] 可以生成字典推导式。

        语法格式:

{ key_expr: value_expr for value in collection if condition }
示例:        
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print(mcase_frequency)
3. 集合推导式

        集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:

        { expr for value in collection if condition }

        示例:

# 用集合推导建字符串长度的集合
strings = ['a','is','with','if','file','exception']
{len(s) for s in strings} #有长度相同的会只留一个,这在实际上也非常有用


二、生成器
        在 Python 中,使用了 yield 的函数被称为生成器(generator)。
第一种方式:
将列表推导式的[]改为(),就可以获得生成器。

      生成器表达式是一个对象。它执行的计算与列表推导相同,但会迭代生成结果。

        语法:        

(expression for item1 in iterable1 if condition1
            for item2 in iterable2 if condition2
            ...
            for itemN in iterableN if conditionN)


           和列表推导不同,生成器表达式实际上不创建列表或立即对括号内迭代表达式求值。而是创建一个生成器对象,通过迭代该对象以按需生成值。

        generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

第二种方式:
在方法内使用yield来创建生成器

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1

generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

        生成器函数

        一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

生成器的特点
1.语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值
2.自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常
3.状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值