首页 > 其他分享 >函数补充

函数补充

时间:2024-03-02 15:11:05浏览次数:13  
标签:outer 函数 补充 nonlocal inner print def

函数的嵌套

在Python中,函数可以互相嵌套,即在一个函数内部定义另一个函数。包裹在外层的叫做外函数, 内层的就是内函数。

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

outer()

注意:

  • 内部函数不能直接在函数外部调用。
  • 调用外部函数后,内部函数也不能在函数外部调用。
  • 内部函数可以在函数内部调用,但需要先定义再调用。
  • 在其他语言中有预加载的机制,提前把函数驻留到内存中,然后再去编译脚本内容,但Python没有预加载函数的机制,只能先定义再调用。

例如,外函数是outer,中间函数是inner,最里层是smaller,调用smaller函数:

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

在Python中,查找变量的调用顺序采用LEGB原则(即就近原则):

  • L —— Local(function);当前函数内的作用域 (局部作用域)
  • E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
  • G —— Global(module); 函数外部所在的命名空间(全局作用域)
  • B —— Builtin(Python);Python内置模块的命名空间(内建作用域)

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

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

nonlocal

在Python中,nonlocal关键字用于在嵌套函数中修改上一层函数作用域中的变量。

  • nonlocal遵循LEGB原则,它会找当前空间上一层的变量进行修改。
  • 如果上一层空间没有,继续向上寻找。
  • 如果最后找不到,直接报错。

注意:nonlocal只能修改局部变量。

nonlocal找当前空间上一层的变量进行修改

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

outer()

如果上一层空间没有,nonlocal继续向上寻找

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

outer()

如果最后找不到,nonlocal直接报错

a = 20
def outer():  
    def inner():
        def smaller():
            nonlocal a
            a = 30
            print(a)
        smaller()
        print(a)
    inner()
    print(a)
    
outer()  # This will raise an error

不通过nonlocal是否可以修改局部变量

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

outer()  # This will print [1, 2, 3000]

在这个例子中,我们修改了列表lst的最后一个元素,这是因为列表是可变的数据类型,我们可以直接修改它的元素,而不需要使用nonlocal关键字。

标签:outer,函数,补充,nonlocal,inner,print,def
From: https://www.cnblogs.com/wbcde116/p/18048656

相关文章

  • C++ 拷贝构造函数(初学有点难理解)
    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:通过使用另一个同类型的对象来初始化新创建的对象。复制对象把它作为参数传递给函数。复制对象,并从函数返回这个对象。如果在类中没有定义拷......
  • C++填坑系列——EffectiveModernC++之特殊成员函数
    Chapter移步现代c++之特殊成员函数Item17:Understandspecialmemberfunctiongeneration总结:有必要了解各个函数什么时候自动生成;自动生成的函数有可能产生预期外的行为;特殊成员函数(编译器自动生成):默认构造函数,析构函数,拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋......
  • C++ 类构造函数 & 析构函数
    带参数的构造函数默认的构造函数没有任何参数,但如果需要,构造函数也可以带有参数。这样在创建对象时就会给对象赋初始值,如下面的例子所示:1#include<iostream>2usingnamespacestd;34classLine5{6public:7voidsetLength(doublelen);8......
  • C语言递归调用子函数
    示例代码1:10进制转16进制查看代码 #include<stdio.h>voiddec2hex(intn){ if(n>15) dec2hex(n/16); if(n%16<10) printf("%c",n%16+'0'); else printf("%c",n%16+55); //printf("%c",n%16<10?n%16+'......
  • 函数相关
    对不起,我看到你的原始内容非常详尽,我试图对它进行概括。如果你希望我更全面地转换为Markdown格式,我可以做到。下面是更详细的版本:Python中的函数在Python中,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。1.函数的......
  • Delphi和C的类比:指针、字符串、函数指针、内存分配等
    在学习Delphi的时候,一个很好的建议是和C/C++去类比着学习,从指针,到内存管理,到数组,到面向对象……各个方面,都是有很多可以相似和或者也有不同的方,类比着学习,一方面加深对Delphi的理解,一方面加深对C/C++的理解,一方面加深对计算机系统的理解,一方面加深对面向对象的理解……由1向多可以......
  • 波比较函数
    使用了局部贪心算法加横向损失.目前我认为是最好的时序比较函数.#=====对于波的比较函数的优化muban999=[0,1,1,0,-1,-1,-1,-1,-1,-1,-1,1]beipipei999=[0,1,1,0,-1,0,1,1,1,1]#beipipei999=[0,1,1,0,-1,-1,-1,-1,-1,-1,-1,1]defjisuan_diff(b,m):print(1)changdu......
  • make_classification函数
     sklearn.datasets.make_classificationsklearn.datasets.make_classification(n_samples=100,n_features=20,*,n_informative=2,n_redundant=2,n_repeated=0,n_classes=2,n_clusters_per_class=2,weights=None,flip_y=0.01,class_sep=1.0,hypercube=True,shif......
  • C++ 从函数返回指针
    C++允许从函数返回指针,必须声明一个返回指针的函数:int*myFunction()C++不支持在函数外返回局部变量的地址,除非定义局部变量为static变量。1#include<iostream>2#include<ctime>3#include<cstdlib>4 5usingnamespacestd;6 7//要生成和返回随......
  • Vue学习笔记31--自定义指令--函数式
    Vue学习笔记-自定义指令<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>自定义指令</title&......