Python全栈__函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数

1、函数的有用信息

  代码1:

 1 def login(username, password):
 2     """
 3     此函数需要用户名,密码两个参数,完成的是登录的功能。
 4     :return: True 登录成功。 False登录失败。
 5     """
 6     print(login.__name__)
 7     print(login.__doc__)
 8     print(‘登录成功...‘)
 9     return True
10
11 print(login.__name__)
12 print(login.__doc__)

函数的有用信息__代码1:

  结果:

D:\Python36\python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/03 函数的有用信息.py"
login

    此函数需要用户名,密码两个参数,完成的是登录的功能。
    :return: True 登录成功。 False登录失败。

Process finished with exit code 0

示例1结果

  代码2:

 1 def wrapper(f):
 2     def inner(*args, **kwargs):
 3         print(f.__name__)
 4         print(f.__doc__)
 5         """执行函数之前的操作"""
 6         ret = f(*args, **kwargs)
 7         """执行函数之后的操作"""
 8         return ret
 9     return inner
10
11 @wrapper
12 def login(username, password):
13     """
14     此函数需要用户名,密码两个参数,完成的是登录的功能。
15     :return: True 登录成功。 False登录失败。
16     """
17     print(‘登录成功...‘)
18     return True
19
20 print(login.__name__)
21 print(login.__doc__)
22 login(1, 2)

函数的有用信息__代码2:

  结果:

D:\Python36\python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/03 函数的有用信息.py"
inner
None
login

    此函数需要用户名,密码两个参数,完成的是登录的功能。
    :return: True 登录成功。 False登录失败。

登录成功...

Process finished with exit code 0

示例2结果

  代码3:

 1 from functools import wraps
 2
 3 def wrapper(f):
 4     @wraps(f)
 5     def inner(*args, **kwargs):
 6         """执行函数之前的操作"""
 7         ret = f(*args, **kwargs)
 8         """执行函数之后的操作"""
 9         return ret
10     return inner
11
12 @wrapper
13 def login(username, password):
14     """
15     此函数需要用户名,密码两个参数,完成的是登录的功能。
16     :return: True 登录成功。 False登录失败。
17     """
18     a = 2
19     c = 4
20     print(‘登录成功...‘)
21     return True
22
23 print(login.__name__)
24 print(login.__doc__)
25 for i in login.__dict__:
26     print(i)
27 print(dir(login))

函数的有用信息__代码3

  结果:

D:\Python36\python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/03 函数的有用信息.py"
login

    此函数需要用户名,密码两个参数,完成的是登录的功能。
    :return: True 登录成功。 False登录失败。

__wrapped__
[‘__annotations__‘, ‘__call__‘, ‘__class__‘, ‘__closure__‘, ‘__code__‘, ‘__defaults__‘, ‘__delattr__‘, ‘__dict__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__get__‘, ‘__getattribute__‘, ‘__globals__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__kwdefaults__‘, ‘__le__‘, ‘__lt__‘, ‘__module__‘, ‘__name__‘, ‘__ne__‘, ‘__new__‘, ‘__qualname__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__wrapped__‘]

Process finished with exit code 0

示例3结果

2、带参数的装饰器

  代码:

 1 def timer_out(flag1):  # falg1 = flag
 2     def timer(f):
 3         def inner(*args, **kwargs):
 4             if flag1:
 5                 start_time = time.time()
 6                 time.sleep(0.3)
 7                 ret = f(*args, **kwargs)
 8                 end_time = time.time()
 9                 print(‘执行效率%s‘ % (end_time - start_time))
10                 return ret
11             else:
12                 ret = f(*args, **kwargs)
13                 return ret
14
15         return inner
16
17     return timer
18
19
20 flag = False
21
22
23 @timer_out(flag)  # 1,步 timer_out(flag) == timer 2,@与timer结合,变成你熟悉的装饰器 @timer
24 def func1():
25     print(111)
26
27
28 @timer_out(flag)
29 def func2():
30     print(222)
31
32
33 @timer_out(flag)
34 def func3():
35     print(333)
36
37
38 func1()
39 func2()
40 func3()

带参数的装饰器__示例:

  结果:

D:\Python36\python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/04 带参数的装饰器.py"
111
222
333

Process finished with exit code 0

示例结果

  局部只能引用全局的变量,不能修改,如果要修改,global。

1 count = 1
2
3 def func4():
4     count = count + 1
5     print(count)
6
7 func4()

global

结果:

D:\Python36\python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/04 带参数的装饰器.py"
Traceback (most recent call last):
  File "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/04 带参数的装饰器.py", line 54, in <module>
    func4()
  File "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/04 带参数的装饰器.py", line 51, in func4
    count = count + 1
UnboundLocalError: local variable ‘count‘ referenced before assignment

Process finished with exit code 1

示例结果

  子函数只能引用父函数的变量,不能修改,如果要修改,nonlocal。

1 def func4():
2
3     count = 3
4     def inner():
5         nonlocal count
6         count = count + 1
7         print(count)
8 func4()

nonlocal

结果:

D:\Python36\python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/04 带参数的装饰器.py"

Process finished with exit code 0

示例结果

3、多个装饰器装饰一个函数

 1 def wrapper1(func): # func = f函数名
 2     def inner1():
 3         print(‘wrapper1 ,before func‘)  # 2
 4         func()
 5         print(‘wrapper1 ,after func‘)  # 4
 6     return inner1
 7
 8
 9 def wrapper2(func):  # func = inner1
