一学就废|Python基础碎片,函数嵌套

        在 Python 中,函数被视为一等公民。意味着在python中,函数在整个过程中被统一处理。它们可以存储在数据结构中、作为参数传递或在控制结构中使用。

        函数具有以下特征:

  • 函数是对象类型的一个实例。
  • 可以将函数存储在一个变量中。
  • 你可以将函数作为参数传递给另一个函数。
  • 你可以从一个函数中返回另一个函数。
  • 你可以将它们存储在诸如哈希表、列表等数据结构中。

嵌套函数

        将一个函数定义在另一个函数中被称为嵌套函数。嵌套函数可以访问封闭范围的变量。使用嵌套函数是为了保护它们免受函数外部造成的影响。

# Python program to illustrate nested functions 
def outerFunction(text): 
    text = text 
  
    def innerFunction(): 
        print(text) 
  
    innerFunction() 
  
if __name__ == '__main__': 
    outerFunction('Hey !')

        在上面的示例中,innerFunction()已在 outerFunction()中定义,使其成为内部函数。要调用 innerFunction(),我们必须首先调用 outerFunction()。outerFunction()将继续调用 innerFunction(),因为它已在其中定义。重要的是必须调用外部函数,以便内部函数可以执行。

嵌套函数中的变量范围

        我们可以找到变量并在需要时访问它的位置称为变量的范围。我们知道如何访问函数内部的全局变量,但是,如何访问外部函数的变量呢?

def f1():
    s = 'hello world'
    
    def f2():
        s = '你好'
        print(s)
        
    f2()
    print(s)

# Driver's code
f1()

你好
hello world

        在上述示例中,可以看到,f1和f2都定义了s变量,s是不可变类型,s在各自的函数范围内起作用,不会被相互改变。

        如果将s换成可变数据类型,结果就不一样了。

def f1():
    s = ['hell world']
    
    def f2():
        s[0] = '你好'
        print(s)
        
    f2()
    print(s)

# Driver's code
f1()

['你好']
['你好']

        以上示例中,变量s换成了列表类型,嵌套函数改变了s变量的值。当s为不可变类型如字符串时,嵌套的函数也可以改变s变量的值,我们可以使用nonlocal关键字在嵌套函数中进行变量声明。

def f1():
    s = 'hello world'
    
    def f2():
        nonlocal s
        s = '你好'
        print(s)
        
    f2()
    print(s)

# Driver's code
f1()

你好
你好

Python 闭包

        闭包是一个函数对象,即使封闭作用域中的变量值不在内存中,它也能记住这些值。

        闭包与普通函数不同,它允许函数通过闭包对那些捕获的变量的值或引用的副本进行访问,即使在这些变量的作用域之外调用该函数。

def outerFunction(text): 
    text = text 
  
    def innerFunction(): 
        print(text) 
  
    return innerFunction 
  
if __name__ == '__main__': 
    myFunction = outerFunction('你好') 
    myFunction()

你好

        上面的代码中,函数 innerFunction 应当只能在outerFunction 函数范围内被调用,但是通过使用闭包,我们可以轻松扩展其范围,在函数outerFunction之外调用innerFunction。

        以下示例是输出函数执行情况的日志,在嵌套函数中返回了另一个函数用于动态输出函数的调用过程。

def logger(func): 
    def log_func(*args): 
        print('Running "{}" with arguments {}'.format(func.__name__, args)) 
        print('result:',func(*args)) 
    # 闭包起作用的关键,返回函数
    return log_func               
  
def add(x, y): 
    return x + y 
  
def sub(x, y): 
    return x-y 
  
add_logger = logger(add) 
sub_logger = logger(sub) 
  
add_logger(3, 3) 
add_logger(4, 5) 
  
sub_logger(10, 5) 
sub_logger(20, 10)

##结果
Running "add" with arguments (3, 3)
result: 6
Running "add" with arguments (4, 5)
result: 9
Running "sub" with arguments (10, 5)
result: 5
Running "sub" with arguments (20, 10)
result: 10

为什么使用嵌套函数

内部类在 Python 中被使用有几个原因:

  • 封装:将一个类封装在另一个类中,提供更好的结构并隐藏内部类以防止外部访问。
  • 逻辑分组:将相关的类分组在一起,使代码更加模块化和更易于理解。
  • 访问外部类:内部类可以访问外部类的成员,这在某些设计模式中很有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码路刺客

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值