Python3匿名函数字典排序、生成式与

发布时间:2019-09-25 08:16:40编辑:auto阅读(1891)

    1. 参数匿名函数字典排序

    函数的参数:

    参数类型:
    我们经常在看别人的代码中,经常出现def(*args,**kwargs)这样的表现形式;

    *args           tuple(1,)
    **kwargs        dict{"k" : "v"}
    
    fun(*args,**keargs)
    fun(1,2,3,4,5,a=10,b=40)

    匿名函数:

    匿名函数的定义:
    顾名思义就是没有名字的函数,那为什么要设立匿名函数,他有什么作用?
    lambda函数是一种快速付款定义机器智能单行的最小函数,可以用在任何需要函数的地方.

    def fun(x,y)
        return x*y

    lambda方法:
    r=lambda x,y:x*y
    ss求绝对值(abs)

    高阶函数:

    map(f,list) 返回每个元素通过结果计算完的value的list

    def f(x):
        return x*x

    map(f,[1,2,3,4,5])
    reduce(f,[1,2,3,4,5])
    filter(lamdba x:x%2 == 1,[1,2,3,4,5])
    sorted函数:

    sorted(...)
        sorted(iterable,cmp=None,key=None,reverse=False) -->new sorted list

    对字典进行排序:

    按照value进行排序:

    mm = dict(a=1,b=10,c=3,d=9)
    print sorted(mm.iteritems(),key = lamdba d:d[1],reverse = True)
    #/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @time   :2018/1/28 18:55
    # @Author :FengXiaoqing
    # @file   :dicSort.py
    
    def sortDictValue(dict1):
        print(sorted(dict1.items(),key=lambda d:d[1],reverse=False))
    
    if __name__ == '__main__':
        aaa = dict(a=100,b=10,c=50,d=1)
        l = list()
        l = sortDictValue(aaa)
        print(l)
        print(sortDictValue(l))

    2. 生成式和生成器

    列表生成式格式:

    [exp for val in collection if condition]
    
    [x*x for x in xrange(10) if x*x%2 == 0]

    生成器(generator):

    方法一:

    (exp for val in collection if condition)

    方法二:
    使用yield关键字,包含yield语句的函数会被特地编译成生成器。
    yield可以理解力成return,但是并不退出,只是挂起,恢复的时候从yield下面开始执行。

    生成式和生成器的区别:

    列表显示生成式直接返回了表达式的结果列表,面生成器是一个对象,该对象包含了对表达式结果的计算引用,通过结果循环可以直接选举输出
    生成器不会一次性列出所有的数据,当然你用到的时候,在列出来,更加节约内存的使用率。
    类似 range(1,10) xrange(1,10)的区别,但是类型却不同。

    #/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @time   :2018/1/28 22:34
    # @Author :FengXiaoqing
    # @file   :production.py
    
    a = [x*x for x in range(1,11) if x%2 ==0]
    print (a)
    print(type(a))
    
    b = (x*x for x in range(1,11) if x%2 ==0)
    print (b)
    print(type(b))
    for i in b:
        print(i)
    print('#'*20)
    
    def test(l):
        for i in l:
            yield i
            print("OK i = {0}".format(i))
    
    m = test([1,2,3,4,5,6])
    for i in m:
        print(i)
    结果:
    [4, 16, 36, 64, 100]
    <class 'list'>
    <generator object <genexpr> at 0x0000000002160D00>
    <class 'generator'>
    4
    16
    36
    64
    100
    ####################
    1
    OK i = 1
    2
    OK i = 2
    3
    OK i = 3
    4
    OK i = 4
    5
    OK i = 5
    6
    OK i = 6

    3. 装饰器

    装饰器的作用:

    装饰器本质上是一个python函数,它可以让其他工具函数在不需要做任何代码变动的前提下增加额外功能 ,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能 本身无关的雷同代码并继续重用。
    装饰器的作用简单点说:就是不改变 原来函数本身,在函数的前面或后面增加一些额外的功能 。
    场景:京东购物,放入购物车后在结算前弹出的让你登录用户的窗口。

    装饰器:

    在了解装饰器之前 ,我们先来了解一个callable函数
    说明:
    1.方法用来检测对象是否可被调用 ,可被调用 批量的是对象测否使用()括号的方法调用 。
    def a():
    pass
    callable(a)
    2.可调用 对象,在实际调用 也可测调用 失败;但是不可调用 对象,调用 肯定不成功。
    3.类对象都 是可被调用 对象,类的实例对象是否可调用 对象,取决于类是否定义了call方法

    装饰器例子:

    #!/usr/bin/env python
    import datetime
    
    def hellow(fun):
        def preHello():
            print("########start##########“)
            fun()
            print("########end###########“)
        return preHello

    原有方法:

    def startend(func):
        def start():
            print("#########start#############")
            func()
            print("#########end#############")
        return start
    def hello():
        print("hello world!")
    hello = startend(hello)
    hello()

    改进后的使用方法:

    def startend(func):
        def start():
            print("#########start#############")
            func()
            print("#########end#############")
        return start
    
    @startend
    def hello():
        print("hello world!")
    hello()

关键字