Python学习细节总结以及python与c语言区别比较(4)

本文介绍了Python中的高阶函数,包括map、reduce、filter和sorted的使用,以及返回函数、匿名函数(lambda)和装饰器的概念。通过实例展示了如何运用这些特性进行编程,同时提到了偏函数functools.partial的使用,帮助读者理解Python中函数更高级的用法。
摘要由CSDN通过智能技术生成

        本文python学习基于廖雪峰老师的学习网站:字符串和编码 - 廖雪峰的官方网站 (liaoxuefeng.com),其内容相对完整,适合初学者学习。由于楼主之前有c语言的学习经验,在此本文仅对其中与c语言相差比较大的部分进行总结回顾,如有纰漏还请指出。

前接:Python学习细节总结以及python与c语言区别比较(3)

7.高阶函数

        在python中,可以将函数赋值给变量,从而使变量拥有函数的功能,类似于给变量定义成为一个已知函数。同样,函数名也被视为变量,如果给函数名赋值,那么函数名便失去了作为函数的功能。在一个函数内部的参数也可以是另一个函数。

7.1map函数、reduce函数、filter函数、sorted函数

        map()函数的功能是接收2个参数,一个是函数,一个是序列(list/tuple)来进行所有元素的函数计算。当然,如果是自定义函数要先进行函数的定义。

>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

        reduce()函数与map()类似,区别是reduce()函数是把结果继续和序列的下一个元素做累积计算,也就是(注:要前缀from functools import reduce)

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

        filter()函数则是一个过滤序列的函数,与map()函数类似作用与每一个元素,通过传入函数与序列来对序列中元素进行筛选,确定是否保留。例如,在一个list中,删掉偶数,只保留奇数,可以这么写:

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

        sorted()函数是一个排序序列的函数,一般会将序列从小到大排序,我们也可以给key函数赋值自定义函数使其作用在每一个元素后进行排序。比如:

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

7.2返回函数

        我们可以通过返回函数,从而使代码能根据需要再进行计算。如

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

        我们只有在使用lazy_sum(x)时才会返回值,而不是立刻计算所有元素。

        注意:返回函数不要引用任何循环变量,或者后续会发生变化的变量。这与c语言的使用方法不同,如果这么使用返回的值都会是变量的最终结果。如果一定要引用循环变量,我们需要再创建一个函数,用该函数的参数绑定循环变量当前的值。

7.3匿名函数

        匿名函数lambda只能有一个表达式,不用写return,返回值就是该表达式的结果。使用匿名函数后不必担心函数名冲突。此外,由于匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数,或作为返回值返回。

        如lambda x:x*x就相当于定义一个x*x的函数。

7.4装饰器

        装饰器(decorator)能在代码运行期间动态增加功能。

        比如我们要定义一个能打印日志的decorator,我们的代码是

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

  7.5偏函数

        我们可以利用python的functools模块来创建偏函数,比如我们可以在int函数里面传入base参数来改变int函数输出的进制,如:

>>> int('12345', base=8)
5349
>>> int('12345', 16)
74565

        创建偏函数我们一般利用functools.partial来进行,这样就不用我们自己对函数进行定义再创建,比如我们要创建一个转换为2进制的偏函数:

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

后接:Python学习细节总结以及python与c语言区别比较(5)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值