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. Python发邮件的小脚本

    # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText mailto_list = ['hitwh_Gy ...

  2. C# 实现立体图形变换(vs2008)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. C#析构函数与Dispose

    有几种不同的操作方式 方式一: namespace ConsoleApp1 {     class Test     {         ~Test()// 析构函数         {        ...

  4. QA系统Match-LSTM代码研读

    QA系统Match-LSTM代码研读 背景 在QA模型中,Match-LSTM是较早提出的,使用Prt-Net边界模型.本文是对阅读其实现代码的总结.主要思路是对照着论文和代码,对论文中模型的关键结构 ...

  5. js 运动框架及实例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 图片和流的相互转化 (c/s)

    //图片转化为流保存: Stream ms; byte[] picbyte; OpenFileDialog open = new OpenFileDialog(); open.Filter = &qu ...

  7. 如何调整cell的大小

    一般情况下,我们使用tableview的时候从来没有设置过cell的大小(w,h).位置(x,y)等,而是系统直接给我们自动生成,但是有的时候我们可能会改动cell的大小及位置,比如:在适配ios6跟 ...

  8. SILC超像素分割算法详解(附Python代码)

    SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...

  9. SpringMVC的JSON数据交互(七)-@Response,@RestController,@RequestBody用法

    1.@RequestBody   (自动将请求的数据封装为对象) 作用: @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConve ...

  10. ROS Kinetic Install on Debian 9

    Not Succesed! 1.  配置源$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release - ...