函数式编程


函数是Python内建支持的一种封装,通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

函数式编程就是一种抽象程度很高的编程范式,纯函数式编程语言编写的函数没有变量。由于Python允许使用变量,因此Python不是纯函数式编程语言。函数式编程的一个特点就是 ,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。

变量可以指向函数:>>> abs(-10) 10√   abs×   >>> x = abs(-10) >>> x 10√   >>> f = abs×   >>>f = abs >>>f(-10) 10√
    函数名也是变量:函数名其实就是指向函数的变量,可以指向其他对象但用原先函数指向作废。

高阶函数:函数能传入别的函数作为参数。
    map():接收两个参数,一个是函数一个是Iterable,将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回.list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

reduce():接收两个参数,把一个函数作用在一个序列[x1, x2, x3, ...]上,依次作用把结果继续和下一个元素做累积计算,在functools模块中。reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3) x4)

filter():用于过滤序列,接收一个函数和一个序列,把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。list(filter(is_odd, [1, 2, 4, 5])) list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))

sorted():可以对list排序,字符串按照ASCII的大小比较。还可以接收一个key函数来实现自定义的排序 >>> sorted([36, 5, -12, 9, -21], key=abs)

返回函数:把函数作为结果值返回。
    def lazy_sum(*args):
        def sum():
            ax = 0
            for n in args:
                ax = ax + n
            return ax
    return sum
调用lazy_sum()时,返回的并不是求和结果,而是求和函数:>>> f = lazy_sum(1, 3, 5, 7, 9) >>> f
调用函数f时,才真正计算求和的结果:>>> f(1, 3, 5, 7, 9) 25
调用lazy_sum()时,每次调用都会返回一个新的函数,使得调用结果互不影响。
在这个例子中函数lazy_sum中又定义了函数sum,并且内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时相关参数和变量都保存在返回的函数中,

这种称为“闭包(Closure)”的程序结构拥有极大的威力。
返回闭包时牢记的一点就是:返回的函数并没有立刻执行,直到调用了才执行,所以return的函数不要用后续会发生变化的变量,比如循环变量(可通过创建函数绑定循环变量当前值破例)。

匿名函数:在传入函数时,有些时候不需要显式地定义函数,直接传入匿名函数更方便。比如>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数有个限制就是只能有一个表达式。
匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:>>> f = lambda x: x * x>>> f(5)
匿名函数也可以作为返回值返回>>>return lambda: x * x + y * y

装饰器:想要增强一个函数的功能,但又不希望修改函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
>>> def now():
             print('2015-3-25') __name__属性,可以拿到函数的名字:>>> now.__name__ 'now'
想加一个打印日志的功能,decorator本质上就是一个返回函数的高阶函数。所以要定义一个能打印日志的装饰器
>>>def log(func):
            def wrapper(*args, **kw):
                  print('call %s():' % func.__name__)
                  return func(*args, **kw)
       return wrapper
装饰器需要借助@语法接受一个函数作为参数,
>>>@log
def now():
     print('2015-3-25')
这里相当于执行了语句now = log(now),返回的wrapper()函数。原来的now()函数仍然存在,只是同名的now变量指向了新的函数。
想要自定义log的文本,decorator本身就需要传入参数,所以要编写一个返回decorator的高阶函数
>>>def log(text):
             def decorator(func):
                   def wrapper(*args, **kw):
                         print('%s %s():' % (text, func.__name__))
                   return func(*args, **kw)
             return wrapper
       return decorator
3层嵌套的decorator用法
>>>@log('execute')
       def now():
             print('2015-3-25')
这里相当于执行了语句now = log('execute')(now),首先执行log('execute'),返回的是decorator函数,再调用返回的函数,参数是now函数,返回值最终是wrapper函数。
最后一步在最终返回函数的定义前加functools模块中的@functools.wraps(func)把原始函数的__name__等属性复制wrapper()函数中,防止有些依赖函数签名的代码执行出错。

偏函数:当函数的参数个数太多,需要简化时使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
int()进制参数默认为10,>>> int2 = functools.partial(int, base=2)#用functools模块中的partial方法固定某些参数,创建新函数将对象转化为2进制整数。

计算机(Computer)和计算(Compute)这两个概念概念。
计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编

语言是最贴近计算机的语言。计算则指数学意义上的计算,越是抽象的计算,离计算机硬件越远。
对应到编程语言,就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越

高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言。

返回Iterator的函数,返回的属于惰性序列,所以需要用list()函数要强迫函数完成所有结果并返回list。

在面向对象(OOP)的设计模式中,decorator被称为装饰模式。OOP的装饰模式需要通过继承和组
合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator。Python的

