Python 内部函数
在 Python 中,函数被视为第一类对象。语言中的第一类对象始终统一处理。它们可以存储在数据结构中,作为参数传递,或者用在控制结构中。如果一种编程语言将函数视为第一类对象,则称其支持第一类函数。Python 支持第一类函数的概念。
一级函数的性质:
- 函数是对象类型的一个实例。
- 您可以将函数存储在变量中。
- 您可以将函数作为参数传递给另一个函数。
- 您可以从函数返回函数。
- 您可以将它们存储在数据结构中,如哈希表、列表等
注意:想了解更多一级物体点击这里。
内部函数
在另一个函数中定义的函数称为inner function
或nested functio
n。嵌套函数能够访问封闭范围的变量。使用内部函数是为了保护它们不受函数之外发生的任何事情的影响。这个过程也被称为Encapsulation
。要了解更多关于封装的信息,请点击此处。
示例:
# Python program to illustrate
# nested functions
def outerFunction(text):
text = text
def innerFunction():
print(text)
innerFunction()
if __name__ == '__main__':
outerFunction('Hey !')
输出:
Hey!
在上面的例子中,innerFunction()被定义在 outerFunction()内部,使其成为一个内部函数。要调用 innerFunction(),我们必须首先调用 outerFunction()。然后,外部函数()将继续调用内部函数(),因为它已经在内部定义过了。
重要的是必须调用外部函数,以便内部函数可以执行。为了证明这一点,考虑下面的例子: 例子:
# Python program to illustrate
# nested functions
def outerFunction(text):
text = text
def innerFunction():
print(text)
innerFunction()
输出:
This code will return nothing when executed.
嵌套函数中变量的范围
我们可以找到一个变量并在需要时访问它的位置叫做变量的作用域。 已知如何访问函数内部的全局变量,但是,访问外部函数的变量呢?让我们看一个例子:
# Python program to
# demonstrate accessing of
# variables of nested functions
def f1():
s = 'I love GeeksforGeeks'
def f2():
print(s)
f2()
# Driver's code
f1()
输出:
I love GeeksforGeeks
在上面的例子中,可以看到它类似于从函数访问全局变量。现在假设你想改变外部函数的变量。
# Python program to
# demonstrate accessing of
# variables of nested functions
def f1():
s = 'I love GeeksforGeeks'
def f2():
s = 'Me too'
print(s)
f2()
print(s)
# Driver's code
f1()
输出:
Me too
I love GeeksforGeeks
可以看出外函数的变量值没有改变。但是,外部函数的变量值可以改变。有不同的方法可以改变外部函数的变量值。
-
Using an iterable –
```py
Python program to
demonstrate accessing of
variables of nested functions
def f1(): s = ['I love GeeksforGeeks']
def f2(): s[0] = 'Me too' print(s)
f2() print(s)
Driver's code
f1() ```
输出:
```py ['Me too'] ['Me too']
```
-
Using nonlocal keyword –
```py
Python program to
demonstrate accessing of
variables of nested functions
def f1(): s = 'I love GeeksforGeeks'
def f2(): nonlocal s s = 'Me too' print(s)
f2() print(s)
Driver's code
f1() ```
输出:
```py Me too Me too
```
-
Value can also be changed as shown in the below example.
```py
Python program to
demonstrate accessing of
variables of nested functions
def f1(): f1.s = 'I love GeeksforGeeks'
def f2(): f1.s = 'Me too' print(f1.s)
f2() print(f1.s)
Driver's code
f1() ```
输出:
```py Me too Me too
```
Python 闭包
闭包是一个函数对象,即使内存中没有值,它也会记住封闭作用域中的值。
- 它是一个存储函数和环境的记录:将函数的每个自由变量(在本地使用,但在封闭范围内定义的变量)与创建闭包时名称绑定到的值或引用相关联的映射。
- 闭包与普通函数不同,它允许函数通过闭包的值或引用副本来访问这些捕获的变量,即使函数在它们的作用域之外被调用。 过滤器 _ 无。
# Python program to illustrate
# closures
def outerFunction(text):
text = text
def innerFunction():
print(text)
return innerFunction # Note we are returning function WITHOUT parenthesis
if __name__ == '__main__':
myFunction = outerFunction('Hey !')
myFunction()
输出:
Hey!
- 从上面的代码可以看出,闭包有助于调用其范围之外的函数。
- 函数 innerFunction 的作用域只在 outerFunction 内部。但是通过使用闭包,我们可以很容易地扩展它的范围来调用它范围之外的函数。
# Python program to illustrate
# closures
import logging
logging.basicConfig(filename ='example.log', level = logging.INFO)
def logger(func):
def log_func(*args):
logging.info(
'Running "{}" with arguments {}'.format(func.__name__, args))
print(func(*args))
# Necessary for closure to work (returning WITHOUT parenthesis)
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)
输出:
6
9
5
10
版权属于:月萌API www.moonapi.com,转载请注明出处