python之推导式

1. 列表推导式

推导式是最常应用迭代协议的环境之一。推导式是另外一种将for循环,if表达式以及赋值语句放在一个单一语句中的一种方法。

举个例子,我们需要将一个输入列表中所有偶数元素除以2生成一个新的序列,通过循环操作,或许可以这么写:

num = [3,6,8,23,17,12,15]
filter_and_divided=[]
for number in num:
    if number %2 ==0:
        filter_and_divided.append(number/2)
print(filter_and_divided)
>>[3.0, 4.0, 6.0]

通过简单的几行代码,两层嵌套循环通过append就可以实现。这事有效的,但可能不是python中优化的“最佳实践”。如果通过使用filter、lambda和filter函数,可能会使的代码更加简洁:

num = [3,6,8,23,17,12,15]
filter_and_divided=map(lambda x:x/2,filter(lambda x:x%2==0,num))
print(list(filter_and_divided))
>>[3.0, 4.0, 6.0]

一般来讲,map会带一个函数,以及一个或者多个的序列参数,然后从序列中去除的并行元素调用函数的结果收集起来。
filter内置函数,对于传入的函数返回True的可迭代对象中的每一项元素,都会返回该项元素。
由于map和filter都是内置方法,因此运行速度相对于for循环要快一些。

如何让代码结构更简洁一些呢?可以尝试使用一下列表推导式:

num = [3,6,8,23,17,12,15]
filter_and_divided=[x/2 for x in num if x%2 == 0]
print(filter_and_divided)

列表推导式通常包括如下及部分:
- 一个输入列表
- 一个标识输入列表成员的变量
- 一个可选的判断表达式
- 一个将输入序列中满足判断表达式的成员转化为预期输出的输出表达式

这里写图片描述

执行:
- 列表内容迭代器遍历输入列表num的每一个成员x
- 判断表达式判断每一个成员x是否为偶数
- 如果成员x为偶数,则输入到输出表达数中进行除2操作,最终作为输出列表中的元素

列表推导式使用一个输入迭代表达式,一个可选的判断表达式以及一个输出表达式,将所有操作封装到列表中。

显然通过列表表达式相对要简洁一些,但是对于多层嵌套的时候就会稍微有点晦涩。另外,列表推导式也存在一些不足,对于数据量较大的场景中,需要将所有的数据一次性都加在到内存中,当数据量足够大时就会导致系统的内存不足。

2. 生成器推导式

相对于列表推导式立即产生结果,内存消耗较大的现象。python提供一种延迟机制,即在使用的时候才产生结果的迭代器推导式,迭代器推导式并非立即返回输出结果,而是返回一个迭代器对象。一方面节省内存空间,另外一方面将执行的时间分散到每一次的结果请求中。

num = [3,6,8,23,17,12,15]
filter_and_divided=(x/2 for x in num if x%2 == 0)
print(type(filter_and_divided))
for data in filter_and_divided:
    print(data)
>> <class 'generator'>
>>3.0
>>4.0
>>6.0

从语法结构来看,列表推导式和生成器推导式的语法几乎一样,仅仅是列表表达式为”[]”,而生成器表达式为“()”。从执行结果来看,列表推导式直接返回了预期的结果,而生成器推导式为一个“generator ”对象,因此我们需要对”generator “进行遍历来获取结果。而每一次的遍历都是依次从num列表中取一个元素成员,在判断表达式中进行判断,对于满足条件的执行输出表达式,输入结果。

3. 总结

基于对python中的运行,map调用要比同等的for循环要快2倍,而列表推导式往往比map调用还要稍微快一些。这是由于map和推导式在解释器中以C语言的速度执行的,比在PVM中执行的for循环代码要快的多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值