Maison  >  Article  >  développement back-end  >  Une brève introduction aux fermetures en Python (avec des exemples)

Une brève introduction aux fermetures en Python (avec des exemples)

不言
不言avant
2018-10-10 15:45:152524parcourir

Cet article vous apporte une brève introduction aux fermetures en Python (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

1 : Introduction
La programmation fonctionnelle n'est pas nécessaire pour les programmes, mais elle joue un rôle important dans la simplification des programmes.
Tout en Python est un objet, et les fonctions sont aussi des objets

   a = 1
    a = 'str'
    a = func

2 : Fermetures

Les fermetures sont composées de fonctions et de leurs environnements de référence associés Entité (c'est-à-dire : fermeture = fonction + variable d'environnement)
Si dans une fonction interne, une variable dans la portée externe (mais pas dans la portée globale) est référencée, alors la fonction interne est considérée comme une fermeture (fermeture), c'est le plus simple explication! Et la valeur de cette variable ne sera pas modifiée par la même valeur de variable dans le module !

3 : Le rôle de la fermeture

Utiliser moins de variables globales. La fermeture peut éviter d'utiliser des variables globales
Vous pouvez appeler la valeur à l'intérieur de la fonction depuis l'extérieur de la fonction :
print( f .__closure__[0].cell_contents)
# Renvoie la valeur de la variable d'environnement dans la fermeture !
Le fonctionnement du module n'est pas possible !

# ----------------------------------------------#
# 闭包
# ----------------------------------------------#
# 函数内部定义函数
def curve_pre():
    def curve():
        print("抛物线")
        pass
    return curve
# 不能直接调用函数内部的函数
# curve()
func = curve_pre()
func()
def curve_pre1():
    a = 25  # 环境变量a的值在curve1外部

    def curve1(x):
        print("抛物线")
        return a * x ** 2
    return curve1       # 返回了的闭包
f = curve_pre1()
result = f(2)
print(result)
# 当在外部定义变量的时候,结果不会改变
a = 10
print(f(2))
print(f.__closure__)    # 检测函数是不是闭包
print(f.__closure__[0].cell_contents)    # 返回闭包中环境变量的值!
# ----------------------------------------------#
# 闭包的实例
# ----------------------------------------------#
def f1():
    m = 10
    def f2():
        m = 20  # 局部变量
        print("1:", m)  # m = 20
    print("2:", m)      # m = 10
    f2()
    print("3:", m)      # m = 10,臂包里面的值不会影响闭包外面的值
    return f2
f1()
f = f1()
print(f.__closure__)    # 判断是不是闭包

# ----------------------------------------------#
# 闭包解决一个问题
# ----------------------------------------------#
# 在函数内部修改全局变量的值计算某人的累计步数
# 普通方法实现
sum_step = 0


def calc_foot(step=0):
    global sum_step
    sum_step = sum_step + step


while True:
    x_step = input('step_number:')
    if x_step == ' ':   # 输入空格结束输入
        print('total step is ', sum_step)
        break
    calc_foot(int(x_step))
    print(sum_step)

# 闭包方式实现----->少使用全局变量,闭包可以避免


def factory(pos):

    def move(step):
        nonlocal pos    # 修改外部作用域而非全局变量的值
        new_pose = pos + step
        pos = new_pose  # 保存修改后的值
        return pos

    return move


tourist = factory(0)
print(tourist(2))
print(tourist(2))
print(tourist(2))

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer