• 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)
  • 相关阅读:
    B. Spreadsheets
    Frequent values 倍增/线段树离散化
    E. Tree Painting 二次扫描换根法
    1405 树的距离之和 二次扫描换根法
    D. Subarray Sorting
    K
    Max answer(单调栈,rmq)
    POJ2823 (单调队列)
    POJ2559(单调栈入门)
    Principles and strategies for mathematics study
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8399710.html
Copyright © 2020-2023  润新知