码迷,mamicode.com
首页 > 其他好文 > 详细

函数名的应用(第一对象) 闭包 装饰器

时间:2018-08-24 14:51:20      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:全局变量   xiaohua   无限   alt   原来   style   并且   cti   方式   

函数名的应用(第一对象)。
# 1,直接打印函数名得到的是函数的内存地址 <function func1 at 0x0000000002876B70>
# print(func1)
#2,函数名可以赋值运算。
# def func1():
#     print(666)
# f1 = func1
# f1()

# 3, 函数名可以作为函数的参数。
技术分享图片
# def func1():
#     print(666)
#
# def func2(x):
#     x()
#     print(555)
# func2(func1)
技术分享图片

 

 
# 4,函数名可以作为容器类数据类型的元素。
技术分享图片
# def func1():
#     print(666)
#
# def func2():
#     print(222)
#
# def func3():
#     print(111)
#
# def func4():
#     print(777)
# l1 = [func1, func2, func3, func4]
# for i in l1:
#     i()
# dic1 = {
#     1:func1,
#     2:func2,
#     3:func3,
#     4:func4,
# }
# dic1[1]()
技术分享图片

 

 
# 5,函数名可以当做函数的返回值

技术分享图片

技术分享图片  运行流程为再给ret赋值操作时调用了一次func2函数,并把func1函数名赋值给x,此时print 222,并且返回x也就是返回func1,此时:x = func1 = ret,然后执行ret()打印666。

或者写成:

技术分享图片

输出结果一样,x = func1 ,x() = func1()

03,闭包。
# 内层函数对外层函数非全局变量的引用就叫闭包
#判断是不是闭包 函数名.__closure__
# 返回的None则不是闭包,返回的是cell.... 则是闭包
# 闭包有什么用?
#当执行一个函数时,如果解释器判断此函数内部闭包存在,这样
#Python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。

技术分享图片

技术分享图片

 

技术分享图片

技术分享图片

技术分享图片

技术分享图片  关于输出结果:函数内的print打印的都是函数内的name,函数内的name的初始值为sky,在func2的nonlocal name 修改为alex。函数外的print打印的为全局变量,被func3修改后的wit。

from urllib.request import urlopen

def index():
    url = http://www.xiaohua100.cn/index.html
    def get():
        return urlopen(url).read()
    return get

scf = index()
content = scf()
print(content)

技术分享图片

等于 content = index()() 

  print(content)

 

04,装饰器。

#装饰器功能:在不改变原函数的基础上,为原函数增加一些额外的功能,log,登录注册,等等.


测试程序的效率
import time
‘‘‘第一版本,测试函数low‘‘‘
# def login():
#     time.sleep(0.3)
#     print(‘洗洗更健康...‘)
#
# def timmer():
#     start_time = time.time()
#     login()
#     end_time = time.time()
#     print(‘此函数的执行时间%s‘ % (end_time - start_time))
# timmer()
技术分享图片

 

技术分享图片
# 改变了我原来执行函数的执行方式,不好
# def login():
#     time.sleep(0.3)
#     print(‘洗洗更健康...‘)
# # login()
#
# def register():
#     time.sleep(0.4)
#     print(‘洗洗更健康22222...‘)
# # register()
# def timmer(f):
#     start_time = time.time()
#     f()
#     end_time = time.time()
#     print(‘此函数的执行时间%s‘ % (end_time - start_time))
#
# timmer(login)
# timmer(register)
技术分享图片

 

技术分享图片
# 虽然执行函数的方式已经无限接近于原方式,但是更麻烦了,增加了两步代码。改
# def login():
#     time.sleep(0.3)
#     print(‘洗洗更健康...‘)
# # login()
#
# def timmer(f):
#     start_time = time.time()
#     f()
#     end_time = time.time()
#     print(‘此函数的执行时间%s‘ % (end_time - start_time))
#
# f1 = login  # 将login函数名给了f1
# login = timmer  # 将timmer函数名给了login
# login(f1)  # timmer(login)

 

# 初级装饰器
# def login():
#     time.sleep(0.3)
#     print(洗洗更健康...)
# # login()
#
# def timmer(f):  # f = login函数名
#
#     def inner():
#         start_time = time.time()
#         f()  # login()
#         end_time = time.time()
#         print(此函数的执行时间%s % (end_time - start_time))
#     return inner
#
# login = timmer(login)  # inner 此login是新变量
# login()  # inner()
# 简单版装饰器  语法糖
# def timmer(f):  # f = login函数名
#     def inner():
#         start_time = time.time()
#         f()  # login()
#         end_time = time.time()
#         print(‘此函数的执行时间%s‘ % (end_time - start_time))
#     return inner
#
# @timmer  # login = timmer(login)  # inner 此login是新变量
# def login():
#     time.sleep(0.3)
#     print(‘洗洗更健康...‘)
# login()

# @timmer  # register = timmer(register)
# def register():
#     time.sleep(0.2)
#     print(‘洗洗更健康22...‘)
技术分享图片

技术分享图片

 

 

 

函数名的应用(第一对象) 闭包 装饰器

标签:全局变量   xiaohua   无限   alt   原来   style   并且   cti   方式   

原文地址:https://www.cnblogs.com/wenxingxu/p/9529540.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!