day11 闭包函数和装饰器

时间:2022-09-07 17:20:16

1.函数不是新知识点 主要是学习函数的用法

在面向对象编程中,一切皆对象,函数也不例外

具体的表现

1.函数可以引用

2.函数可以作为函数的参数

3.函数可以作为函数的返回值

4.可以被存储到容器类型中

def func1():

  pass

a=func()

def func(func):

  func()

func2(func1)

def func3():

  return func1

def fun5():

  print('func5 run')

li2 = [func5]

li2[2]()

day11 闭包函数和装饰器

2.函数的嵌套

1.定义的嵌套,在一个函数的定义内再定义函数

def f1():

  print('f1')

  def f2():

    print('f2')

  f2()

f1()

2.嵌套的调用,先定义好函数,在其他函数体内调用

def f1():

  print('f1')

def f2():

  print('f2')

  f1()

f2()

名称空间就是一个字典,专门存储名称的空间,不仅存储名字,还要知道内存地址

名称空间分类

1.内置名称空间,存储解释器的一些名称与值的对应关系

(python 解释器启动时创建,所有代码全部执行完毕,关闭解释器时销毁)

2.全局名称空间  文件级别的名称,只要你的名字的定义是顶着最左边写的就是全局空间

(执行py文件时创建全局名称空间,所有文件中的代码全部执行完毕,关闭解释器时销毁)

除了内置和函数内,都在全局名称空间中

3.局部名称空间:只要是在函数内的名称都是局部的

(调用函数时创建,函数执行完毕就销毁)

名称空间的加载顺序

内置-》全局-》局部

名称的查找顺序

局部-》全局-》内置的

3.作用域

域就是范围的意思

全局名称空间和内置名称空间,在使用上没有区别

局部的和全局/内置的就有区别了:局部定义的只能在局部使用

给三个空间划分范围

全局的内置的可以划分为同一个范围

global表示全局范围,就是所谓的全局作用域

局部的单独划分为一个范围

local局部作用域

查看全局作用域的内容globals()

查看局部作用域的内容 注意,你在全局作用域使用locals看到的就是全局的内容,域glaobals没有区别

函数locals()

a = 'aasdasd'

print()

查看全局作用域中的内容

print(dir(globals()["__builtins__"]))

查看局部作用域中的内容 注意 你在全局中使用locals 看到的就是全局的内容,与globals没有区别

关键字

global #声明要使用全局中的变量名

nonlocal #明确声明 要使用上一层的a,如果上一层没有,则找上上层,但是注意,不能找全局中的

age=18

def func2():

  #明确声明 要使用全局中的age

  global age

  age = 19

  print(age)

fun2()

print(age) #因为局部名称空间中用了global,所以直接用的全局变量age,直接被修改了

def f1():

  #age = 19

  def f2():

    nonlocal age #会报错,因为往上层找没有找到age

    print(age)

  f2()

f1()

print(age)

4.闭包函数

如下就是一个闭包函数

def fun1():

  age = 18

  def inner():

    print('hello')

    print(age)

  在返回这个内部的函数时 不是单纯的返回函数 还把函数中访问的局部名称一起打包了

  相当于将内部函数域访问的数据打包在一起了 闭包这个名字就是这么得来的

  return inner

f=fun1()

函数的作用域在定义时就固定了,与调用的位置没有关系

闭包函数的模版

def fun2():

  a = 1

  b=10

  def inner():

    print(a)

    print(b)

    print(c)

  return inner

f = fun2()

#__closure__用于访问闭包函数 打包的数据

什么是闭包函数

1.定义在另一个函数内的函数

2.内部的函数访问了外部的名称(数据) 注意 不包含全局的

5.装饰器

什么是装饰 给一个已有的对象(一个函数)添加新的功能

为什么要装饰:为了 增强功能

器:指一个工具,在python中,值得是具备某个功能的函数

简单的说:装饰器是一个用于其他函数增加功能的函数

开闭原则

指的是对扩展开放,对修改封闭(可以添加新功能,但不能修改原代码和代码的调用方式)

用户程序的用户

用框架的用户

print(time.time())返回一个时间戳,指的是1970年1月1日(unix元年)到现在一共经过的秒数

mac是Linux 内核,linux是unix的一个分支

装饰器和闭包函数的关系:装饰器是一种设计代码的套路(不修改源代码和调用方式的情况下,增加功能)

要完成装饰器就需要使用闭包函数

装饰器不是闭包,闭包也不是装饰器,只是通过闭包函数完成装饰器的设计

把旧功能的函数传进闭包函数,加好新功能,返回闭包函数,这样在下次调用时,其实是在调用改版的旧函数

