python函数的返回值、嵌套方式以及函数中的变量(二)

简介: python函数的返回值、嵌套方式以及函数中的变量(二)

python函数的返回值、嵌套方式以及函数中的变量(一):https://developer.aliyun.com/article/1495711

函数的嵌套

互相嵌套的两个函数:

包裹在外层的叫做外函数,内层的就是内函数

def outer():
    # inner()
    def inner():
        print("我是inner函数")

在外层调用外层函数,如果外层函数没有打印,内层函数有打印,不执行内层函数的打印

在内部调用内部函数,才能打印

#(1)内部函数可以直接在函数外部调用么 不行

#inner()

#(2)调用外部函数后,内部函数可以在函数外部调用吗 不行

#outer()

#inner()

#(3)内部函数可以在函数内部调用吗 可以

outer()

#(4)内部函数在函数内部调用时,是否有先后顺序 有的

#先定义在调用

#在其他语言中有预加载的机制,提前把函数驻留到内存中,然后再去编译脚本内容

#python没有预加载函数的机制,只能先定义在调用;

#外函数是outer 中间函数是inner 最里层是smaller ,调用smaller函数

def outer():
    def inner():
        def smaller():
            print("我是smaller函数")
        smaller()
    inner()
outer()

#多层函数调用,只能层层都调用,才能显示出最内层函数内容,不能断层

以下调用才是正常的

LEGB 原则

def outer():    
    
    def inner():
        
        def smaller():    
            
            print(a)
        smaller()
    inner()
outer()

LEGB原则(就近找变量原则)

#找寻变量的调用顺序采用LEGB原则(即就近原则)

B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)

G —— Global(module); 函数外部所在的命名空间 (全局作用域)

E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)

L —— Local(function);当前函数内的作用域 (局部作用域)

依据就近原则,从下往上 从里向外 依次寻找

即便id未定义,但它是内置函数,在最内层也能调用

nonlocal的使用 (用来修改局部变量)

nonlocal遵循LEGB原则 nonlocal 只能修改局部变量

(1) 它会找当前空间上一层的变量进行修改

(2) 如果上一层空间没有,继续向上寻找

(3) 如果最后找不到,直接报错

(1)它会找当前空间上一层的变量进行修改

def outer():
    a = 10
    def inner():
        nonlocal a
        a = 20
        print(a)
    inner()
    print(a)
outer()

(2)如果上一层空间没有,继续向上寻找

def outer():
    a = 20
    def inner():
        a = 15
        def smaller():
            nonlocal a
            a = 30
            print(a)
        smaller()
        print(a)
    inner()
    print(a)
outer()

#如果有多层定义同一变量,nonloacl找到最近一层的变量,即不再向上寻找,只修改最近一层的变量

(3)如果最后找不到,直接报错

nonlocal 只能修改局部变量,不能修改全局变量

a = 20
def outer():    
    def inner():
        def smaller():
            nonlocal a
            a = 30
            print(a)
        smaller()
        print(a)
    inner()
    print(a)
outer()

error

如果在L,E层未找到该变量的定义,会直接报错

(4) 不通过nonlocal 是否可以修改局部变量呢?

def outer():
    lst = [1,2,3]
    def inner():
        lst[-1] = 3000
    inner()
    print(lst)
outer()

#使用nonlocal,如果多层都有这个变量的定义,只可以修改最近层变量的值

针对可变类型数据也一样,只修改最近层变量的值

不使用nonlocal,当变量是不可变类型,只能修改本层内的变量

不使用nonlocal,当变量是可变类型,可以直接修改各层数据

在使用nonlocal的层,不能再定义该变量


相关文章
|
7天前
|
Python
Python之函数详解
【10月更文挑战第12天】
Python之函数详解
|
2天前
|
Python
python的时间操作time-函数介绍
【10月更文挑战第19天】 python模块time的函数使用介绍和使用。
13 4
|
4天前
|
存储 Python
[oeasy]python038_ range函数_大小写字母的起止范围_start_stop
本文介绍了Python中`range`函数的使用方法及其在生成大小写字母序号范围时的应用。通过示例展示了如何利用`range`和`for`循环输出指定范围内的数字,重点讲解了小写和大写字母对应的ASCII码值范围,并解释了`range`函数的参数(start, stop)以及为何不包括stop值的原因。最后,文章留下了关于为何`range`不包含stop值的问题,留待下一次讨论。
11 1
|
4天前
|
安全 数据处理 数据安全/隐私保护
python中mod函数怎么用
通过这些实例,我们不仅掌握了Python中 `%`运算符的基础用法,还领略了它在解决实际问题中的灵活性和实用性。在诸如云计算服务提供商的技术栈中,类似的数学运算逻辑常被应用于数据处理、安全加密等关键领域,凸显了基础运算符在复杂系统中的不可或缺性。
7 0
|
13天前
|
存储 程序员 Python
Python编程入门:探索变量和数据类型
【10月更文挑战第8天】本文是针对初学者的Python编程入门指南,重点介绍Python中变量的定义和使用以及不同的数据类型。我们将通过实例来理解基本概念,并展示如何在Python程序中应用这些知识。文章旨在帮助初学者建立扎实的基础,使他们能够更自信地编写Python代码。
|
3月前
|
存储 数据采集 人工智能
一:《Python基础语法汇总》— 变量与数据类型
【8月更文挑战第15天】本篇文章详细讲述了关于变量的命名规范,id()函数及Python的数据类型与强制转换
25 2
|
6月前
|
存储 Java Python
python变量、常量、数据类型
python变量、常量、数据类型
|
4月前
|
存储 Python 容器
Python基础语法:变量和数据类型详解(整数、浮点数、字符串、布尔值)
变量和数据类型是Python编程的基础,理解这些概念对于编写高效和正确的代码至关重要。通过本文的介绍,希望你能对Python中的变量和常用数据类型有一个清晰的认识,并能够在实际编程中灵活运用这些知识。
134 13
|
3月前
|
存储 Java 索引
Day 5/100:Python 变量与数据类型
Day 5/100:Python 变量与数据类型
44 0
|
4月前
|
存储 索引 Python
Python新手到高手:变量与数据类型详解
【7月更文挑战第9天】变量与数据类型是Python编程的基石。掌握这些基础概念,能够帮助你更好地理解和编写Python代码。随着学习的深入,你将逐渐学会如何运用这些基础知识来解决更复杂的编程问题。记住,编程是一个不断实践和探索的过程,只有不断地练习和思考,才能从新手成长为高手。