zoukankan      html  css  js  c++  java
  • Python常用高级函数

    一 、匿名函数

      有些时候,我们不需要显式的定义函数,可以使用匿名函数临时快速定义函数。

    lambda x: x * x

    关键字lambda表示匿名函数,冒号前面的x表示函数的参数,多个参数用','隔开,返回值就是表达式的结果。

    二 、递归函数

      递归函数就是在函数内部调用函数本身。如:

    def fact(n):
        if n==1:
            return 1
        return n * fact(n - 1)

    递归函数必须有终止条件,否则会导致无限递归,使栈溢出。python的递归最大深度为1000,但会在深度为998左右出现报错。

    递归使用:

    1. 遍历某文件夹中所有文件

    import os
    def read(filepath, n):
        files = os.listdir(filepath)   # 获取到当前文件夹中的所有文件
        for fi in files:  # 遍历文件夹中的文件,这里获取的只是本层文件名
            fi_d = os.path.join(filepath, fi)
            if os.path.isdir(fi_d): # 如果该路径下的文件是文件夹
                print("	"*n, fi)
                read(fi_d, n+1)  # 继续进行相同的操作
            else:
                print("	"*n, fi)  # 递归出口,最终在这里隐含着return
    
    # 递归遍历目录下所有文件
    read('e:/pythonDemo', 0)

    2. 汉诺塔问题

    # 无论多少个圆块,可以抽象成为同一套思路:就是想办法把(n-1)个a柱上的圆块先移动到b柱,
    # 然后把最底部最大的一个圆块移动到c柱,最后把b柱上的(n-1)个圆块移动到c柱
    def hanoi(n, a, buffer, c): if n == 1: print(a, '--->', c) # 定义从a柱移动到c柱的操作 else: hanoi(n-1, a, c, buffer) # 把(n-1)个a柱上的圆块移动到缓冲区buffer柱 hanoi(1, a, buffer, c) # 把最底部的最大的圆块移动到c柱 hanoi(n-1, buffer, a, c) # 把(n-1)个缓冲区buffer柱上的圆块移动到c柱 hanoi(3, 'A', 'B', 'C')

    三 、偏函数

    函数可以通过设置参数的默认值降低函数调用的难度,偏函数就有这种用处。

    如用int()函数实现二进制的转换:

    >>>int('101010001', base=2)
    337

    python的functools模块的partial函数就可以创建一个偏函数:

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

    四 、sorted

    python内置的sorted()函数可以对list进行排序,它的key参数控制排序方式是以什么作为排序参照的,reverse=False/True控制是正向排序还是反向排序。

    >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
    ['Zoo', 'Credit', 'bob', 'about']

    五 、filter

    filter()函数用于过滤序列,函数传入两个参数,第一个是一个返回布尔值的函数,第二个是list,filter会将列表中的元素依次传入第一个函数中,返回值是True的将保留。

    def not_empty(s):
        return s and s.strip()
    
    list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))
    # 结果: ['A', 'B', 'C']

    六 、map

    map()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

    >>> r = map(lambda x: x*x, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> list(r)
    [1, 4, 9, 16, 25, 36, 49, 64, 81]

    七 、reduce

    reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

    即:

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

    把序列[1, 3, 5, 7, 9]变换成整数13579:

    >>> from functools import reduce
    >>> def fn(x, y):
    ...     return x * 10 + y
    ...
    >>> reduce(fn, [1, 3, 5, 7, 9])
    13579
  • 相关阅读:
    c#中的委托和事件
    C++STL中的vector
    java中的static
    java中public private protected区别
    java中抽象类与接口
    c++中的namespace
    北京“新城卓越”黑中介租房感受
    如何删除当前正在使用的SQLLite文件?
    SVN将一台服务器上的代码迁移到另一台服务器上
    使用PowerDesigner对NAME和COMMENT互相转换
  • 原文地址:https://www.cnblogs.com/heshike/p/10498144.html
Copyright © 2011-2022 走看看