python全栈开发day12-函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数、global和nonlocal的进一步解析和总结
1.上周回顾
1)、函数名的应用
直接打印函数名,是函数的地址
变量
函数的参数
函数的返回值
可以当容器类数据类型的元素
2)、闭包
内层函数对外层函数的非全局变量的引用,就是闭包。
并返回内部函数或其结果给外部。
3)、装饰器
import time
from functools import wraps def wrapper(f):
@wraps(f)
def inner(*args, **kwargs):
# inner.__name__ = f.__name_
#print(inner.__closure__)
print('login执行前!', f.__name__)
ret = f(*args, **kwargs)
print('login执行后!')
return ret
return inner
装饰器模板
2.函数的有用信息
函数名.__name__
函数名.__doc__
def login(username,password):
"""
这是一个登陆函数,有两个参数
:param username:
:param password:
:return:
"""
print('登陆成功。。。。。') print(login.__name__)
print(login.__doc__)
函数的有用信息,函数名和说明文档
3.带参数的装饰器
import time
def timer_out(flag):
def timer(f):
def inner(*args, **kwargs):
#####
if flag:
start_time = time.time()
time.sleep(0.3)
ret = f(*args, **kwargs)
end_time = time.time()
print('用时%s秒!'% (end_time-start_time))
######
return ret
else:
ret = f(*args, **kwargs)
return ret
return inner
return timer flag = False
@timer_out(flag)
def login(username,password):
"""
这是一个登陆函数,有两个参数
:param username:
:param password:
:return:
"""
print('登陆成功。。。。。') login(1,2)
带参数装饰器例子
4.多个装饰器装饰一个函数
恰当的描述就是俄罗斯套娃!!
from functools import wraps def wrapper1(f):
@wraps(f)
def inner1(*args, **kwargs):
print('wrapper1,login执行前!')
ret = f(*args, **kwargs)
print('wrapper1,login执行后!')
return ret
return inner1 def wrapper2(f):
@wraps(f)
def inner2(*args, **kwargs):
print('wrapper2,login执行前!')
ret = f(*args, **kwargs)
print('wrapper2,login执行后!')
return ret
return inner2 @wrapper2 #login = wrapper1(inner1) ==inner2 login更新变量
@wrapper1 #login = wrapper1(login) ==inner1 login新变量
def login():
print('登陆成功!!!') login()
"""
运行结果:
wrapper2,login执行前!
wrapper1,login执行前!
登陆成功!!!
wrapper1,login执行后!
wrapper2,login执行后!
"""
多个装饰器装饰一个函数的例子

