python函数-函数进阶

一、命名空间和作用域

1.命名空间

  1. 内置命名空间 —— python解释器
        就是python解释器一启动就可以使用的名字存储在内置命名空间中
        内置的名字在启动解释器的时候被加载进内存里
    全局命名空间 —— 我们写的代码但不是函数中的代码
         是在程序从上到下被执行的过程中依次加载进内存的
        放置了我们设置的所有变量名和函数名
    局部命名空间 —— 函数
        就是函数内部定义的名字
        当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了
  2.  
  3. 在局部:可以使用全局、内置命名空间中的名字
  4.  
  5. 在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
  1. 在内置:不能使用局部和全局的名字的
  2.  
  3. 在正常情况下,直接使用内置的名字
    当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字
    当我自己有的时候 我就不找我的上级要了
    如果自己没有 就找上一级要 上一级没有再找上一级 如果内置的名字空间都没有 就报错
    多个函数应该拥有多个独立的局部名字空间,不互相共享
  1.  

2.作用域

全局作用域:内置命名空间、全局命名空间

局部作用域:局部命名空间

3.global关键字

对于不可变的数据类型,在局部可以查看全局作用域中的变量,但是不能修改,如果想在局部作用域中对全局作用域的不可变数据类型变量进行修改,需要在局部开始加上global声明

  1. x = 1 # 全局作用域的不可变数据类型变量x
  2. def func():
  3. global x # 在局部作用域中对其进行声明
  4. x = 2 # 声明后则可以在局部作用域中对其进行修改操作
  5. func()
  6. print(x) # 局部作用域将全局作用域的不可变数据类型变量修改后,在全局作用域中打印,其值被修改

4.locals()、globals()函数

①globals():输出全局作用域的所有变量

②locals():输出当前作用域的所有变量

  

  1. a = 1
  2. def func():
  3. a = 666
  4. print('函数内部的locals:'+str(locals()))
  5. func()
  6.  
  7. print('函数外部的globals:'+str(globals()))
  8. print('函数外部的locals:'+str(locals()))
  9.  
  10. >>> 函数内部的locals:{'a': 666}
  11. >>> 函数外部的globals:{'__doc__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000653EF0>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, '__spec__': None, '__author__': 'Elijah', '__file__': 'D:/python_fullstack_s9/day10/practice.py', '__date__': '2017/12/27 8:33', 'func': <function func at 0x000000000070E6A8>, 'a': 1, '__package__': None}
  12. >>> 函数外部的locals:{'__doc__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000653EF0>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, '__spec__': None, '__author__': 'Elijah', '__file__': 'D:/python_fullstack_s9/day10/practice.py', '__date__': '2017/12/27 8:33', 'func': <function func at 0x000000000070E6A8>, 'a': 1, '__package__': None}

③global关键字

  1. a = 1
  2. def func():
  3. global a
  4. a = 666
  5. func()
  6.  
  7. print('此时a的值:' + str(a))
  8. >>> 此时a的值:666

④nonlocal和global 

global---在局部声明一个全局变量

nonlocal--在局部声明最近的上一层局部中的变量

  1. nonlocal
  2.  
  3. 1.对全局无效
  4. 2.对局部,也是对最近的一层有影响
  5. 3.只能用于局部变量,找上层中离当前函数最近一层的局部变量
  6. 4.声明了nonlocal的内部函数的变量,修改会影响到离当前函数最近的一层的局部变量

 

  1. a = 0
  2. def func():
  3. #a = 1
  4. def inner():
  5. a = 2
  6. def inner2():
  7. nonlocal a
  8. inner2()
  9. inner()
  10. func()

5.函数的嵌套

  1. def outer():
  2. print('this is outer!')
  3. def inner():
  4. print('this is inner!')
  5. inner()
  6. outer()

6.作用域链 

小范围用变量的时候,先从自己的命名空间查找,找不到就一层一层向外层找,知道找为止,找不到就报错

  1. a = 1
  2. def outer():
  3. a = 1
  4. def inner():
  5. a = 2
  6. def inner2():
  7. nonlocal a #声明了一个上面第一层局部变量
  8. a += 1 #不可变数据类型的修改
  9. inner2()
  10. print('##a## : ', a)
  11. inner()
  12. print('**a** : ',a)
  13.  
  14. outer()
  15. print('全局 :',a)

7.函数名的本质 

①可以被赋值

②可以被当作容器类型的元素

③可以当作函数的参数和返回值

  1. 第一类对象(first-class object)指
  2. 1.可在运行期创建
  3. 2.可用作函数参数或返回值
  4. 3.可存入变量的实体

8.闭包  

①内部函数调用对外部函数,还是嵌套函数称为闭包函数

  1. def outer():
  2. a = 1
  3. def inner():
  4. print(a)
  5. return inner
  6. inn = outer()
  7. inn()

②判断闭包函数的方法__closure__

  

  1. #输出的__closure__有cell元素 :是闭包函数
  2. def func():
  3. name = 'eva'
  4. def inner():
  5. print(name)
  6. print(inner.__closure__)
  7. return inner
  8.  
  9. f = func()
  10. f()
  11.  
  12. #输出的__closure__为None :不是闭包函数
  13. name = 'egon'
  14. def func2():
  15. def inner():
  16. print(name)
  17. print(inner.__closure__)
  18. return inner
  19.  
  20. f2 = func2()
  21. f2()

  

python函数-函数进阶的更多相关文章

  1. python基础 (初识函数&函数进阶)

    函数基础部分 .什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  2. python基础之 初识函数&函数进阶

    函数基础部分 1.什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  3. 【转】Python之函数进阶

    [转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...

  4. 小学生都能学会的python(函数的进阶)

    小学生都能学会的python(函数的进阶) 1. 动态传参 形参: 1. 位置参数 2. 默认值参数 3. 动态传参 *args 动态接收位置参数 **kwargs 动态接收关键字参数 def fun ...

  5. Python之函数进阶

    本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...

  6. day09 python之函数进阶

    楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print ...

  7. python学习——函数进阶

    首先来看下面这个函数. def func(x,y): bigger = x if x > y else y return bigger ret = func(10,20) print(ret) ...

  8. Python之函数——进阶篇

    嵌套函数 ---函数内部可以再次定义函数 ---函数若想执行,必须被调用 注意,下例中,执行结果为什么? age = 19 def func1(): print(age) def func2(): p ...

  9. 9.Python初窥门径(函数初识)

    Python(函数初识) 一.初识函数 面向过程缺点 : 代码重复,代码描述性不高 函数 : 函数是以功能为导向,一个函数封装一个功能. 函数的优点 : 减少代码重复性,增强了代码的可读性 二.函数的 ...

随机推荐

  1. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:对象的多态性

    class A{ // 定义类A public void fun1(){ // 定义fun1()方法 System.out.println("A --> public void fun ...

  2. POJ 2718 Smallest Difference dfs枚举两个数差最小

    Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19528   Accepted: 5 ...

  3. Spring中的BeanPostProcessor和BeanFactoryPostProcessor

    BeanPostProcessor BeanFactoryPostProcessor 标准ioc容器初始化之后的后置处理器 BeanDefintionRegisterPostProcessor 在所有 ...

  4. UAC绕过初探

    笔者最近在学习UAC绕过的技术,通过对其他师傅的文章进行总结,成功利用DLL劫持绕过了UAC,并且可以以High Mandatory Level来启动进程.在此记录下学习过程,笔者也是初次接触,若各位 ...

  5. socket简单调用

    下载 Client using System; using System.Collections.Generic; using System.Linq; using System.Text; //导入 ...

  6. validate表单验证-单独验证

    今天编写一个表单验证程序,我来说一下今天遇到的坑:程序不是通过submit按钮提交验证的,是在自己写的一个方法中提交的,出现了表单无法验证的情况.然后我就了解了一下jquery validate的验证 ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-step-forward

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  8. C语言中可变参数的原理——printf()函数

    函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: 使用过C语言的人所再熟悉不过 ...

  9. 2020牛客寒假算法基础集训营4 I 匹配星星

    https://ac.nowcoder.com/acm/contest/3005/I 又做麻烦了,悲催... 将所有星星按x坐标为第一关键字,z为第二关键字排好序 那么一个z=1的星星匹配的是x比它小 ...

  10. 指令——pwd

    完整的指令的标准格式:Linux通用的格式 #指令主体(空格) [选项](空格) [操作对象] 一个指令可以包含多个选项,操作对象也可以是多个. 指令pwd: 用法:#pwd(print workin ...