Python学习_08_函数式编程

在python中,函数名也是一个变量,代表对一个函数内容的引用,意味着可以作为参数传入到其他函数中,根据这个特性,发散出装饰器、闭包等概念,并涉及到变量作用域等问题。

函数

python中函数操作符为(),在任何需要调用函数的地方都需要在函数名后面加(),表示调用该函数,否则的话仅仅表示一个函数对象,当然可以保存这个对象,或者将该函数对象传入到其他函数中,以供延迟调用。

函数的参数分为按顺序确定的位置参数、默认参数、非关键字可变长度参数、关键字可变长度参数。

其中位置参数仅仅通过传入时的顺序来确定调用,并且如果没有任何默认参数的话,传入的参数数目必须和函数定义一致。python支持默认参数,将一些常用的参数初始化而避免重复写相同的参数。这两个都是常规函数的参数形式。另外一种非常规的参数就是参数的数目不一定,即可变长度的参数,这些参数可以是不带关键字的元组,或者是带关键字的字典。

python中,参数传入规则可以表示如下:

def myFunc([formal_args,] *args_tuple,**kw_dict)

其中formal_args表示位置参数,包含可能有的默认参数,而*args_tuple则表示可变长度的非关键字参数,**kw_dict表示可变长度的关键字参数。

匿名函数 lambada

匿名函数是python中对单行语句的特殊用法,用于简化一些简单函数。如

fun add(x,y):
? ? return x+y

可以用lambada x,y:x+y来表示,lambada之后,冒号之前的内容表示需要传入的参数,冒号之后的内容表示执行的单行语句。

lambada可以被存储,以便之后调用,如 add = lambada x,y:x+y,可以调用为add(x,y)。

装饰器 decorator

由于函数的本质是一个引用,所以对函数名可以进行传入、传出等和一般变量一样的操作,通过这个特性,可以设计一些装饰器,用以对函数做重复的通用操作。python中对装饰器有额外的语法支持:@,在函数的上方加入@decorator语句,即表示对该函数进行装饰调用。一个函数可以被多个装饰器装饰。装饰器的本质是函数,所以装饰器也支持参数传入。一个装饰器的例子:

def log(func):
? ? def wrappedFunc():
? ? ? ? print ’The %s() is called!’ % func.__name__
? ? ? ? return fun()
? ? return wrappedFunc

通过@log的方式使用装饰器:

@log
def func():
? ? pass

上述语句的含义是func=log(func),此时,func的内容会调用装饰器log,log函数最终会返回wrappedFunc函数对象,但是并没有调用该函数,当func()执行时真正调用wrappedFunc(),该函数首先打印一行调用日志,然后返回func()函数的调用,这里返回的调用,并不是func函数对象,所以在这里会真正执行func函数的实体。从而实现“装饰”的过程。

闭包 closure

在python2.1之后,作用域规则变为静态作用域,内部函数可以正常引用外部的变量,这种内部函数引用外部作用域的变量的函数就被称为闭包:

def counter(start_at = 0):
? ? count = start_at
? ? def incr():
? ? ? ? count += 1
? ? ? ? return count[0]
? ? return incr

可以看到闭包的形式装饰器很像,区别是闭包传入的不一定是一个函数,只是对外部变量的引用,内部函数中也不一定需要执行传入的函数,可能做一些其他的工作。

闭包和装饰器的一个例子:

from time import time
def logged(when):
? ? def log(f,*args,**kargs):
? ? ? ? print ‘’’Called:
function: %s
args: %r
kargs: %r’’’ %(f,args,kargs)

? ? def pre_logged(f):
? ? ? ? ?def wrapped(*args,**kargs):
? ? ? ? ? ? log(f,*args,**kargs)
? ? ? ? ? ? return f(*args,**kargs)
? ? ? ? return wrapped

? ? def ?post_logged(f):
? ? ? ? def wrapped(*args,**args):
? ? ? ? ? ? ?now = time()
? ? ? ? ? ? ?try:
? ? ? ? ? ? ? ? return f(*args,**kargs)
? ? ? ? ? ? finally:
? ? ? ? ? ? ? ? log(f,*args,**kargs)
? ? ? ? ? ? ? ? print “time delta: %s “ % (time()-now)
? ? ? ? return wrapped

? ? try:
? ? ? ? return {‘pre’: pre_logged,’post’:post_logged}[when]
? ? except KeyError,e:
? ? ? ? raise ValueError(e),’must be “pre” or “post” ‘

