列表推导式和生成器表达式

列表推导

列表推导是构建list的快捷方式,其基本类型即为在生成列表的时候同时调用for循环来生成

symbols = '&*^$$$^'
codes = [ord(symbol) for symbol in symbols]
code
[......]

ord()方法作用是获取Unicode中字符的编码,ASCII编码中仅支持英文和特定的一些字符,并不支持中文,而Unicode编码中支持中文和很多的特殊字符,并且在Unicode编码中,中文和英文字母一样占一个字节
上述代码中 ** ord(symbol) for symbol in symbols ** 即为列表推导式,通过for循环来处理并生成列表

在Python 3代码中列表推导式,生成器表达式以及set,dict推导都有了自己的局部作用域,就如同在函数中的局部变量一样,在Python 3中其局部变量有自己的作用域

笛卡儿积

用列表推导可以生成两个或以上的可迭代类型的笛卡儿积

colors = ['black', 'white']
sizes = ['S', 'M', 'L']
tshirts = [(color,size) for color in colors for size in sizes]

输出tshirts即得到一个以元组为元素的列表,同时也可以用collections.namedtuple来实现一个类的操作

import collection
tshirt = collection.namedtuple('Tshirt',['color','size'])
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
tshirts = [tshirt(color,size) for color in colors for size in sizes]

再输出即得到 Tshirt( color,size)

生成器表达式

生成器表达式并不真正的创建数字列表,而是返回一个生成器对象,此对象在每次计算出一个条目后,把这个条目"产生"(yield)出来。生成器表达式使用了"惰性计算"或称作"延时求值"的机制。
序列过长,并且每次只需要获取一个元素时,应该考虑生成器表达式而不是列表解析。

语法:

(expression for iter_val in iterable)
(expression for iter_val in iterable if cond_expr)

亦可以用生成器表达式来生成元组等

tuple(ord(symbol) for symbol in symbols)
>>> N = (i**2 for i in range(1,11))
>>> print N
<generator object <genexpr> at 0x7fe4fd0e1c30>      #此处返回的是一个生成器的地址
>>> N.next()
1
>>> N.next()
4
>>> N.next()
9
>>> N.next()
16    
>>> N.next()
25
>>> N.next()
36
>>> N.next()
49
>>> N.next()
64
>>> N.next()
81
>>> N.next()
100
>>> N.next()                #所有元素遍历完后,抛出异常
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
StopIteration

用next() 方法可以得到生成器的下一个生成元素

转载于:https://www.cnblogs.com/marcusday/p/10453210.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值