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的层,不能再定义该变量


目录
打赏
0
0
1
0
40
分享
相关文章
Python学习:内建属性、内建函数的教程
本文介绍了Python中的内建属性和内建函数。内建属性包括`__init__`、`__new__`、`__class__`等,通过`dir()`函数可以查看类的所有内建属性。内建函数如`range`、`map`、`filter`、`reduce`和`sorted`等,分别用于生成序列、映射操作、过滤操作、累积计算和排序。其中,`reduce`在Python 3中需从`functools`模块导入。示例代码展示了这些特性和函数的具体用法及注意事项。
|
13天前
|
Python中的round函数详解及使用示例
`round()`函数是Python内置的用于四舍五入数字的工具。它接受一个数字(必需)和可选的小数位数参数,返回最接近的整数或指定精度的浮点数。本文详细介绍其用法、参数及示例,涵盖基本操作、负数处理、特殊情况及应用建议,帮助你更好地理解和运用该函数。
[oeasy]python069_当前作用域都有些什么_列表dir_函数_builtins
本文介绍了Python中`dir()`函数的使用方法及其作用。`dir()`可以列出当前作用域内的所有变量和成员,类似于`locals()`,但`dir()`不仅限于本地变量,还能显示模块中的所有成员。通过`dir(__builtins__)`可以查看内建模块中的所有内建函数,如`print`、`ord`、`chr`等。此外,还回顾了`try-except-finally`结构在数据库连接中的应用,并解释了为何`print`函数可以直接使用而无需导入,因为它位于`__builtins__`模块中。最后,简要提及了删除`__builtins__.print`的方法及其影响。
28 0
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
python之变量的使用
Python 中变量是对象的引用,赋值即为指向内存中对象。创建对象时,解释器分配内存,引用计数管理内存回收。Python 是动态类型语言,变量类型在运行时确定。对象分为可变与不可变,前者可修改内部状态,后者则不行。命名空间管理变量作用域,确保不同区域的变量独立。
Python编程的函数—内置函数
Python编程的函数—内置函数
35 0
|
10月前
|
Python编程实验四:函数的使用
Python编程实验四:函数的使用
136 0
|
10月前
|
Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
126 0
Python 进阶指南(编程轻松进阶):十、编写高效函数
Python 进阶指南(编程轻松进阶):十、编写高效函数
79 0

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等