zoukankan      html  css  js  c++  java
  • [PY3]——对iterator的处理(解析式、map、reduce、filter)

    引言

    对iterator一般可以用for in方法处理,但有时可以借助更高效、也更易读的方式去处理。

    例如解析式(包括列表解析式、生成器解析式、集合解析式、字典解析式),

    例如map( )、reduce( )函数可以对iterator中的单个对象进行个别处理或迭代处理。

    列表解析式

    # 列表解析 [expr for item in iterator]
    
    #
    列表解析返回的是列表,内容是表达式执行的结果 # expr=variable print([x for x in range(10)]) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # expr=function def inc(x): return x+1 print([inc(x) for x in range(10)]) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # expr=expression print([(x+1)**2 for x in range(10)]) [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    # if判断 [expr for item in iterator if cond] / [expr for item in iterator if cond1 if cond2] print([x for x in range(10) if x%2==0]) [0, 2, 4, 6, 8] print([x for x in range(10) if x%2==0 if x>4]) [6, 8] print([(x,y) for x in range(10) if x%2==0 for y in range(10) if y>=8]) [(0, 8), (0, 9), (2, 8), (2, 9), (4, 8), (4, 9), (6, 8), (6, 9), (8, 8), (8, 9)] # for x in iterator:
    for y in iterator:

    retrun (x,y)
    print([(x,y) for x in range(1,3) for y in range(0,2)]) [(1, 0), (1, 1), (2, 0), (2, 1)] # 列表解析用于对可迭代对象做过滤和转换 print([(x+1,x+2) for x in range(5)]) [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)] print([{x:x+1} for x in range(5)]) [{0: 1}, {1: 2}, {2: 3}, {3: 4}, {4: 5}]

    生成器解析

    # 生成器解析式按需计算的,又叫做延迟计算或惰性求值
    
    def inc(x):
        return "inc {}".format(x)
    
    # 和列表解析不同的是,生成器解析的返回结果是一个generator,需要当成生成器去使用
    print((inc(x) for x in range(10)))
    <generator object <genexpr> at 0x7f7ef2b0d9e8>
    
    print([inc(x) for x in range(3)])
    ['inc 0', 'inc 1', 'inc 2']
    
    g=(inc(x) for x in range(10))
    print(next(g))
    inc 0
    print(next(g))
    inc 1
    
    # 生成式解析中各种if和for语句都一并适用
    g=(inc(x) for x in range(10) if x%2==0 and x!=4)
    print(next(g))
    inc 0
    print(next(g))
    inc 2
    print(next(g))
    inc 6

    集合解析

    # 集合解析的返回结果是集合
    print({x for x in range(10) if x%2!=0})
    {1, 3, 5, 9, 7}
    
    # 所以结果依旧会满足集合的一切特性
    print({x for x in [2,3,6,2,3,6]})
    {2, 3, 6}

    字典解析

    # 字典解析也是使用大括号包围,并且需要两个表达式,一个生成key,一个生成value
    # 两个表达式之间使用冒号分割,返回结果是字典
    print({str(x):x for x in range(5)})
    {'2': 2, '0': 0, '4': 4, '1': 1, '3': 3}
    
    print(type({str(x):x for x in range(5)}))
    <class 'dict'>

    map()

    # map(func, *iterables) --> map object
    
    #
    map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素 # python3中,直接map的返回值是map对象,如果想输出可以list(map()) def f(x): return x*x print(map(f,[1,2,3,4,5])) <map object at 0x7ffe619a00f0> print(list(map(f,[1,2,3,4,5]))) [1, 4, 9, 16, 25] # func可以是任意复杂的函数 print(list(map(str,[1,2,3,4,5]))) ['1', '2', '3', '4', '5']

    functools.reduce()

    # reduce(function, sequence[, initial]) -> value
    
    #
    reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算 # 即reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    #
    python3中,reduce()已从全局名字空间中移出了,被放置在fucntools模块里 from functools import reduce def add(x,y): return x+y print(reduce(add,range(10))) 45 #把一个序列[1,3,5,7,9]变成int(13579) def fn(x,y): return x*10+y print(reduce(fn,[1,3,5,7,9])) 13579 print(type(reduce(fn,[1,3,5,7,9]))) <class 'int'>
    # initial存在,可以在前面加上设置的string
    import functools
    resourceConfigFiles=[
        "server.properties.jinja2",
        "net.properties.jinja2",
    ]
    binConfigFiles = ['socket.jinja2']
    jadeConfigFiles = ['ja.cfg.jinja2']
    
    excludeproperties = functools.reduce(
        lambda x, y: '%s --exclude="%s"' %(x, y.rstrip('.jinja2')),
        resourceConfigFiles + jadeConfigFiles + binConfigFiles,
        "--test")
    
    print(excludeproperties)
    --test --exclude="server.properties" --exclude="net.properties" --exclude="ja.cfg" --exclude="socket"

    一些map()和reduce()的小应用:

    # 把str'13579'——>int(13579)
    def str2int(s):
        def char2num(s):
            return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
    
        def fn(x,y):
            return x*10+y
    
        return reduce(fn,map(char2num,s))
    
    print(type(str2int('13579')))
    <class 'int'>
    print(str2int('13579'))
    13579
    # 输出规范的字符串,首字母皆为大写,其余均为小写
    # ['adam','LISA','barT']——>['Adam','Lisa','Bart']
    
    def cg_str(lst):
        return list(map(lambda x:x.lower().title(),lst))
    
    #或者用切片实现
    def cg_str(lst):
        return list(map(lambda x:x[0].upper()+x[1:].lower(),lst))
    
    print(cg_str(['adam','LISA','barT']))
    ['Adam', 'Lisa', 'Bart']
    # 类似于sum(),实现一个阶乘prod()函数
    def prod(lst):
        return reduce(lambda x,y:x*y,lst)
    
    print(prod([1,2,3,4,5]))
    120
  • 相关阅读:
    ios专题 - CocoaPods - 初次体验
    ios专题 - CocoaPods - 安装
    Objective-C浅拷贝和深拷贝
    支付宝交互流程
    UITabBar的隐藏
    iOS-容易造成循环引用的三种场景
    FMDB 的基本操作
    Swap file ".Podfile.swp" already exists!
    将UIImage保存成JPG或PNG格式存储在本地
    UI常用控件的一些属性
  • 原文地址:https://www.cnblogs.com/snsdzjlz320/p/7478055.html
Copyright © 2011-2022 走看看