Python学习之 函数式编程
admin
2023-07-05 16:04:13
0

  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。


相关内容

热门资讯

我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...
原创 识... 还是那句话,机圈苦大屏久已…… 虽然大屏有大屏的美,但是小屏也有小屏的俏。在大屏旗舰占据主流的手机市...
玄戒技术取得分频电路专利,实现... 国家知识产权局信息显示,北京玄戒技术有限公司取得一项名为“分频电路、分频器、射频芯片和电子设备”的专...
为什么今年香会基调明显变了 5月29日—31日在新加坡举行的第23届香格里拉对话会(简称“香会”),见证着元首引领下大国关系继续...
成本几毛钱、假驱蚊液香精兑水,... 入夏升温,蚊虫进入活跃期,驱蚊防护成为民生刚需,《财经调查》持续接到消费者投诉,他们买到的多款网红驱...
越来越多80后90后,正在丧失... 六一儿童节到来之际,朋友圈里开始出现一种熟悉的热闹。有人晒出零食礼包,有人半开玩笑地向伴侣讨礼物,还...
洋保电子取得用于低温环境的电气... 国家知识产权局信息显示,洋保电子(太仓)有限公司取得一项名为“一种用于低温环境的电气柜”的专利,授权...
中日韩飞手争霸宁波!2026无... 潮新闻客户端 记者 陈冲 通讯员 朱凝 5月31日,2026小遛·无人机竞速世界杯(中国·宁波鄞州站...