5.global和nonlocal的进一步解析和总结
局部作用域只能引用全局变量而不能修改,如要修改,必须要先声明global,同一层级作用域,全局变量的声明要放在最上面,否则会引起错误。
子函数只能引用父函数的变量,而不能修改,如要修改,要nonlocal下。
def f1():
global x
print(x) # x = 15
# print(x)
def f2():
global x
x =100
print(x)
f2()
print(x)
# global x
x = 300
print(x)
f1()
print(x)
global引用实例
6.作业讲解收获知识点
如果一个函数的默认参数是可变数据类型(如列表[]),无论使用多少次默认参数,都是一个。
def extendlist(var ,li=[]):
li.append(var)
return li list1 = extendlist(10)
list2 = extendlist(123,[])
list3 = extendlist('a') print(list1)
print(list2)
print(list3)
"""
运行结果:
[10, 'a']
[123]
[10, 'a']
"""
这个例子中函数第一次执行时,默认参数li = []是局部变量,执行完成后return后应该是li全局变量,赋值给list1就是全局变量了吧。
7.预习和拓展:
迭代器和生成器:
可迭代对象:
拥有__iter__方法,惰性运算,range()、str、list、tuple、set、dict
迭代器:拥有__iter__方法和__next__方法,
iter(range()),iter(str),iter(list),iter(tuple),iter(dict),iter(set),reversed(list_o),map(func,list_o),filter(func,list_o),file_o
生成器表达式和生成器函数:
列表推导式中的【】换成()就是生成器表达式
函数中有yield和yield from的就是生成器函数。
python全栈开发day12-函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数、global和nonlocal的进一步解析和总结的更多相关文章
- python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)
函数的执行时,*打散.函数的定义时,*聚合. from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(* ...
- python全栈开发-Day12 三元表达式、函数递归、匿名函数、内置函数
一. 三元表达式 一 .三元表达式 仅应用于: 1.条件成立返回,一个值 2.条件不成立返回 ,一个值 def max2(x,y): #普通函数定义 if x > y: return x els ...
- python全栈开发day12
列表 创建列表: 基本操作: 索引 切片 追加 删除 长度 切片 循环 包含 #######################列表list类中提供的方法######################## ...
- python全栈开发 生成器 :生成器函数,推导式及生成器表达式
python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...
- python全栈开发之匿名函数和递归函数
python 匿名函数和递归函数 python全栈开发,匿名函数,递归函数 匿名函数 lambda函数也叫匿名函数,即函数没有具体的名称.是为了解决一些功能很简单需求而设计的一句话函数.如下: #这段 ...
- python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)
python全栈开发笔记第二模块 第四章 :常用模块(第二部分) 一.os 模块的 详解 1.os.getcwd() :得到当前工作目录,即当前python解释器所在目录路径 impor ...
- 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂
Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...
- python全栈开发从入门到放弃之迭代器生成器
1.python中的for循环 l = [1,2,3,4,5,6] for i in l: #根据索引取值 print(i) 输出结果: 1 2 3 4 5 6 2.iterable 可迭代的 可迭 ...
- 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)
点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天) 课程大纲 1.这一期比之前的Python培新课程增加了很多干货:Linux ...
随机推荐
- STM32建立基本项目
1.下载固件库解压 2.Keil建立项目,项目下建立三个文件夹3.各目录下从固件库中拷贝对应的目录 4.修改main.c文件 5.修改C++ 6.修改Include 7,编译.
- loadrunner函数解密之web_reg_find
loadrunner工具的使用,最关键的在于3个地方: A:脚本的编写 B:场景设计 C:性能测试结果分析 其中难度比较大的第一步是:编写脚本,有很多人对于loadrunner里面的各种函数使用的并不 ...
- B - Finding Palindromes (字典树+manacher)
题目链接:https://cn.vjudge.net/contest/283743#problem/B 题目大意:给你n个字符串,然后问你将这位n个字符串任意两两组合,然后问你这所有的n*n种情况中, ...
- B - Fuzzy Search (FFT)
题目链接:https://cn.vjudge.net/contest/281959#problem/B 题目大意:给你n,m,k.然后输入两个字符串,n代表第一个字符串s1,m代表第二个字符串s2,然 ...
- C - 数字配对 (网络流 最大费用最大流)
题目链接:https://cn.vjudge.net/contest/281959#problem/C 题目大意:中文题目 具体思路:用网络流的思想,我们求得是最大的匹配数,那么我们按照二分图的形式去 ...
- Three.js基础探寻二——正交投影照相机
本篇主要介绍照相机中的正交投影照相机. 第一篇传送门:Three.js基础探寻一 1.照相机 图形学中的照相机定义了三维空间到二维屏幕的投影方式. 针对投影方式照相机分为正交投影照相机和透视投影照相机 ...
- 写好shell脚本的13个技巧【转】
有多少次,你运行./script.sh,然后输出一些东西,但却不知道它刚刚都做了些什么.这是一种很糟糕的脚本用户体验.我将在这篇文章中介绍如何写出具有良好开发者体验的 shell 脚本. 产品的最终用 ...
- php数据库的增删改查
1.查询: 数据的显示,这里就可以嵌入php来进行数据的输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
- zabbix通过简单命令监控elasticsearch集群状态
简单命令监控elasticsearch集群状态 原理: 使用curl命令模拟访问任意一个es节点可以反馈的集群状态,集群的状态需要为green curl -sXGET http://serverip: ...
- mysql数据库基于LVM快照的备份
lvm-snapshot: 基于LVM快照的备份 1.事务日志跟数据文件必须在同一个卷上 2.创建快照卷之前,要请求mysql的全局锁,在快照创建完成之后释放锁 3 ...