Corey
by Corey
~1 min read

Categories

  • articles

Tags

  • Python

Table of Contents

  1. 函数
  2. 装饰器
  3. References

函数

在Python中,一切函数皆对象。函数作为Python中的一等公民,可以进行很多有用的操作:

  • 将函数赋给变量
def greet(name):
    return "hello "+name

greet_someone = greet
print greet_someone("John")

# Outputs: hello John
  • 在函数里定义其他函数
def greet(name):
    def get_message():
        return "Hello "

    result = get_message()+name
    return result

print greet("John")

# Outputs: Hello John
  • 函数可以作为参数传递给其他函数
def greet(name):
   return "Hello " + name 

def call_func(func):
    other_name = "John"
    return func(other_name)  

print call_func(greet)

# Outputs: Hello John
  • 函数可以返回其他函数
def compose_greet_func():
    def get_message():
        return "Hello there!"

    return get_message

greet = compose_greet_func()
print greet()

# Outputs: Hello there!
  • 内部函数可读取外参
def compose_greet_func(name):
    def get_message():
        return "Hello there "+name+"!"

    return get_message

greet = compose_greet_func("John")
print greet()

# Outputs: Hello there John!

装饰器

先看一个形象的例子

class entryExit(object):

    def __init__(self, f):
        self.f = f

    def __call__(self):
        print "Entering", self.f.__name__
        self.f()
        print "Exited", self.f.__name__

@entryExit
def func():
    print "inside func()"

func()

# Outputs: 
# Entering func
# inside func()
# Exited func

装饰器作为一种语法糖可以使用函数作为参数并且返回函数。在这个例子里,Python提供语法糖来连接entryExitfunc函数,省却了func = entryExit(func)这样的繁复表达。一方面提供更加简洁的代码,另一方面不用改变原函数的函数名。

总的来说,装饰器能让你的程序更加优雅。当你需要扩展某个函数,却又不想修改它,尝试下装饰器吧。

References

  1. A guide to Python’s function decorators
  2. Decorators for Functions and Methods
  3. Understanding Python Decorators in 12 Easy Steps!