10     def inner2():
11         print(‘wrapper2 ,before func‘)  # 1
12         func()  # inner1()
13         print(‘wrapper2 ,after func‘)  # 5
14     return inner2
15
16 @wrapper2  # f = wrapper2(f) 里面的f新变量 = inner1 外面的f最新变量 = inner2
17 @wrapper1  # f = wrapper1(f) 里面的f函数名  外面的f新变量=inner1
18 def f():
19     print(‘in f‘)  # 3
20
21 f() 

示例

  结果:

D:\Python36\python.exe "E:/Python/课堂视频/day12视频与课堂笔记/day12课堂笔记/day12/05 多个装饰器装饰一个函数.py"
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func

Process finished with exit code 0

示例结果

原文地址:https://www.cnblogs.com/ZN-225/p/9124585.html

时间: 2024-10-13 00:06:42

Python全栈__函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数的相关文章

Python全栈__动态参数、名称空间、作用域、作用域链、加载顺序、函数的嵌套、global、nonlocal

1.动态参数 当实参数量与形参数量相等时,参数传递正常. def func1(a, b, c): pass func1(1, 2, 3) 当实参数量与形参数量不相等时,则会报错. def func1(a, b, c): pass func1(1, 2, 3, 4, 5, 6, 6) 用户传入到函数中的实参数量不确定时,或者为了以后扩展,此时要用到动态参数 *args  **kwargs(万能参数). 顺序: 位置参数,*args,默认参数,**kwargs 1.*args *args是接收的是所

Python全栈__函数的初识、函数的返回值、函数的参数

1.函数的初识 def关键字 空格 函数名(与变量名命名规则相同):英文冒号 函数体 执行函数:函数名+() 函数是以功能为导向的. def login(): pass def register(): pass 1 def my_len(): 2 l1 = [1, 2, 3, 1, 6, 9, 10] 3 count = 0 4 for i in l1: 5 count += 1 6 my_len() 2.函数的返回值 return: 1.函数中遇到 return 结束函数,下面代码不执行. d

Python全栈__字典及其操作

1.字典 字典,基础数据类型之一,{}以键值对的形式存储数据. 以key : value 形式存储数据.例如,name 为 key,Laonanhai 为 value. dic = {'name': 'Laonanhai', 'age': 45, 'name_list': ['反面教材', '俊俊', ...] } Python中唯一的映射类型.用以存储大量的关系型数据. 数据类型的分类: 可变类: 可变(不可哈希hash):list.dict.set.例如list = [11, 222, 33

Python全栈__字符串初识及操作

基础数据类型初识 1.int型 int:用于计算. 十进制转化成二进制的有效位数. 1 0000 0001 2 0000 0010 3 0000 0011 ... ... 100 ? 计算十进制转化成二进制的有效位数..bit_length() i = 100 print(i.bit_length()) 2.字符串str str: 'alex'.'1235443543'.'[1,2,3]'.可存放少量数据. 索引.切片.步长 索引编号: python12期 012345678 p 的正向索引编号

Python全栈__数据类型的补充、集合set、深浅copy

1.数据类型的补充 1.1 元组 当元组里面只有一个元素且没有逗号时,则该数据的数据类型与括号里面的元素相同. tu1 = ('laonanhai') tu2 = ('laonanhai') print(tu1, type(tu1)) print(tu2, type(tu2),) tu1 = (1) tu2 = (1,) print(tu1, type(tu1)) print(tu2, type(tu2)) tu1 = ([1, 2, 3]) tu2 = ([1, 2, 3],) print(t

Python全栈__服务器与多客户端通信、UDP协议、pycharm打印带颜色输出、时间同步的机制

1.服务器与多客户端通信 1 import socket 2 # 创建tcp socket的套接字 3 sk = socket.socket() 4 # bind 5 sk.bind(('127.0.0.1',8080)) 6 # 监听 7 sk.listen(5) 8 # 等待连接 9 while 1: 10 conn, addr = sk.accept() 11 while 1: 12 msg_s = input('>>>') 13 conn.send(msg_s.encode('u

python全栈开发-Day8 函数基础

python全栈开发-Day8 函数 一 .引子 1. 为何要用函数之不用函数的问题 #1.代码的组织结构不清晰,可读性差 #2.遇到重复的功能只能重复编写实现代码,代码冗余 #3.功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大  2. 函数是什么? 针对二中的问题,想象生活中的例子,修理工需要实现准备好工具箱里面放好锤子,扳手,钳子等工具,然后遇到锤钉子的场景,拿来锤子用就可以,而无需临时再制造一把锤子. 修理工===>程序员 具备某一功能的工具===>函数

python 第十二天2018.04.01 带参数的装饰器,,函数的有用信息

一.带参数的装饰器,函数的有用信息 def func1(): '''此函数的功能是完成的登陆的功能 return: 返回值是登陆成功与否(true,false) ''' print(333) func1() print(func1.__name__)#func1 print(func1.__doc__)#此函数的功能是完成的登陆的功能,return: 返回值是登陆成功与否 打印函数名 from functools import wraps def wrapper(f): @wraps(f) de

ParisGabriel:Python全栈工程师(0基础到精通)教程 第十五课(函数嵌套、变量作用域)

ParisGabriel 感谢 大家的支持 每天坚持 一天一篇 点个订阅吧  灰常感谢    当个死粉也阔以 Python人工智能从入门到精通 globals()/locals()函数: globals()返回当前全局作用域内变量的字典 locals() 返回当前局部作用域内变量的字典函数变量: 函数名是变量,它在def 语句创建时绑定函数 fa1 = fa 没有括号 绑定函数 fa1 = fa() 返回结果 函数的变量名可以序列交换算法一个函数可以作为另一个函数的实参传递: 例如: def m