zoukankan      html  css  js  c++  java
  • Python—函数进阶篇

    lambda表达式(匿名函数表达式)

    作用:创建一个匿名函数对象。同def类似,但不提供函数名。

    语法:lambda [形参1,形参2,...] : 表达式

    语法说明

    • lambda 只是一个表达式,它用来创建一个函数对象。
    • 当lambda表达式调用时,先执行冒号后的表达式,并返回表达式的结果的引用。
    • lambda 表达式创建的函数只能包含一条表达式。
    • lambda 表达式比函数简单,且可以随时创建和销毁,有利于减少程序的偶合度。

    把lambda函数赋值给一个变量

    # 定义一个加法函数,并把值赋给变量myadd,就可以执行myadd(5, 6);
    myadd = lambda x, y: x+y
    print myadd(5, 6)      # 结果:11

    把lambda函数赋值给其他函数

    import time, datetime
    time.sleep
    = lambda x: None # time 库的 sleep 函数不会执行原功能;
    starttime = datetime.datetime.now() time.sleep(3) endtime = datetime.datetime.now() print endtime-starttime # 结果:0:00:00

    把lambda函数作为其他函数的返回值

    def add(n):
        return lambda x: x+n
    myadd = add(5)
    print myadd(15)      # 结果:20
    
    def add(x):
        def inner(y):
            return x+y
        return inner
    myadd = add(5)
    print myadd(15)      # 结果:20

    把lambda函数做参数传给其它函数(map, filter, reduce)

    # 利用map映射函数输出序列加工后的新序列。
    print map(lambda x: x ** 2, range(1, 3))      # 结果:[1, 4]   map返回类型:<type 'list'>
    def arr(x):
        return x ** 2
    print map(arr, range(1, 3))                   # 结果:[1, 4]   map返回类型:<type 'list'>
    
    # 利用filter过滤函数输出0-9的奇数;返回False时将此数据丢弃,返回True,则保留此数据
    print filter(lambda x: x % 2, range(10))      # 结果:[1, 3, 5, 7, 9]   filter返回类型:<type 'list'>
    def odd(x):
        return x % 2
    print filter(odd, range(10))                  # 结果:[1, 3, 5, 7, 9]   filter返回类型:<type 'list'>

    eval函数和exec函数

    高阶函数

    一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。

    # 参数为函数,函数bar作为foo的参数传入,函数foo()为高阶函数。
    def bar():
        print("in the bar..")
    def foo(func):
        func()
        print("in the foo..")
    foo(bar)
    
    # 返回值为函数,函数bar作为foo的返回值,函数foo()为高阶函数。
    def bar():
        print("in the bar..")
    def foo(func):
        print("in the foo..")
        return func
    res=foo(bar)
    res()

    注:函数名(例如bar 、foo)-->其为该函数的内存地址;函数名+括号(例如 bar()、foo() )-->调用该函数。

    python内置的高阶函数:map、filter、sorted、reduce等

    map函数

    map函数接收的是两个参数,一个函数,一个序列,其功能是将序列中的值处理再依次返回至列表内。其返回值为一个迭代器对象。

    def power(x):
        return x ** 2
    # map函数模拟,功能与map函数一样
    def map_test(func,iter):
        arr=[]
        for i in iter:
            ret=func(i)
            arr.append(ret)
        return arr.__iter__()   # 将列表转为迭代器对象
    
    #
    map_test函数 print list(map_test(power,range(1,6))) # 结果:[1, 4, 9, 16, 25] # map函数 print list(map(power,range(1,6))) # 结果:[1, 4, 9, 16, 25] print list(map(lambda x: x ** 2, range(1,6))) # 结果:[1, 4, 9, 16, 25] # map函数的参数1也可以是匿名函数、参数2也可以是字符串 print list(map_test(lambda x:x.upper(),"hello")) # 结果:['H', 'E', 'L', 'L', 'O'] print list(map(lambda x:x.upper(),"hello")) # 结果:['H', 'E', 'L', 'L', 'O'] # map函数的参数2也可以是多个可迭代对象 def power2(x, y): return x ** y print list(map(power2,range(1,7),range(6,0,-1))) # 结果:[1, 32, 81, 64, 25, 6]

    filter函数

    filter函数也是接收一个函数和一个序列的高阶函数,其主要功能是筛选过滤序列中的数据。其返回值也是迭代器对象。函数func将对iterable中的每个元素进行求值,返回False时将此数据丢弃,返回True,则保留此数据。

    names=["Hello","hello","python"]
    # filter函数机制,功能与filter函数一样
    def filter_test(func,iter):
        arr = []
        for i in iter:
            if func(i):   # 传入的func函数其结果必须为bool值,才有意义
                arr.append(i)
        return arr
    
    #filter_test函数
    print filter_test(lambda x:x.islower(),names)   # 结果:['hello', 'python']
    #filter函数
    print filter(lambda x:x.islower(),names)        # 结果:['hello', 'python']
    
    def mynum(x):
        return x % 2 == 0
    list = filter(mynum,range(10))
    print list      # 结果:[0, 2, 4, 6, 8]

    sorted函数

    作用:将原可迭代对象的数据进行排序,生成排序后的列表
    格式:sorted(iterable, key = None, reverse = False)
    说明:iterable:可迭代对象。key:绑定的函数,用来提供一个排序的依据。reverse 用来设置是否降序排序。默认False,从小到大。

    # 按照名字进行排序,
    names = [{"score":90, 'age': 99, 'name': 'lisi'},
             {"score":80, 'age': 45, 'name': 'wangwu'},
             {"score":60, 'age': 42, 'name': 'ali'},
             {"score":30, 'age': 67, 'name': 'zhaofang'}]
    
    def paixu(dict):
        return dict["name"]
    result = sorted(names,key=paixu)               # 方法一
    result = sorted(names,key=lambda d:d["name"])  # 方法二
    # sorted函数会把names里的值一一取出来,作为key后面的排序函数的参数。

    reduce函数

    reduce函数也是一个参数为函数,一个为可迭代对象的高阶函数,其返回值为一个值而不是迭代器对象,故其常用与叠加、叠乘等。
    reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把参数计算结果继续和序列的下一个元素做累积计算,其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)。比方说对一个序列求和,就可以用reduce实现。

    #reduce函数不是内置函数,而是在模块functools中的函数,故需要导入
    from functools import reduce
    
    nums=[1,2,3,4,5,6]
    # reduce函数的机制
    def reduce_test(func,array,ini=None): #ini作为基数
        if ini == None:
            ret =array.pop(0)
        else:
            ret=ini
        for i in array:
            ret=func(ret,i)
        return ret
    # reduce_test函数,叠乘
    print reduce_test(lambda x,y:x*y,nums,100)   # 结果:72000
    # reduce函数,叠乘
    print reduce(lambda x,y:x*y,nums,100)        # 结果:72000
    
    
    def add(x, y):
        return x + y
    print reduce(add, [1, 3, 5, 7, 9])      # 结果:25
    print reduce(add, [1, 3, 5, 7, 9], 10)  # 结果:35
    
    def func(x, y):
        return x * y
    print reduce(func, [1, 3, 5])              # 结果:15
    print reduce(func, [1, 3], 5)              # 结果:15
    print reduce(lambda x,y:x*y,range(1,3),5)  # 结果:10

     https://www.cnblogs.com/littlefivebolg/category/1223800.html

  • 相关阅读:
    ZOJ1450 BZOJ1136 BZOJ1137 HDU3932[最小圆覆盖]
    POJ 1755 Triathlon [半平面交 线性规划]
    POJ 3384 Feng Shui [半平面交]
    POJ 3525 Most Distant Point from the Sea [半平面交 二分]
    POJ 1279 Art Gallery [半平面交]
    POJ3335 POJ3130 POJ1474 [半平面交]
    POJ 3608 Bridge Across Islands [旋转卡壳]
    nginx访问量统计
    PV UV QPS 并发数
    PV、UV、IP之间的区别与联系
  • 原文地址:https://www.cnblogs.com/liuhaidon/p/11643331.html
Copyright © 2011-2022 走看看