Python实用技法第18篇:同时对数据作转换和换算

上一篇文章: Python实用技法第17篇:将名称映射到序列的元素中
下一篇文章: Python实用技法第19篇:将多个映射合并为单个映射

一、需求🙀

咱们须要调用一个换算函数(例如sum()、min()、max()),但首先得对数据作转换或者筛选

二、解决方案😸

有一种很是优雅地方案可以将数据换算和转换结合在一块儿:在函数参数中使用生成器表达式。segmentfault

实例1:计算平方和:

nums=[1,2,3]
s=sum(x*x for x in nums)
print(s)

结果:数据结构

14

实例2:判断指定目录是否存在.py文件

import os
filename=os.path.dirname(os.path.abspath(__file__))
files1=os.listdir(filename+"/image")
files2=os.listdir(filename)
#any表示该iterable只要存在一个知足条件的,就返回True,不然才返回False
if any(name.endswith('.py') for name in files1):
    print('存在py文件')
else:
    print('不存在py文件')



#any表示该iterable只要存在一个知足条件的,欧返回True,不然才返回False
if any(name.endswith('.py') for name in files2):
    print('存在py文件')
else:
    print('不存在py文件')

运行结果:函数

不存在py文件
存在py文件

实例3:根据字典某个key取最小值

marks=[
    {'age':18,'money':100},
    {'age':19,'money':500},
    {'age':17,'money':900},
    {'age':20,'money':1000},
]
min_mark=min(m['age'] for m in marks)
print(min_mark)

结果:spa

17

三、分析😈

这种解决方案展现了当把生成器表达式做为函数的单独参数时在语法上的一些微妙之处(即:没必要重复使用符号)。例以下面两行代码表示的是同一个意思:code

s=sum((x*x for x in nums))
s=sum(x*x for x in nums)

比起首先建立一个临时例表,使用生成器作参数一般是更为高效和优雅地方式。例如,若是不使用生成器表达式,能够考虑下面方法来计算平法和:内存

nums=[1,2,3]
s=sum([x*x for x in nums])
print(s)

这也能工做,但这引入了一个额外的步骤而且建立了额外的列表。对于小的一个列表。是可有可无,可是若是nums很是巨大,那么就会建立一个庞大的临时数据结构,并且只用一次就被丢弃。get

基于生成器的解决方案能够以迭代的方式转换数据,所以在内存使用上要高效得多。it

某些特定的换算函数好比:min()和max()均可以接受一个key参数,当可能倾向于使用生成器时会颇有帮助。例如在上面实例【根据字典某个key取最小值】时能够考虑下面的替代方案:import

min_mark=min(marks,key=lambda m:m['age'])
上一篇文章: Python实用技法第17篇:将名称映射到序列的元素中
下一篇文章: Python实用技法第19篇:将多个映射合并为单个映射
相关文章
相关标签/搜索