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的进一步解析和总结的更多相关文章

  1. python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)

    函数的执行时,*打散.函数的定义时,*聚合. from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(* ...

  2. python全栈开发-Day12 三元表达式、函数递归、匿名函数、内置函数

    一. 三元表达式 一 .三元表达式 仅应用于: 1.条件成立返回,一个值 2.条件不成立返回 ,一个值 def max2(x,y): #普通函数定义 if x > y: return x els ...

  3. python全栈开发day12

    列表 创建列表: 基本操作: 索引 切片 追加 删除 长度 切片 循环 包含 #######################列表list类中提供的方法######################## ...

  4. python全栈开发 生成器 :生成器函数,推导式及生成器表达式

    python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...

  5. python全栈开发之匿名函数和递归函数

    python 匿名函数和递归函数 python全栈开发,匿名函数,递归函数 匿名函数 lambda函数也叫匿名函数,即函数没有具体的名称.是为了解决一些功能很简单需求而设计的一句话函数.如下: #这段 ...

  6. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  7. 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂

    Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...

  8. 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  可迭代的 可迭 ...

  9. 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)

    点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天) 课程大纲 1.这一期比之前的Python培新课程增加了很多干货:Linux ...

随机推荐

  1. Bootstrap -- 文件上传插件File Input的使用

    BootstrapFileInput下载参考:http://www.jq22.com/jquery-info5231 网友经验参见:http://www.cnblogs.com/wuhuacong/p ...

  2. 二、主目录 Makefile 分析(1)

    2.1 uboot 版本号 uboot 的版本号分三个级别: VERSION:主版本号 PATCHLEVEL:次版本号,为补丁级别 SUBLEVEL:再次版本号 EXTRAVERSION:附加版本信息 ...

  3. IDA Pro使用技巧

    DA Pro基本简介 IDA加载完程序后,3个立即可见的窗口分别为IDA-View,Named,和消息输出窗口(output Window). IDA图形视图会有执行流,Yes箭头默认为绿色,No箭头 ...

  4. js委托事件和代理事件

    转载出处:https://www.cnblogs.com/liugang-vip/p/5616484.html js中的事件委托或是事件代理详解 起因: 1.这是前端面试的经典题型,要去找工作的小伙伴 ...

  5. CF1009F Dominant Indices

    传送门 还是放个链接让泥萌去学一下把 orzYYB 题目中要求的\(f_{x,j}\),转移是\(f_{x,j}=\sum_{y=son_x} f_{y,j-1}\),所以这个东西可以用长链剖分优化, ...

  6. POJ 2503 Babelfish (STL)

    题目链接 Description You have just moved from Waterloo to a big city. The people here speak an incompreh ...

  7. CDH集群中YARN的参数配置

    CDH集群中YARN的参数配置 前言:Hadoop 2.0之后,原先的MapReduce不在是简单的离线批处理MR任务的框架,升级为MapReduceV2(Yarn)版本,也就是把资源调度和任务分发两 ...

  8. python - 包装 和 授权

    包装 # 包装(二次加工标准类型) # 继承 + 派生 的方式实现 定制功能 # 示例: # class list_customization(list): #重新定制append方法,判断添加的数据 ...

  9. Linux定时任务调度

    ⒈概述 任务调度:是指系统在某个时间执行的特定的命令或程序 分类:1)系统任务:有些重要的工作必须周而复始的执行,例如病毒扫描等 2)用户任务:个别用户可能希望定时执行某些程序,例如mysql定时备份 ...

  10. eMMC基础技术8:操作模式1-boot mode

    1.前言 eMMC总线操作包含: boot mode device identification mode interrupt mode data transfer mode 本文主要描述boot m ...