@logged(“post")
def hello(name):
? ? print “Hello,”,name

hello(“word!")?

偏函数

通过引用functools 模块中的partial 可以引入偏函数,偏函数的概念就是对原本需要多个参数的函数确定其中一个参数而称为另一个函数:

from operator import add
from functools import partial
add1 = partial(add,1)

此时,add1(5) 就表示add(1,5)

作用域和globa语句

python搜索一个标示符的时候,会先从局部变量开始搜索,如果没有找到,则从上一级搜索,直到没有找到而返回NameError

通过globa关键字,可以将变量推出局部作用域,不通过上述查找过程,而直接引用一个已命名的全局变量。

生成器和yield语句

生成器用yield语句生成迭代器,每个yield语句顺序地使其内容在next()方法中被调用:

def simpleGen():
? ? yield 1
? ? yield 2

此时,simpleGen()就是一个迭代器,simpleGen().next() = 1,simpleGen().next() = 2

除了next()方法获得下一个值,还可以通过send方法来讲值送给生成器:

def counter(start_at = 0):
? ? count = start_at
? ? while True:
? ? ? ? val = (yield count)
? ? ? ? if val is not None:
? ? ? ? ? ? count = val
? ? ? ? else :
? ? ? ? ? ? ?count += 1

count = count(5)

count.next() = 5;count.next() = 6;count.send(9) = 9; count.next() = 10; count.close() ; ?count.next(): StopIteration?

时间: 2024-10-05 02:52:07

Python学习_08_函数式编程的相关文章

Python学习之函数式编程

本文和大家分享的主要是 python开发中函数式编程相关内容,一起来看看吧,希望对大家学习和使用这部分内容有所帮助. 1. python把函数作为参数 import math def  add(x, y, f): return f(x) + f(y) print add(-5, 9, abs) print abs(-5) + abs(9) print add(25, 9, math.sqrt) 2. python中map()函数 map() 是  Python  内置的高阶函数,它接收一个函数 

python学习笔记---函数式编程

1. 函数本身也可以赋值给变量,即:变量可以指向函数. >>> f = abs >>> f(-10) 10 成功!说明变量f现在已经指向了abs函数本身.直接调用abs()函数和调用变量f()完全相同. --> 函数名也可以看作是是变量. 编写高阶函数,就是让函数的参数能够接收别的函数(add(-5, 6, abs)) map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回.

[原创]Python入门学习之函数式编程

一 前言 初次接触函数式编程是在学习分布式计算的时候,那时候对map/reduce是不明觉厉,也没有懂多少原理方面的东西.Python中的函数式编程也算是初步了解一下map/reduce.所谓函数式编程,本质上是可以归结为面向过程的程序设计,但是它的思想很接近数学计算.它比一般的编程范式要更抽象,而且纯粹的函数式编程语言编写的函数是没有变量的,只要确定了输入,那也就确定了输出.它的另外一个特点就是把函数本身作为参数传入到另一个函数中,允许返回一个函数. 二 高阶函数(High-order Fun

Python函数以及函数式编程

本文和大家分享的主要是python 函数及函数式编程相关内容,一起来看看吧,希望对大家 学习python有所帮助. 函数基本语法及特性 定义 数学函数定义: 一般的,在一个变化过程中,如果有两个变量 x 和 y ,并且对于 x 的每一 个确定的值, y都有唯一确定的值与其对应,那么我们就把 x 称为自变量,把 y 称为因变 量, y 是 x 的函数.自变量 x 的取值范围叫做这个函数的定义域. 但编程中的「函数」概念,与数学中的函数是有很  同的  函数是逻辑结构化和过程化的一种编程方法 函数的

一、Python 进阶 之 函数式编程

Python 进阶 之 函数式编程 写在前面 入门阶段的系列笔记传送门 → 进这里 已经掌握了基础的内容如下: 变量和数据类型:Python 内置的基本类型 List 和 Tuple:顺序的集合类型 条件判断和循环:控制程序流程 Dict 和 Set:根据Key访问的集合类型 函数:定义和调用函数 切片:如何对 list 进行切片 迭代:如何用 for 循环迭代集合类型 列表生成式:如何快速生成列表 接下来我要学会: 函数式编程 如何使用 Python 的模块(内置模块和第三方模块) 面向对象编

Python进阶之函数式编程(把函数作为参数)

什么是函数式编程? 什么是函数式编程? 函数:function 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式 函数≠函数式,比如:计算≠计算机 在计算机当中,计算机硬件是最底层的,而越往上语言越高级 低--------------------------------->高计算机硬件-->汇编语言-->c语言-->Python语言 ↓ ↓ ↓ 指令 函数 函数式计算机------------------------>计算(数学) ○ 函数式编程

python 函数和函数式编程

什么是函数 调用函数 创建函数 传入函数 形参 变长参数 函数式编程 变量的作用域 递归 生成器 1 什么是函数 函数是对程序逻辑进行结构化或过程化的一种编程方法.能将整块代码巧妙地隔离成易于管理 的小块,把重复代码放到函数中而不是进行大量的拷贝--这样既能节省空间,也有助于保持一致性,因为你只需改变单个的拷贝而无须去寻找再修改大量复制代码的拷贝. 1.1 过程 vs 函数 在C++里我不记得有过程这种东西,但是在一些其它的语言比如PL/SQL里面会有过程.过程和函数一样是可以调用的代码块,但是

python中的函数式编程与装饰器

2.1 python中的函数式编程 函数式编码的特点 把计算视为函数而非指令 纯函数式编程,不需要变量,没有副作用,测试简单 支持高阶函数,代码简洁 python支持的函数式编程 不是纯函数式编码:允许有变量 支持高阶函数:函数也可以作为变量传入 支持闭包:有了闭包就能返回函数 有限度地支持匿名函数 2.2 python中高阶函数 函数名可以作为变量,如 高阶函数:只能接收函数作为参数的函数 变量可以是指向函数 函数的参数可以接收变量 一个函数可以接收另一个函数作为参数 能接收函数作为参数的函数

Python学习记录-socket编程

Python学习记录-socket编程 学习 python socket Python学习记录-socket编程 1. OSI七层模型详解 2. Python socket 3. socket()函数 4. TCP socket通信流程 5. Python Internet 模块 1. OSI七层模型详解 以上图见:http://blog.csdn.net/yaopeng_2005/article/details/7064869 其它详情可参考:socket网络基础 2. Python sock