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 ...
随机推荐
- Python发邮件的小脚本
# -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText mailto_list = ['hitwh_Gy ...
- C# 实现立体图形变换(vs2008)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- C#析构函数与Dispose
有几种不同的操作方式 方式一: namespace ConsoleApp1 { class Test { ~Test()// 析构函数 { ...
- QA系统Match-LSTM代码研读
QA系统Match-LSTM代码研读 背景 在QA模型中,Match-LSTM是较早提出的,使用Prt-Net边界模型.本文是对阅读其实现代码的总结.主要思路是对照着论文和代码,对论文中模型的关键结构 ...
- js 运动框架及实例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 图片和流的相互转化 (c/s)
//图片转化为流保存: Stream ms; byte[] picbyte; OpenFileDialog open = new OpenFileDialog(); open.Filter = &qu ...
- 如何调整cell的大小
一般情况下,我们使用tableview的时候从来没有设置过cell的大小(w,h).位置(x,y)等,而是系统直接给我们自动生成,但是有的时候我们可能会改动cell的大小及位置,比如:在适配ios6跟 ...
- SILC超像素分割算法详解(附Python代码)
SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...
- SpringMVC的JSON数据交互(七)-@Response,@RestController,@RequestBody用法
1.@RequestBody (自动将请求的数据封装为对象) 作用: @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConve ...
- ROS Kinetic Install on Debian 9
Not Succesed! 1. 配置源$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release - ...