资讯专栏INFORMATION COLUMN

Python学习

Cristic / 1233人阅读

摘要:作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的,还可以计算任意复杂的函数,比如,把这个所有数字转为字符串只需要一行代码。

Python 学习 函数式编程 高阶函数 Higher-order function

变量可以指向函数

以Python内置的求绝对值的函数abs()为例

>>> f

>>> f(-10)
10

函数名也是变量

>>> abs = 10
>>> abs(-10)

注:由于abs函数实际上是定义在import builtins模块中的,所以要让修改abs变量的指向在其它模块也生效,要用import builtins; builtins.abs = 10。

传入函数

def add(x, y, f):
    return f(x) + f(y)
add(1,2,abs)    
map函数

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

比如有一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上

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

map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。

map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把这个list所有数字转为字符串:

list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
["1", "2", "3", "4", "5", "6", "7", "8", "9"]
只需要一行代码。
reduce函数

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

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比方说对一个序列求和,就可以用reduce实现:

>>> from functools import reduce
>>> def add(x, y):
...     return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25

当然求和运算可以直接用Python内建函数sum(),没必要动用reduce。

但是如果要把序列[1, 3, 5, 7, 9]变换成整数13579,reduce就可以派上用场:

>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

如果考虑到字符串str也是一个序列,对上面的例子稍加改动,配合map(),我们就可以写出把str转换为int的函数:

>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> def char2num(s):
...     digits = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}
...     return digits[s]
...
>>> reduce(fn, map(char2num, "13579"))
13579

整理成一个str2int的函数就是:

from functools import reduce

DIGITS = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}

def str2int(s):
    def fn(x, y):
        return x * 10 + y
    def char2num(s):
        return DIGITS[s]
    return reduce(fn, map(char2num, s))

还可以用lambda函数进一步简化成:

from functools import reduce

DIGITS = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}

def char2num(s):
    return DIGITS[s]

def str2int(s):
    return reduce(lambda x, y: x * 10 + y, map(char2num, s))

假设Python没有提供int()函数,你完全可以自己写一个把字符串转化为整数的函数,而且只需要几行代码

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41582.html

相关文章

  • 关于Python的三个谎言,别再盲目学Python

    摘要:关于的三个谎言,你一定要清楚。这是的整个知识体系图谱,对于新手来说,没必要学那么多。第四自动化测试一切关于自动化的东西,似乎都可以满足,可以满足大多数自动化工作,提升工作效率。这都是正常的,千万别急着否定自己,怀疑自己。 ...

    TZLLOG 评论0 收藏0
  • 干货 | 学习Python的正确姿势

    摘要:勤学学习效率与效果取决于执行力。这一步学习的正确姿势是在实践操作中发掘问题,然后带着问题找答案。拆分任务将目标分解成具体可执行的学习任务。勤学强大的执行力是学习的根本保障。分享复述检验学习成果,提高学习效果的最好方法。 showImg(https://segmentfault.com/img/bVbcPGZ?w=256&h=256); 前段时间和大家一起分享了一篇关于学习方法内容《大牛...

    Thanatos 评论0 收藏0
  • [译]学习Python编程的19个资源

    摘要:它需要将近美元才能买到,但是你可以下载免费的和版本。在需要花费美元来开始你的学习,将会有超过页的内容和个多小时的视频供你访问,还包括以后可以免费更新。 showImg(https://segmentfault.com/img/bVrJpw); 用Python编写代码一点都不难,事实上它一直被赞誉为最容易学的编程语言。如果你准备学习web开发, Python是一个不错的开始,甚至想做游戏...

    xiguadada 评论0 收藏0
  • SegmentFault 技术周刊 Vol.30 - 学习 Python 来做一些神奇好玩的事情吧

    摘要:学习笔记七数学形态学关注的是图像中的形状,它提供了一些方法用于检测形状和改变形状。学习笔记十一尺度不变特征变换,简称是图像局部特征提取的现代方法基于区域图像块的分析。本文的目的是简明扼要地说明的编码机制,并给出一些建议。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 开始之前,我们先来看这样一个提问: pyth...

    lifesimple 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<