欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-28 14:23:50
...
一、推导

    在 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语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行

相关标签: Python 学习