装饰模式

def otter(func):

  def inner():

    在调用原始函数前,添加新功能  

    func()

  return inner

download = otter(download)

download()

既遵守了开闭原则,又添加了新功能

day11 闭包函数和装饰器

day11 闭包函数和装饰器的更多相关文章

  1. python基础-闭包函数和装饰器

    闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...

  2. Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器

    目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...

  3. 【Python3的命名空间与作用域,闭包函数,装饰器】

    一.命名空间与作用域 命名空间是名字和对象的映射,就像是字典,key是变量名,value是变量的值 1.命名空间的定义 name='egon' #定义变量 def func(): #定义函数 pass ...

  4. day11_7.11 闭包函数与装饰器

    补充: callable 代表可调用的,加括号可以执行.(函数或者类) import this  查看python之禅 一.闭包函数 所谓闭包函数,就是定义在函数内部的函数,也就是函数定义的嵌套.而在 ...

  5. CSIC_716_20191112【闭包函数和装饰器】

    闭包函数 什么是闭包函数:闭包函数是函数嵌套.函数对象.名称空间和作用域的集合体. 闭包函数必须在函数内部定义,闭包函数可以引用外层函数的名字. # _*_ coding: gbk _*_ # @Au ...

  6. Python--day13(函数嵌套定义,global、nonlocal、闭包函数、装饰器)

    今日主要内容 1.  函数的嵌套定义 2.  global.nonlocal关键字 3.  闭包及闭包的应用场景 4. 装饰器 1.  函数的嵌套定义 概念:在一个函数的内部定义另一个函数 为什么要有 ...

  7. python---基础知识回顾(二)(闭包函数和装饰器)

    一.闭包函数: 闭包函数: 1.在一个外函数中定义了一个内函数 2.内函数里运用了外函数的临时变量,而不是全局变量 3.并且外函数的返回值是内函数的引用.(函数名,内存块地址,函数名指针..) 正确形 ...

  8. Python之闭包函数、装饰器

    1.闭包函数 #作用域关系在函数定义阶段时就已经固定死了,与调用位置无关 # 即:在任意位置调用函数都需要跑到定义函数时寻找作用域关系 # def f1(): # x=1 # def inner(): ...

  9. python基础之闭包函数与装饰器

    闭包函数: 什么是闭包函数: 闭指的是定义在一个函数内部 包指的是该函数包含对外部作用域(非全局作用域)名字的引用 def counter(): n=0 def incr(): nonlocal n ...

随机推荐

  1. tomcat 8在win8.1中的配置

    配置jdk: 三个步骤: 1.环境变量=>新建 JAVA_HOME C:\Program Files\Java\jdk1.8.0_40 2.环境变量=>新建 CLASS_PATH .;%J ...

  2. 全面理解Javascript中Function对象的属性和方法

    http://www.cnblogs.com/liontone/p/3970420.html 函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这 ...

  3. c#如何区分静态只读变量和常量

    常量const 常量就是一个其值永远不会改变的静态字段.常量的值会在编译时自动推算,编译器会在遇到常量时,将其逐个替换为该常量的值.常量可以是C#内建的任何数字类型或枚举类型.声明一个常量的时候必须对 ...

  4. 优化sql语句

    关于数据库sql语句的优化? 这个链接可以看 涉及数据库的操作基本都是变得很慢了, 所以通常说数据库是程序的瓶颈 测试/优化数据库/sql的方法: 把order排序.where条件等一个一个去除法来做 ...

  5. String类型方法

    String类型 //1.返回长度 length var a="lynn_hello"; console.log(a.length); //2.相加 concat() 返回一个新的 ...

  6. 开源数据库连接池proxool

    可以根据自己的实际情况,选择不同的配置,可以选择properties.XML.Servlet等配置,官方网站上都有介绍.   1.下载proxool 地址:http://proxool.sourcef ...

  7. HTML之<!DOCTYPE> 标签介绍

    实例: <!DOCTYPE html> <html> <head> <title>文档的标题</title> </head> & ...

  8. Android(java)学习笔记216:多线程断点下载的原理(Android实现)

    之前在Android(java)学习笔记215中,我们从JavaSE的角度去实现了多线程断点下载,下面从Android角度实现这个断点下载: 1.新建一个Android工程: (1)其中我们先实现布局 ...

  9. openstack私有云布署实践【6 RabbitMQ】

    生产环境建议在集群三台controller上做rabbitmq 使用到队列的openstack组件 OpenStack Compute OpenStack Block Storage OpenStac ...

  10. java web中filter分析

    摘自博客园,博主孤傲苍狼 一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp ...