zoukankan      html  css  js  c++  java
  • 13_函数进阶

    一、Python执行流程

    分析一下Python内部的执行原理

    1 name = 'zhangsan'
    2 def func():
    3     name = 'lisi'
    4     age = 20
    5     print('%s %d'%(name,age))
    6 
    7 func()

    在python代码运行的时候,Python解释器会想系统申请一块内存,Python从上至下逐行翻译,遇到变量,会把变量和变量值的对应记录到内存中,遇到函数定义的时候,解释器只把函数名读入到内存,表示只当这个函数已经存在,至于函数内部的变量和逻辑,解释器根本不关心。

    遇到函数调用,解释器会再开辟一块内存来存储这个函数里边的内容,这个时候才会关注函数里面的变量。函数内部的变量会被存储在新开辟的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存会被释放。

    二、名称空间和作用域

    2.1名称空间一共分为三种:

    全局名称空间:每个py拥有自己的名称空间,他记录了变量,包括类、函数和其他调用的模块,上面程序中:name就位于全局名称空间

    局部名称空间:每个函数拥有自己的名称空间,他记录了函数的变量,参数、局部定义的变量。上面程序中:func()函数中name和age位于局部名称空间

    内置名称空间:Python内置的函数,任何模块都可以调用它,比如print() len() count()等

    2.2名称空间的加载顺序和取值顺序:

    加载顺序:

    先加载内置名称空间(程序加载前)、其次是全局名称空间(程序运行中:从上至下),最后是局部名称空间(程序调用函数时,才会被加载)。

    取值顺序:

    局部名称空间,全局名称空间,最后是内置名称空间

    程序在寻找变量时,从小范围,一层一层到大范围寻找。

    name = 'zhangsan'
    def func():
        name = 'lisi'
        age = 20
        print('%s %d'%(name,age))
    
    func()

    从程序的打印可以看出,name 是  lisi。

    三、作用域

    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

    全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效。

    局部作用域:局部名称空间,只在局部范围有效。

     globals和locals方法

    print(globals())
    print(locals())
    View Code
    def func():
        a = 12
        b = 20
        print(locals())
        print(globals())
    
    func()
    View Code

    global关键字,nonlocal关键字。

    global:

      1,声明一个全局变量。

      2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。

    1 name = 'zhangsan'
    2 def func():
    3     global name
    4     name = 'lisi'
    5     age = 20
    6 func()
    7 
    8 print(name) # name 就是 lisi

    nonlocal:

      1,不能修改全局变量。

      2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

    四、函数的嵌套调用和作用链

    4.1函数的嵌套调用

    函数的嵌套调用

     1 def max2(*args):
     2     return args[0] if args[0] > args[1] else args[1]
     3 def max4(*args):
     4     ret = max2(args[0],args[1])
     5     ret1 = max2(ret,args[2])
     6     ret2 = max2(ret1,args[3])
     7     return ret2
     8 
     9 ret = max4(23,-7,31,11)
    10 print(ret)
  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8399710.html
Copyright © 2011-2022 走看看