Python基础(六)—函数式编程(内部函数、闭包、lambda、filter/map/reduce/sorce、偏函数)
in python基础 with 0 comment

Python基础(六)—函数式编程(内部函数、闭包、lambda、filter/map/reduce/sorce、偏函数)

in python基础 with 0 comment

内部函数

Python中函数的作用域由def关键字界定,函数内的代码访问变量的方式是从其所在层级由内向外,若往外直至全局作用域都查找不到的话代码会抛异常。

主要看以下代码的差别~~

  """
  def f1():
      x = 5
      def f2():
          x *= x
          return x
      return f2
  """

  def f1():
      x = [5]
      def f2():
          x[0] *= x[0]
          return x[0]
      return f2()

  print(f1())

  def f1():
      x = [5]
      def f2():
          x[0] *= x[0]
          return x[0]
      return f2

  print(f1()())

  def f1():
      x = 5
      def f2():
          nonlocal x
          x *= x
          return x
      return f2
  print(f1()())

闭包 closure

匿名函数 lambda

映射map/reduce

def f(x, y):
    return x + y

reduce(f, [1, 3, 5, 7, 9])  # 25

reduce(f, [1, 3, 5, 7, 9], 100)  # 125,计算初始值和第一个元素:f(100, 1),结果为101

过滤器 filter

sorted、sort

list = [2, 5, -4, 11, 7]
print(list.sort())
print(list)
print(sorted(list, reverse=True))

dict = {'a':2,'E':3,'f':8,'d':4}
print(sorted(dict))
print(sorted(dict, reverse=True))
print(sorted(dict, reverse=True, key=str.lower))
print(sorted(dict.items(), key=lambda x : x[1]))

array = [{"age":20,"name":"a"},{"age":25,"name":"b"},{"age":10,"name":"c"}]
array = sorted(array,key=lambda x:x["age"], reverse=False)
print(array)

偏函数

functools模块提供有wrap与偏函数,可以设定参数的默认值,降低函数的调用难度。

例如,我们有个需求,需要将二进制转为int,那应该是:

int('100000101', base=2) # 261

每次转换都这样,比较麻烦,于是写了函数int2

def int2(num, base=2):
  return int(num, base)

使用functools.partial就是帮助创建一个这样的偏函数,不用自己定义int2()

import functools

int2 = functools.partial(int, base=2)
int2('101010110')


创建偏函数时,实际上可以接受 函数对象、args、*kw 这三个参数,以上例子实际上固定了int()函数的关键参数base,也就是:
int2('101010110')
相当于:
kw = {'base', 2}
int('101010110', **kw)
当传入:
max2 = functools.partial(max, 10)
实际上会将10作为 *args 的一部分自动加到左边,也就是:
max2(4, 9) 相当于: max2(10, 4, 9)
偏函数用于固定住原函数的部分参数,使得调用更简单。

个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:Python基础(六)—函数式编程(内部函数、闭包、lambda、filter/map/reduce/sorce、偏函数)

Responses