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 ...
随机推荐
- Bootstrap -- 文件上传插件File Input的使用
BootstrapFileInput下载参考:http://www.jq22.com/jquery-info5231 网友经验参见:http://www.cnblogs.com/wuhuacong/p ...
- JS——页面倒计时跳转
Js几秒后倒计时跳转 <html><head><title>出错啦~~~</title><link href="css/login1.c ...
- MySQL指令
在mysql里:文件夹就是数据库 文件就是表 创建用户: 格式:create user '用户名'@'IP地址' identified by '密码'; 说明:IP地址是用来限制用户只能在哪 ...
- 组合框QGroupBox
样式: 注意:内部必须使用布局控件 import sys from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap from PyQt5. ...
- adb不识别设备(手机)的若干情形及解决方法
1.执行adb root 提示adb: unable to connect for root: no devices/emulators found:执行adb devices ,List下无设备 ...
- ppt 制作圆角三角形
制作圆角三角形: PART 01 :插入三角形与三个等大的圆形: PART 02 :利用[任意多边形]和[合并形状-剪除]获得缺三角: (先选中大三角形,然后再选中任意多边形,"格式&quo ...
- 【Python】批量查询-提取站长之家IP批量查询的结果加强版本v3.0
1.工具说明 写报告的时候为了细致性,要把IP地址对应的地区给整理出来.500多条IP地址找出对应地区复制粘贴到报告里整了一个上午. 为了下次更好的完成这项重复性很高的工作,所以写了这个小的脚本. 某 ...
- [转] bss段、data段、text段
1.前言 一个程序本质上都是由 BSS 段.DATA段.TEXT段三个组成的. 本文主要分编译时和运行时分别对 对data段 bss段 text段 堆 栈作一简要说明 2. 程序编译时概念说明 程序与 ...
- 【转】snprintf()函数使用方法
众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf. 注:sprintf()函数:int sprintf( char *buffer, const ...
- WampServer配置
本机php环境搭建教程:windows环境下wampserver的配置教程--超级详细 对于初做PHP网站的朋友来说,第一步肯定是希望在自己电脑是搭建PHP环境,省去空间和上传的麻烦!但搭建环境也不是 ...