decorator可以用函数实现,也可以用类实现。

python advanced programming ( I )的更多相关文章

  1. python advanced programming (Ⅲ)

    IO编程 IO在计算机中指Input/Output.由于程序和运行时数据是在内存中驻留,由CPU来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. IO编程中,Stream(流)是一个 ...

  2. python advanced programming ( II )

    面向对象编程 简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数.数据封装.继承和多态是面向对象的三大特点. 在Python中,所有数据类型都可以视为对 ...

  3. python network programming tutorial

    关于网络编程以及socket 等一些概念和函数介绍就不再重复了,这里示例性用python 编写客户端和服务器端. 一.最简单的客户端流程: 1. Create a socket 2. Connect ...

  4. Python 高级网络操作 - Python Advanced Network Operations

    Python 高级网络操作 - Python Advanced Network Operations Half Open Socket, 一个单向的 socket 被称为 half open sock ...

  5. [Python] Advanced features

    Slicing 12345 L[:10:2] # [0, 2, 4, 6, 8]L[::5] # 所有数,每5个取一个# [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, ...

  6. Python Socket Programming

    本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在Python 3.4下. Python的sock ...

  7. 【334】Python Object-Oriented Programming

    Reference: Python中self用法详解 __init__ 方法: 私有变量. Reference: [290]Python 函数 class 里面的 function 创建与此一致,只是 ...

  8. python Object-Oriented Programming

    Python 类的成员.成员修饰符.类的特殊成员. Python 类的成员 类的成员可以分为三大类: 字段.方法和属性. #注:所有成员中,只有普通字段的内容保存对象中,即: #根据此类创建了多少对象 ...

  9. The Art of Prolog:Advanced Programming Techniques【译文】

    申明:此文为译文,仅供学习交流试用,请勿用作商业用途,造成一切后果本人概不负责,转载请说明.本人英语功力尚浅,翻译大多借助于翻译工具,如有失误,欢迎指正. 逻辑程序简介 逻辑程序是一组公理或规则,定义 ...

随机推荐

  1. jar导入本地maven库

    最近在了解视频监控相关sdk,海康威视官方sdk要求自己手工将fas-data-sdk-1.0-SNAPSHOT.jar导入本地maven库,maven配置文件pom.xml配置如下 <?xml ...

  2. code first 添加外键时,与原有的数据冲突ALTER TABLE 语句与 FOREIGN KEY 约束"FK_XXXXX"冲突

    问题的原因是新增的外键字段没有默认值,造成的,有很多方法可以解决,我这里通过修改生成的迁移文件,设定为可空,或者设置默认值即可.具体看情况使用.

  3. 为Linux虚拟机设置网络

    安装虚拟机的时候为了使用方便我们除了需要设置静态ip为了能够让虚拟机也能够上网我们需要设置虚拟机网络 当然也可以使用虚拟机和主机共享上网,这个比较简单,这里就不说了,现在我们来通过桥接的方式为虚拟机设 ...

  4. OKI系列针式打印机更换色带图解教程

    色带一直换不好,今天找到一个带图的教程,收藏一下 打开新色带的包装后,我们可以仔细观察一下新色带,找到里面带有一段“扭曲”色带的位置,这段色带就是:“莫比乌斯带”结构. 找到“莫比乌斯带”结构(就是有 ...

  5. PAT 1024 科学计数法 (20)(精简版代码+思路+推荐测试样例)

    1024 科学计数法 (20)(20 分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+, ...

  6. ssm介绍

    1.Spring     Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE ...

  7. Scrapy shell调试返回403错误

    一.问题描述 有时候用scrapy shell来调试很方便,但是有些网站有防爬虫机制,所以使用scrapy shell会返回403,比如下面 C:\Users\fendo>scrapy shel ...

  8. Sevlet处理HTML表单

    表单<form>用于搜集不同类型的用户输入.可以轻松地将一个HTML表单从一个Servlet发送到浏览器,当用户提交表单时,在表单元素中输入的值就会被当做请求参数发送到服务器. reque ...

  9. 企业类Web原型制作分享-Kraftwerk

    这是一个设计师团队,将数码产品的创意发挥到极致.整个网站采用深黑色背景和图文搭配,网站有很多动画特效,均突出数码产品的质感.网站结合滚动区实现导航栏悬浮效果,用弹出面板实现点击弹出内容等交互效果. 本 ...

  10. java 泛型: 通配符? 和 指定类型 T

    1. T通常用于类后面和 方法修饰符(返回值前面)后面 ,所以在使用之前必须确定类型,即新建实例时要制定具体类型, 而?通配符通常用于变量 ,在使用时给定即可 ? extends A  :  通配符上 ...