十一. Python基础(11)—补充: 作用域 & 装饰器

1 ● Python的作用域补遗

在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域:

void
main()

{

    //int num = 10;

    if (2 > 1){

        int
num = 100;

    }

    printf("%d", num);

    getchar();

}

//在上面的案例中, printf("%d", num);中的num 会被警示未被声明.

但是, 在Python中, if语句等控制结构(control structure)不会产生新的作用域, 因此, 下面的程序在Python中是可以执行的.

if 2 > 1:

    num = 100

print(num) # 100

※ Python中, 只用三种语句块(block):

A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition.

Python lacks declarations and allows name binding operations to occur anywhere within a code block.

 

2 ● 带参数的装饰器

def outer(flag):

    def wrapper(func): # wrapper是装饰器的名字

        def inner(*args, **kwargs):

            if flag:

                print("被装饰的函数执行之前你要做的事.")

            ret = func(*args, **kwargs) # 被装饰的函数, 返回值为None也写出来

            if flag:

                print("被装饰的函数执行之后你要做的事.")

            return ret

        return inner

    return wrapper

 

@outer(False) # 传True表示不执行装饰器, 传False表示不执行装饰器

def welcome(name): # welcome是被装饰的函数

    print('Welcome:%s!'%name)

 

@outer(False) # 传True表示不执行装饰器, 传False表示不执行装饰器

def home(): # home是被装饰的函数

    print('欢迎来到home页!')

 

welcome("Arroz")

print("===============================")

home()

Welcome:Arroz!

===============================

欢迎来到home页!

 

3 ● 用多个装饰器装饰一个函数

def wrapper1(func):

    def inner():

        print("wrapper1, before func")

        func()

        print("wrapper1, after func")

    return inner

 

def wrapper2(func):

    def inner():

        print("wrapper2, before func")

        func()

        print("wrapper2, after func")

    return inner

 

@wrapper2

@wrapper1

def home():

    print('欢迎来到home页!')

 

home()

'''

wrapper2, before func

wrapper1, before func

欢迎来到home页!

wrapper1, after func

wrapper2, after func

'''

关键是要把握函数扩展功能的执行顺序

 

十一. Python基础(11)—补充: 作用域 & 装饰器的更多相关文章

  1. python基础整理4——面向对象装饰器惰性器及高级模块

    面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...

  2. Python基础(八)装饰器

    今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f ...

  3. python基础语法8 叠加装饰器,有参装饰器,wraps补充,迭代器

    叠加装饰器: 叠加装饰器 - 每一个新的功能都应该写一个新的装饰器 - 否则会导致,代码冗余,结构不清晰,可扩展性差 在同一个被装饰对象中,添加多个装饰器,并执行. @装饰1 @装饰2 @装饰3 de ...

  4. python基础语法_9-1闭包 装饰器补充

    1.闭包的概念 closure:内部函数中对enclosing作用域的变量进行引用,外部函数返回内部函数名   2.函数实质与属性 函数是一个对象:在内存中有一个存储空间 函数执行完成后内部变量回收: ...

  5. Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)

    本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...

  6. Day4 - Python基础4 迭代器、装饰器、软件开发规范

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  7. python基础(八)生成器,迭代器,装饰器,递归

    生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...

  8. python基础16_闭包_装饰器

    不了解是否其他语言也有类似 python 装饰器这样的东西. 最近才发现ECMAScript6也是有生成器函数的,也有 yield  generator 装饰器的基础知识是闭包: # 闭包:嵌套函数, ...

  9. Python基础(6)——装饰器

    装饰器: def w1(func): def inner(): # 验证1 # 验证2 # 验证3 return func() return inner @w1 def f1(): print 'f1 ...

随机推荐

  1. 第 6 章 存储 - 042 - 用 volume container 共享数据

    volume container volume container 是专门为其他容器提供 volume 的容器.它提供的卷可以是 bind mount,也可以是 docker managed volu ...

  2. RabbitMQ消息发布时的权衡

    在进行本篇文章的学习之前,你需要先阅读 https://www.cnblogs.com/duanjt/p/10057330.html.以便对Java访问RabbitMQ的基础用法有所了解. 一.失败通 ...

  3. 7.2内存管理-ARC

    @0-简介 1编译器会自动在适当的地方插入适当的retain.release.autorelease语句 @1-ARC的判断原则 1只要还有一个强指针变量指向对象,对象就会保持在内存中 2强指针   ...

  4. ubuntu16.04+cuda8.0+gpu

    安装完ubuntu系统之后,在学校的环境下,联网需要安装mentohust. 参考: http://www.cnblogs.com/alexanderkun/p/6905604.html http:/ ...

  5. uva10564

    路径条数很好找.记录最小路径,就记录到各点的最小字符串,存储起来. #include <iostream> #include <cstdio> #include <cma ...

  6. 51Nod-1441 士兵的数字游戏

    题目要求是求出a!/b!(a>=b)的结果,让其不断做除法,最多能做多少次.这个问题首先可以转化为求a!中所有质因子个数-b!中所有质因子个数.以前做过一道快速求某个阶乘对一个素数的因子个数的题 ...

  7. java 循环读取文件夹里面的文件

    public ArrayList<String> list = new ArrayList<String>(0);//用arraylist保存扫描到的路径public void ...

  8. Linux中磁盘mbr分区——实践篇

    Linux中磁盘mbr分区——实践篇 fdisk命令 语法 fdisk(选项)(参数) 选项 -b <分区大小> 指定每个分区的大小 -l 列出分区表信息 -v 显示版本信息 参数 设备文 ...

  9. java中String创建对象分析(转)

    String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案 ...

  10. Oracle11g温习-第十六章:用户管理

    2013年4月27日 星期六 10:50 1.概念 (1)schema : user.object    就是用户创建的对象 (2)用户认证方式:                            ...