本文概述
- 内部功能
- 嵌套函数中变量的范围
- Python闭包
一级函数的属性:
- 函数是对象类型的实例。
- 你可以将函数存储在变量中。
- 你可以将该函数作为参数传递给另一个函数。
- 你可以从函数返回函数。
- 你可以将它们存储在哈希表, 列表等数据结构中。
内部功能 在另一个函数中定义的一个函数称为内部功能or嵌套函数。嵌套函数能够访问封闭范围的变量。使用内部函数, 以便可以保护它们免受该函数外部发生的一切影响。此过程也称为封装形式。进一步了解封装点击这里.
例子:
# Python program to illustrate
# nested functions
def outerFunction(text):
text = text def innerFunction():
print (text) innerFunction() if __name__ = = '__main__' :
outerFunction( 'Hey !' )
输出如下:
Hey!
在上面的示例中, 在innerFunction()内部定义了innerFunction(), 使其成为内部函数。要调用innerFunction(), 我们必须首先调用externalFunction()。然后, externalFunction()将继续进行, 并按照在其中定义的方式调用innerFunction()。
重要的是必须调用外部函数, 以便内部函数可以执行。为了说明这一点, 请考虑以下示例:
例子:
# 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 functionsdef f1():
s = 'I love srcmini'def f2():
print (s)f2()# Driver's code
f1()
输出如下:
I love srcmini
在上面的示例中, 可以看出它类似于从函数访问全局变量。现在, 假设你要更改外部函数的变量。
# Python program to
# demonstrate accessing of
# variables of nested functionsdef f1():
s = 'I love srcmini'def f2():
s = 'Me too'
print (s)f2()
print (s)# Driver's code
f1()
【Python内部函数用法完整指南】输出如下:
Me too
I love srcmini
可以看出外部函数变量的值没有改变。但是, 可以更改外部函数的变量的值。有多种方法可以更改外部函数变量的值。
使用迭代
# Python program to
# demonstrate accessing of
# variables of nested functionsdef f1():
s = [ 'I love srcmini' ]def f2():
s[ 0 ] = 'Me too'
print (s)f2()
print (s)# Driver's code
f1()
输出如下:
['Me too']
['Me too']
使用非本地关键字–
# Python program to
# demonstrate accessing of
# variables of nested functionsdef f1():
s = 'I love srcmini'def f2():
nonlocal s
s = 'Me too'
print (s)f2()
print (s)# Driver's code
f1()
输出如下:
Me too
Me too
值也可以更改, 如下例所示。
# Python program to
# demonstrate accessing of
# variables of nested functionsdef f1():
f1.s = 'I love srcmini'def f2():
f1.s = 'Me too'
print (f1.s)f2()
print (f1.s)# Driver's code
f1()
输出如下:
Me too
Me too
Python闭包 闭包是一个函数对象, 即使在内存中不存在值, 它也会记住范围内的值。
- 它是将功能与环境存储在一起的记录:一种映射, 该映射将功能的每个自由变量(在本地使用, 但在封闭范围内定义的变量)与在关闭时绑定名称的值或引用相关联已创建。
- 与普通函数不同, 闭包允许该函数通过闭包的值或引用的副本访问这些捕获的变量, 即使该函数在其作用域之外被调用也是如此。
filter_none。
# 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_funcdef 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
首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。
推荐阅读
- Python如何动态更改Checkbutton的文本()
- Python Itertool模块用法完整指南
- Python lambda(匿名函数)|filter、map和reduce
- Python语言的优势和应用介绍
- java|.NET 正式支持龙芯 LoongArch64 架构
- 麒麟系统开发笔记(国产麒麟系统搭建开发环境之虚拟机安装)
- #yyds干货盘点# GloVe word vectors
- #过年不停更#HarmonyOS-ETS之紧急拨号
- GO学习笔记-监听OS信号