zoukankan      html  css  js  c++  java
  • 【python cookbook】【数据结构与算法】19.同时对数据做转换和换算

    问题:我们需要调用一个换算函数(例如sum()、min()、max()),但是首先需对数据做转换或者筛选处理

    解决方案:非常优雅的方法---在函数参数中使用生成器表达式

    例如:

    # 计算平方和
    nums=[1,2,3,4,5]
    s1=sum((x*x for x in nums))
    s2=sum(x*x for x in nums)  #更优雅的用法
    s3=sum([x*x for x in nums])  #不使用生成器表达式
    print(s1)
    print(s2)
    print(s3)
    
    # 判断一个目录下是否存在.py文件
    import os
    files = os.listdir(os.path.expanduser('~'))
    print (files)
    if any(name.endswith('.py') for name in files):
        print('There be python!')
    else:
        print('Sorry, no python.')
    
    # Output a tuple as CSV
    s = ('ACME', 50, 123.45)
    print(','.join(str(x) for x in s))
    
    # Data reduction across fields of a data structure
    portfolio = [
       {'name':'GOOG', 'shares': 50},
       {'name':'YHOO', 'shares': 75},
       {'name':'AOL', 'shares': 20},
       {'name':'SCOX', 'shares': 65}
    ]
    min_shares = min(s['shares'] for s in portfolio)
    print(min_shares)
    
    min_shares2 = min(portfolio,key=lambda s:s['shares']) #使用生成器表达式
    print(min_shares2)
    >>> ================================ RESTART ================================
    >>> 
    55
    55
    55
    ['.idlerc', '.oracle_jre_usage', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Favorites', 'HelloWorld', 'HelloWorld.zip', 'Links', 'Local Settings', 'log.html', 'Music', 'My Documents', 'mysite', 'mysite.zip', 'NetHood', 'NTUSER.DAT', 'ntuser.dat.LOG1', 'ntuser.dat.LOG2', 'NTUSER.DAT{6cced2f1-6e01-11de-8bed-001e0bcd1824}.TM.blf', 'NTUSER.DAT{6cced2f1-6e01-11de-8bed-001e0bcd1824}.TMContainer00000000000000000001.regtrans-ms', 'NTUSER.DAT{6cced2f1-6e01-11de-8bed-001e0bcd1824}.TMContainer00000000000000000002.regtrans-ms', 'ntuser.ini', 'output.xml', 'Pictures', 'pip', 'PrintHood', 'Recent', 'report.html', 'Saved Games', 'Searches', 'SendTo', 'Templates', 'Videos', '「开始」菜单']
    Sorry, no python.
    ACME,50,123.45
    20
    {'shares': 20, 'name': 'AOL'}
    >>> 

    总结:

    该方案展示了当把生成器表达式作为函数的参数时在语法上的一些微妙之处(即,不必重复使用圆括号),比如,如下的两行代码表示的是同一个意思:

    s=sum((x*x for x in nums))
    s=sum(x*x for x in nums)  #更优雅的用法
    s3=sum([x*x for x in nums])  #不使用生成器表达式

    比起首先创建一个临时列表,使用生成器做参数更为高效和优雅。

  • 相关阅读:
    内存分配小问题
    从MACHINE_START开始
    Linux驱动学习(二)
    9,斐波那契数列 6,旋转数组找最小 8青蛙跳台阶 JAVA实现
    数组练习题
    类的练习
    for循环练习题
    封装练习题
    Facebook成为Apache基金会的白金赞助商
    Visual Studio 2010
  • 原文地址:https://www.cnblogs.com/apple2016/p/5751209.html
Copyright © 2011-2022 走看看