900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Python 列表推导 生成器表达式与声明式编程

Python 列表推导 生成器表达式与声明式编程

时间:2024-05-17 19:23:16

相关推荐

Python 列表推导  生成器表达式与声明式编程

1、****列表推导*********

用到函数的一个常见的操作是将其用于列表的所有项,并使用结果创建一个新的列表。例如:

# coding=utf-8'''****列表推导*********用到函数的一个常见的操作是将其用于列表的所有项,并使用结果创建一个新的列表'''nums=[1,2,3]squares=[]n=11for n in nums:squares.append(n*n)print(squares,n)'''[1, 4, 9] 3'''n=10 squares_2=[n*n for n in nums] #列表推导新建命名空间,n为局部变量print(squares,n)'''[1, 4, 9] 10'''

注意:在类中采用列表推导时,因为类定义的局部作用域与列表推导式的局部作用域于不是嵌套函数关系,所以并不能构成Enclosing作用域关系。因此它们是两个独立的局部作用域,不能相互访问。例如:

class Test(object):a=1b = [a + i for i in range(10)]print(b) def __init__(self):pass#ob_test=Test()b = [a + i for i in range(10)]NameError: name 'a' is not defined因为类定义的局部作用域与列表推导式的局部作用域于不是嵌套函数关系,所以并不能构成Enclosing作用域关系。因此它们是两个独立的局部作用域,不能相互访问

2、*****生成器表达式*************

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

'''*****生成器表达式*************生成器表达式是一个对象,它执行的计算同与列表推导相同,但会迭代地生成结果'''a=[1,2,3]b=(10*i for i in a)print(b)print(b.__next__())print(b.__next__())'''<generator object <genexpr> at 0x0000000002366938>1020'''

注意:列表推导与生成器表达式之间的差异十分重要,但很微妙。使用列表推导时,Python实际上创建了包含结果数据的列表。而使用生成器表达式时,Python创建的是只知道如何按照需要生成数据的生成器。在某些应用中,这可能极大地提高性能和内存使用效率。例如:

f=open("try.py",'r', encoding='UTF-8')lines=(t.strip() for t in f) #读取行,并删除前后空白comments=(t for t in lines if len(t)>0 and t[0]=='#')for c in comments:print(c)'''# coding=utf-8#4#nums.sort(key=DistanceFrom(5))#[6, 4, 7, 3, 1]'''

在这个例子中,生成器表达式提取各行并删除其中的空白,但它实际上没有将整个文件读取到内存中。提取注释的表达式也是如此。直到程序在for循环中进行迭代时,才去读取文件的各行。在这个迭代过程中,每一行都是按需生成的,按条件进行了过滤。事实上,该过程从未把整个文件加载到内存中。因此,这是一种从GB级别大小的Python源文件中提取注释的高效方法。

3、*****声明式编程*************

主要的编程范式有三种:命令式编程,函数式编程和声明式编程。

命令式编程:以计算机执行步骤为中心How to do it?

函数式编程:以函数为中心,Python的闭包、装饰器、生成器、协程、lambda(创建匿名函数)极大提升了函数式编程能力

声明式编程:以明确的逻辑语义为中心What to do?

列表推导和生成器表达式的声明式还可以用于模拟数据库处理中常见的SQL select语句的行为,例如:

fields=(line.split() for line in open("E:\python\data\stock_entrust.txt",'r'))portfolio=[{'name':f[0],'shares':int(f[1]),'price':float(f[2])}for f in fields]msft=[s for s in portfolio if s['name'='MSFT']]

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。