`

Python中的函数、装饰器

 
阅读更多
  • map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
>>> s = ['AASDa', 'dendY']
>>> def formatStr(ss):
return ss[0].upper() + ss[1:len(ss)].lower()
>>> v = formatStr('aaaB')
>>> v
'Aaab'
>>> map(formatStr, s)
<map object at 0x000000000320A668>
>>> for v in map(formatStr, s):
print(v)
Aasda
Dendy

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

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
>>> L = [2, 3, 4]
>>> def prod(a, b):
return a * b
>>>
>>> from functools import *
>>> reduce(prod, L)
24
>>>
  • filter函数,方法同map,目的是过滤list中符合条件的元素:
>>> s = [1, 2, -3, -5]
>>> def notLt0(x):
return x >= 0
>>> filter(notLt0, s)
<filter object at 0x000000000320A940>
>>> for v in filter(notLt0, s):
print(v)
1
2
>>>
如上的示例,定义一个notLt0的方法,该方法用于判断元素是否大于等于0,是则返回True,否则返回False。而filter则会将列表s的每一个元素作为参数调用notLt0方法,最后将所有返回True的元素重新组装成一个list返回。
  • 匿名函数:无须定义函数的名称,格式如下:
fn = lambda 函数参数列表: 函数体
其中fn为返回的匿名函数,例如:
'''
匿名函数
'''
f = lambda x : x * x
print(f(2))
  • 函数的闭包,类似javascript的闭包,即外部函数返回内部函数的引用,内部函数可能持有外部函数变量的引用,例如:
'''
闭包
'''
def count():
fs = []
for i in range(1, 4):
def f():
print(i)
return i * i
fs.append(f)
return fs
f1, f2, f3 = count()
print('before execute...')
print(f1()) # 输出:9
print(f2()) # 输出:9
print(f3()) # 输出:9
print('after execute...')
由于每次执行fn()时,i的值都变为了3,所以输出的结果并非预期的1,4,9,解决这种问题有多种方式,可以再定义一层闭包,也可以将fs中的元素修改为f函数的执行结果,而不是函数引用。
  • 装饰器(decorator),包装目标函数,在不改变原目标函数的情况下,对其进行包装,实现更多的功能。
例如:实现一个打印日志的装饰器:
'''
装饰器
'''
# 定义一个装饰器(decorator)
def log(fn):
def wrapper(*args, **kw):
print('call : %s' % (fn.__name__))
return fn(*args, **kw)
return wrapper
@log
def func():
print ('hello!')
func()
其中,log函数为一个装饰器,除了完成fn函数本身的功能外,还添加了打印日志的功能,log函数返回一个装饰函数wrapper,打印的结果:
call : func
hello!
Python中使用@符号来表示装饰器(不是java的注解,形式类似),在执行func函数时,解释器看到@符号标识,会先执行log方法,并将func函数作为参数,此时func函数依然存在,但是同名的func变量会指向wrapper函数:
print(func.__name__)
输出wrapper,同:
func = wrapper(*args, **kw):
print('call : %s' % (fn.__name__))
return fn(*args, **kw)
所以,执行func()函数其实执行的是wrapper函数。

上边为最简单的装饰器,如果我们要实现可自定义参数的装饰器呢?
# 自定义文本的装饰器
def log(text):
def decorator(fn):
def wrapper(*args, **kw):
print('log : %s, function name : %s. ' % (text, fn.__name__))
fn(*args, **kw)
return wrapper
return decorator
@log('this is a log text.')
def func():
print ('hello!')
func()
print(func.__name__) # 输出:wrapper
如上,我们需要再定义一个函数decorator来接收我们定义的参数信息,除了上边的执行过程外,在调用func函数时,解释器会先执行log和decorator函数,最后在执行wrapper函数,形式如下:
func = log(自定义参数)(func)
  • 偏函数,functools.partial,固定函数参数,形成新的函数:
如果我们需要在转换为int的时候确定进制,Python提供了int方法:
int(x, base = 10)
base为此时x的进制数,默认为10,我们写一个将二进制字符串转换为int的方法:
def int2(x):
return int(x, base = 2)
s = int2('110')
print (s) # 输出6
但是,其实Python已经为我们做了这样的事情,那就是利用functools.partial的方法:
int2 = functools.partial(int, base = 2)
s = int2('110')
print (s) # 输出6
当然,该函数用法有很多,例如将max函数默认与一些元素比较:
max2 = functools.partial(max, 10, 20, 30)
s = max2(1, 2, 3, 40)
print(s) # 输出:40
s = max2(1, 2, 3)
print(s) # 输出:30
这样,max函数在比较的元素中,默认会加入10,20,30了。





分享到:
评论

相关推荐

    Python @函数装饰器及@staticmethod,@classmethod.docx

    在 Python 中,**函数装饰器**是一种特殊的设计模式,它允许开发者在不修改原函数代码的情况下为函数增加额外的功能。装饰器本质上是一个接收函数作为参数并返回新函数的高阶函数。 #### 二、基本语法与原理 函数...

    Python编程 函数装饰器.pdf

    **Python函数装饰器详解** 装饰器是Python编程中一种强大的工具,它允许我们在不修改原始函数源代码的情况下,为其添加额外的功能或行为。这得益于Python的动态性和元编程特性。装饰器是设计模式中装饰模式的实现,...

    Python装饰器限制函数运行时间超时则退出执行

    ### Python装饰器限制函数运行时间超时则退出执行 在实际开发过程中,有时我们需要对某些函数的执行时间进行限制,即如果一个函数的执行超过了预设的时间,那么该函数将被强制停止执行,以避免长时间的阻塞或不必要...

    Python 装饰器实现DRY(不重复代码)原则

    在Python中,装饰器本质上是一个函数,它能够接收另一个函数作为参数,并返回一个新的函数,这个新的函数能够添加一些额外的功能,而不需要修改原函数的代码。装饰器的实现基于闭包(一个函数记住了它被创建时所在的...

    Python 高级函数实训

    - `print_args` 是一个装饰器函数,接受一个函数作为参数,并返回一个新的函数 `wrapper`。 - `@print_args` 表示将 `test` 函数传给 `print_args` 装饰器处理。 - 在调用 `test(5)` 时,首先会执行 `wrapper(5)`,...

    Python装饰器详解:函数增强的利器

    在Python编程中,装饰器是一种非常强大的工具,它允许程序员在不修改原有函数代码的情况下,给函数添加新的功能。装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。这种设计模式使得装饰器成为...

    Python-仅用一个装饰器就可以跟踪一个Python函数执行的本地上下文

    这可以通过装饰器中的函数包装逻辑来实现。下面是一个简单的例子: ```python def trace_local_context(func): def wrapper(*args, **kwargs): print(f"函数 {func.__name__} 开始执行,参数: {args}, {kwargs}")...

    python装饰器的4中类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类

    函数装饰器是最基础的形式,它是一个接收函数并返回新函数的普通函数。装饰器在定义后通常放置在目标函数之上,通过`@decorator_name`语法糖来调用。 ```python def simple_decorator(func): def wrapper(): ...

    python——retry装饰器(csdn)————程序.pdf

    retry 装饰器是指在 Python 中,使用装饰器(decorator)实现函数的重试机制。其主要思想是,在函数执行过程中,如果出现异常,retry 装饰器将捕捉到该异常,并根据设置的重试次数,重新执行该函数,直到函数执行...

    Python中的各种装饰器详解

    Python中的装饰器是一种强大的工具,用于在不修改原始函数代码的情况下扩展或修改其功能。装饰器本质上是一个接收函数作为输入并返回新函数的函数。在Python中,它们主要用于处理类和函数的元编程。 1. **函数式...

    python语言中的函数 高清.pdf版下载

    总的来说,Python中的函数概念包含了丰富的知识点,从内置函数的使用到自定义函数的定义,再到名称空间和作用域的管理,以及闭包函数和装饰器的深入应用,每一个概念都为Python编程提供了强大的支持。掌握这些知识点...

    Python高级编程装饰器的推导及案例

    Python 中,装饰器是具备非常强大的功能,可以在不修改原有函数定义的情况下增加函数的功能。装饰器通常用于日志记录、性能测试、事务处理、缓存、权限校验等场景。装饰器是也可以称作是一个函数,函数作为他的形参...

    python中多个装饰器的调用顺序详解

    一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器。多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则)。 原代码 执行结果 装饰顺序 : 就近原则 被...

    深入学习Python中的装饰器使用

    的确,你可以使用python装饰器来实现装饰器模式,但这绝对是它很小的一部分功能,有点暴殄天物。对于python装饰器,我觉得它是最接近宏的存在。 宏的历史 宏有有着非常悠久的历史,不过大多数人可能会有使用C语言...

    python函数文档_python函数_python文档_python_

    Python函数是Python编程语言的核心元素之一,用于组织代码并使其可重用。它们是执行特定任务的代码块,可以通过调用其名称来执行。在Python中,函数的定义使用关键字`def`,后跟函数名和圆括号,其中可能包含参数。...

    python3函数

    本主题将深入探讨Python3中的各种函数,包括基本语法、高级特性、递归、生成器与迭代器以及闭包和装饰器。 一、基本语法 Python3函数的基本定义使用`def`关键字,后跟函数名和圆括号,其中可以包含参数。例如,定义...

    python类装饰器装饰方法通用编码模型分析.pdf

    python装饰器是一个用于封装函数、方法或类的代码的工具,用来显式指定管理它们的代码。一次编写,可用于多种不同的情况。在python 的流行框架中,装饰器应用越来越广泛。用类设计装饰器,可以利用实例属性保持装饰...

    Python装饰器模式学习demo

    Python装饰器是一种高级编程技巧,它允许我们修改或增强函数、方法或类的行为,而无需对原始代码进行任何更改。装饰器本质上是一个接收一个函数作为输入并返回一个新的函数的函数。这种设计模式在Python中非常常见,...

Global site tag (gtag.js) - Google Analytics