Python学习之 函数式编程

  1 函数式编程

  1.1 匿名函数

  关键字lambda表示匿名函数,冒号前面的 x 表示参数。冒号后面只能有一个表达式,不写return,返回值就是该表达式的结果。可以不必定义函数名,直接创建一个函数对象。返回函数的时候,也可以返回匿名函数。下面的代码是一个例子:

  myabs = lambda x : -x if x < 0 else x

  myabs(-2)

  输出如下:

  2

  1.2 返回函数

  Python的函数不但可以返回int、str、list、dict等数据类型,还可以返回函数!

  比如,定义一个函数 f(),我们让它返回一个函数g,可以这样写:

  def f():

  print('call f()...')

  def g(): # 定义函数g

  print('call g()...')

  return g # 返回函数g()

  上述代码中在函数f()内部又定义了一个函数g()。由于函数g() 也是一个对象,函数名g()就是指向函数g()的变量,所以,最外层函数f()可以返回变量g(),也就是函数g()本身.调用函数f(),我们会得到f()返回的一个函数:

  x = f() # 调用f()

  输出如下:

  call f()...

  1.3 闭包

  在函数内部定义的函数和外部定义的函数是一样的,只是他们无法被外部访问:

  def g(): # 定义函数g

  print('call g()...')

  def f():

  print('call f()...')

  return g # 返回函数g()

  将g()的定义移入函数f()内部,防止其他代码调用g():

  def f():

  print('call f()...')

  def g(): # 定义函数g

  print('call g()...')

  return g # 返回函数g()

  像这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包Closure。闭包的特点是返回的函数还引用了外层函数的局部变量。所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。

  1.4 偏函数

  int()函数可以把字符串转换为整数。当仅传入字符串时,int()函数默认按十进制转换:

  int('98')

  输出如下:

  98

  函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做 N 进制的转换:

  int('100', base = 8)

  输出如下:

  64

  functools.partial就是创建一个偏函数的,可使用下面的代码创建一个新的函数:

  import functools

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

  int2('1000')

  输出如下:

  8无锡看妇科的医院 http://www.ytsgfk120.com/

  functools.partial可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值,函数调用的难度就降低了。

  1.5 reduce函数

  使用reduce(),需要导入functools包下的reduce:

  from functools import reduce

  reduce()函数接收的参数是一个函数f和一个list,f必须接收两个参数。reduce()对list的每个元素反复调用函数f,并返回最终结果值。

  下面是一个函数f:

  def f(x, y):

  return x + y

  调用reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:

  先计算头两个元素:f(1, 3),结果为4;

  再把结果和第3个元素计算:f(4, 5),结果为9;

  再把结果和第4个元素计算:f(9, 7),结果为16;

  再把结果和第5个元素计算:f(16, 9),结果为25。

  reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:reduce(f, [1, 3, 5, 7, 9], 100),结果将变为125,因为第一轮计算是:计算初始值和第一个元素:f(100, 1),结果为101。

  1.6 filter函数

  filter()函数接收一个函数f和一个list。函数f的作用是对每个元素进行判断,返回 True或 False。filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。

  要从一个list[1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:

  def is_odd(x):

  return x % 2 == 1

  然后利用filter()函数过滤掉偶数:

  list(filter(is_odd, [1, 4, 6, 7, 9, 12, 17]))

  输出如下:

  [1, 7, 9, 17]

  利用filter(),可以完成很多有用的功能。例如,删除None或者空字符串。下面的代码是一个判断字符串是否为空的函数:

  def is_not_empty(s):

  return s and len(s.strip()) > 0

  然后输入:

  list(filter(is_not_empty, ['test', None, '', ' ', 'END']))

  输出为:

  ['test', 'END']

  2 Python学习需要注意的点

  1、空值为None而不是NULL;

  2、True或者False首字母要大写;

  3、print()会依次打印每个字符串,遇到逗号,的话,会输出一个空格。下面的代码是一个例子:

  print('A', 'B')

  输出如下:

  A B

  4、Python把0、空字符串’'和None看成 False,其他数值和非空字符串都看成True。


猜你喜欢

转载自blog.51cto.com/14503791/2431280
今日推荐