栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python之函数和装饰器

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python之函数和装饰器

一、函数的几种使用方式

1、函数作为对象
2、函数作为另一个函数的入参
3、函数嵌套
4、函数的返回值为函数对象(也称函数闭包,该函数并未执行,直到调用时才执行,返回函数中不要引用任何可能会变化的变量)

def printMessage(message):
    print("Get a message1:{}".format(message))


def func2(func,message):    #函数作为参数
    return func(message)    #返回的是函数调用结果


def func3(message):            #函数嵌套
    def printMessage():
        print("Get a  func3 message:{}".format(message))
    return printMessage()      #返回的是函数调用结果


def func4(message):                #函数的返回值也可以是函数对象
    def printMessage():
        print("Get a func4 message:{}".format(message))
    return printMessage    #返回的是函数对象

sendMessage = printMessage    #函数作为对象
sendMessage("春节")         #调用函数

func2(printMessage,"元宵")   #返回的是函数调用结果
func3("清明")      #

print ("调用func4")
func4("五一")         # 注意,返回的是函数对象,所以不会打印五一
print(func4("五一"))  #只是返回了一个对象

sendMessage2 = func4("hello,五一")   #返回的是函数对象
sendMessage2()   #函数调用


函数闭包注意事项

def count():
    fs =[]
    for i in range(1, 4):
        def func():
            return i *i
        fs.append(func)    #返回的函数对象并没有立刻执行,而是直到调用了f()才执行
    return fs

f1,f2,f3 = count()
print(f1(),f2(),f3())   #打印的是9,9,9

def count2():
    def func(j):
        def f():
            return j *j
        return f
    fs =[]
    for i in range(1,4):
        fs.append(func(i))   #func(i)立刻被执行,因此i的当前值被传入func()
    return fs
f1,f2,f3 = count2()
print(f1(),f2(),f3())  #打印的是1,4,9
二、装饰器

装饰器:通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改。
用途:身份认证、日志记录、输入合理性检查以及缓存等。

import functools

def my_decorator(func):
    def printMessage(*args,**kwargs):   #接受任意数量和任意参数类型
        print("get a deractor message ")
        func(*args,**kwargs)
    return printMessage       #返回的是函数对象


def my_decorator2(func):
    @functools.wraps(func)    #调用该装饰器,不改变函数名称
    def printMessage(*args,**kwargs):   #接受任意数量和任意参数类型
        print("get a deractor message ")
        func(*args,**kwargs)
    return printMessage       #返回的是函数对象

def greet(message):
    print("greet {}".format(message))

@my_decorator    #装饰器
def greet2(a,b,c):
    print("greet {},{},{}".format(a,b,c))

@my_decorator2    #装饰器
def greet3(a,b,c):
    print("greet {},{},{}".format(a,b,c))

print("---函数方式调用---")
d = my_decorator(greet)
d("中秋")
print("函数名称:",greet.__name__)   #函数调用后,没有改变函数名称

print("---装饰器方式调用---")
greet2("国庆",1949,["10月","1日"])
print("函数名称:",greet2.__name__)    #装饰器调用后,改变了函数名称


print("---装饰器方式调用2,不改变函数名称---")
greet3("元旦",1,["月","1日"])
print("函数名称:",greet3.__name__)    #装饰器调用后,改变了函数名称

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/948403.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号