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

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

# coding=utf-8
'''
****列表推导*********
用到函数的一个常见的操作是将其用于列表的所有项,并使用结果创建一个新的列表
'''
nums=[1,2,3]
squares=[]
n=11
for 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=1
    b = [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>
10
20
'''

注意:列表推导与生成器表达式之间的差异十分重要,但很微妙。使用列表推导时,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']]

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值