程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

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

hfteth 2024-12-30 02:20:38 技术文章 14 ℃

在 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 ** 关键字在嵌套函数中进行变量声明。

Python 闭包

闭包是一个函数对象,即使封闭作用域中的变量值不在内存中,它也能记住这些值。
闭包与普通函数不同,它允许函数通过闭包对那些捕获的变量的值或引用的副本进行访问,即使在这些变量的作用域之外调用该函数。

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

上面的代码中,函数 innerFunction 应当只能在outerFunction 函数范围内被调用,但是通过使用闭包,我们可以轻松扩展其范围,在函数outerFunction之外调用innerFunction。
以下示例是输出函数执行情况的日志,在嵌套函数中返回了另一个函数用于动态输出函数的调用过程。

为什么使用嵌套函数

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

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

Tags:

最近发表
标签列表