python全栈闯关--10-2、函数的嵌套和作用域

1、全局作用域函数嵌套

def three_max(a, b, c):
    t = two_max(a, b)  # 函数嵌套调用two_max
    return t if t > c else c
def two_max(a, b):
    return a if a > b else b
print(three_max(1, 2, 3))

程序执行,按照从下往下的顺序,把变量、函数名加入到命名空间,如果还未加入到命名空间,就调用了函数,将会报错。

如上程序,如果把three_max的调用,交换到two_max的前面,将会报错:NameError: name ‘two_max‘ is not defined

def three_max(a, b, c):
    t = two_max(a, b)  # 函数嵌套调用two_max
    return t if t > c else c
print(three_max(1, 2, 3))  # NameError: name ‘two_max‘ is not defined
def two_max(a, b):
    return a if a > b else b

2、内部函数使用外部函数

a = 1
def outer():
    a = 1
    def inner():
        a = 2
        def inner2():
            a = 3
            print("inner2:", a)  # 3
        inner2()
        print("inner:", a)  # 2
    inner()
    print("outer:", a)  # 1
outer()
print(a)

嵌套定义时,每个局部都有自己的命名空间,互相不干扰

子函数定义了和父函数相同的变量,其值都为独立的,修改不影响父函数

global

a = 1
def outer():
    a = 1
    def inner():
        a = 2
        def inner2():
            global a  # 修改的是全局的变量数据
            a = 3
            print("inner2:", a)  # 3
        inner2()
        print("inner:", a)  # 2
    inner()
    print("outer:", a)  # 1
outer()
print(a) # 3

global定义的变量,是全局命名空间的变量

不影响局部的变量

nonlocal

a = 1
def outer():
    # nonlocal a  # 只能对局部作用域变量有效,在最后一个局部报错SyntaxError: no binding for nonlocal ‘a‘ found
    a = 1
    def inner():
        # nonlocal a
        a = 2
        def inner2():
            nonlocal a
            a = 3
            print("inner2:",a)  # 3
        inner2()
        print("inner:", a)  # 3 nonlocal找到上一层的变量进行了更改
    inner()
    print("outer:", a)  # 1
outer()
print(a)  # 定义nonlocal后,全局变量不变依然为1

nonlocal寻找离当前函数最近的一层局部变量

声明了nonlocal的局部变量的改动,会影响最近一层的函数的局部变量

原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11646906.html

时间: 2024-10-11 17:55:55

python全栈闯关--10-2、函数的嵌套和作用域的相关文章

python全栈闯关--15-内置函数

1.作用域相关 print(locals()) print(globals()) # global 关键字,局部变量可以修改全局变量 # nonlocal 关键字,局部函数中,可以修改上一层函数中的变量 2.迭代器相关 next(迭代器) 等价与迭代器.__next__() 3.内置属相查看 dir 查看函数拥有的方法 4.帮忙 help 返回函数的帮助信息 5.程序调度相关 callable 判断函数是否可以执行,如果是函数返回true,是变量,放回false 6.文件操作相关 open 打开

python全栈闯关--XX-细节总结汇总

1.The start value of slice is less than then end value,and the step is negative print("if the start value less then the end value and the step is negative ! " "No error will be reported and empty will be returned, ") for i in range(0,

python全栈闯关--7-基础数据类型汇总、集合、深浅拷贝

1.str s = ' ' print(s.isspace()) # 如果字符串全是空格返回True 2.在循环一个列表时,最好不要删除列表中的元素 删除列表元素,得到的结果,往往不是预期的 例子1: lis = [11, 22, 33, 44, 55] # 循环开始后,按照索引递增,删除了前面的值,不会处理列表索引的位置 # 虽然没有报错,但是不是想要的结果 for i in lis: print("目前删除元素值为:%d " % i) print("值删除前:"

python全栈闯关--11-装饰器初识

1.装饰器形成 当不想修改原函数,未函数前后添加功能时,就可以使用装饰器,在函数前后增加功能. 装饰器的初始形成 import time def timer(f): def inner(): print("我是装饰器,我来装饰了!!!") start = time.time() f() end = time.time() print(start - end) return inner # 返回inner由于f实现了闭包,直接调用了程序 def func(): time.sleep(1)

python全栈闯关--12-装饰器进阶

带参数的装饰器 装饰器使用过程中,如果需要一个参数来判断装饰器是否启用时,就需要传入一个参数,来判断是否启用. 目前装饰器,传输函数名给外部函数做参数,内部函数参数用做调用函数的参数,无法实现参数的传递. 因此,需要在加一层嵌套,来实现参数的传入,装饰器最多三层!!! import time from functools import wraps FLAG = True def out_warpper(flag): def warpper(f): @wraps(f) def w_in(): if

python全栈闯关--5-字典

1.数据类型的划分 数据类型分为:可变数据类型,不可变数据类型 不可变数据类型:元祖.bool.int.str                    可哈希 可变数据类型:list,dic,set                                   不可哈希 2.dic的数据结构 dic key:必须为可哈希数据类型,不可以变数据类型 value:任意数据类型 dic 优点:二分查找,存储大量关系型数据 dic特点:3.6以前无序,3.6后有序 3.dic的增.删.改.查 定义

python全栈闯关--6-小知识点总结

1.python2和python3区别常用整理 # python2print 'abc'# 返回一个列表range()# 返回一个生成器值,不是list.每次只生成一个值,避免暂用很大的内存xrange() # 生成器# 输入raw_input(...) # python3print('abc')# 返回一个迭代值,需要生成列表就需要使用list(range(...))range()input(...) 2.复制 == 比较值是否相等 is 比较,比较的是内存地址 id(内容) >>>

Python全栈之路4--内置函数--文件操作

上节重点回顾: 判断对象是否属于某个类,例如: 列表中有个数字,但是循环列表判断长度,用len会报错;因为int不支持len,所以要先判断属于某个类,然后再进行if判断. # isinstance(对象,类名) 判断变量输入的对象是否是属于这个类 # 方法1: temp = [11, 22, "", " ", []] print(isinstance(temp, (str, list, tuple))) # 一旦对象属于这个后面元组的类中的任何一个 就返回true

python全栈开发-Day13 内置函数

一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以内存地址为准. is运算符用于比较两个对象的身份,等号比较两个对象的值,内置函数type()则返回一个对象的类型 #更多内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii 二.内置函数详情 1.abs