Python 枚举与闭包

目录

一、枚举

1.定义

2.枚举和普通类相比的优势

3.枚举类型、枚举名称与枚举值

4.枚举的比较运算

5.注意事项

6.枚举转换

7.小结

二、一切皆对象

函数式编程

三、闭包:

1.定义

2.误区

四、函数式编程

 


一、枚举

1.定义

     python中所有枚举类型都是enum模块下Enum类的子类。

2.枚举和普通类相比的优势

  1. 可变
  2. 没有防止相同标签的功能
  3. 枚举类型中的值不能更改

3.枚举类型、枚举名称与枚举值

from enum import Enum
class VIP(Enum): 
    YELLOW = 1    
    GREEN = 2 
    BLACK = 3    
    RED = 4
'''
枚举中的标识最好全部使用大写。
注:枚举的意义重在标签而不在于数值,使用print(VIP.YELLOW)打印结果不是1而是VIP.YELLOW,这也符合枚举的意义。


print(VIP.GREEN)返回VIP.GREEN,是枚举类型
print(VIP.GREEN.name)返回GREEN,是str类型
print(VIP.GREEN.value)返回2,是对应的值类型

'''

4.枚举的比较运算

  1. 枚举类型之间可以进行等值比较(==),但直接和数值比较会返回False,如:VIP.GREEN == 2 返回False
  2. 枚举类型之间不支持大小比较操作符(>、<)的
  3. 枚举类型可以进行身份比较(is) 如:VIP.GREEN is VIP.GREEN 返回 True
  4. 不同枚举类中的枚举类型进行比较都会返回False。

5.注意事项

  1. 枚举类中不同枚举类型的值可以相同,此时这两个枚举类型中的第二个名称是第一个的别名,建议使用第一个的名称+_ALIAS作为名称。
  2. 若枚举类中存在别名,在遍历打印时只会打印出非别名的所有枚举类型。若想输出所有枚举成员,可以使用枚举类的内置变量__members__,如:
for v in VIP.__members__:
    print(v)

'''
结果为:
YELLOW
YELLOW_ALIAS
BLACK
RED'''

6.枚举转换

  1. 枚举类型建议用数字来存储在数据库中,占据更少的存储空间。但是不建议使用数字来代表枚举的类型,影响代码的可读性。
  2. 使用 枚举类名(数值) 进行“类型”转换   把数据库中存储的数字转换成枚举类型
  • 通过数值获取对应枚举类型:
  • a = 1
  • print(VIP(a))
  • 结果将输出对应枚举类型

7.小结

  1. Enum: 不限制枚举类型数值的数据类型
  2. IntEnum: 限制枚举类型数值必须为整形
  3. 枚举类型是单例模式(23种设计模式中的一种),不能实例化
  4. 加上装饰器 unique :规定两个不同的枚举类型不能取相同数值
from enum import IntEnum, unique
@unique  # unique以装饰器形式使用
class VIP(IntEnum):
    YELL = 1    
    GREE = 1
    BLCK = 2
'''
Python 会报错ValueError: duplicate values found in <enum 'VIP'>: GREE -> YELL
'''

二、一切皆对象

函数式编程

进阶语法很大程度与函数式编程相关,不过它跟着不同语言,定义也有所变化它可以简化代码和更优秀的接口。在认为写的代码很别扭、繁琐时尝试使用。

三、闭包:

1.定义

  • 概念晦涩,不建议从标准定义上来理解闭包和函数关系很大。函数在别的很多语言只是一段可执行的代码,并不是对象,因此也不能实例化。
  • 也不能给函数赋值,而python可以,在python里一切皆对象(类)。(可以用type函数检验,返回一个class)
  • python还可以成为另一个函数的参数,传递到另外的函数里还可以把一个函数当做另外一个函数的返回结果
  • 闭包 是 由 函数 和 函数内部定义时的环境变量组成的。一旦形成闭包, 外部的变变量不会影响内部变量。闭包 = 函数 + 环境变量
i.e def curve_pre():
        a = 25  # 环境变量
        def curve(x):
            return a*x*x
        return curve
a = 10 # 外部变量 不会 影响到闭包内的 a 的赋值
print(curve_pre().__closure__)
print(curve_pre().__closure__[0].cell_contents)

闭包的意义在于保存了一个环境。尤其是函数中调用函数时,如果没有闭包,很容易被外部变量所保证函数在调用时的正确性。闭包 = 函数 + 环境变量(函数定义时候)影响。

2.误区

  • 闭包的意义在于保存了一个环境。尤其是函数调用函数是,如果没有闭包,很容易被外部变量所影响。闭包必须满足2个条件,函数嵌套函数,并且内部函数需要引用父函数的变量
  • 声明变量为nonlocal。形成闭包。闭包有保存现场的一个功能,有记忆性。

四、函数式编程

  1. 工厂模式,factory
  2. JavaScript VS Python 闭包对比。python 通过闭包的方式间接调用函数内部的环境变量
  3. 环境变量是常驻内存内,极容易造成内存泄露,在使用环境变量时一定要注意。JavaScript内的环境变量会影响浏览器卡顿,影响用户体验。
  4. 函数式编程, 不会操纵全局变量。函数式编程。
  5. 闭包只是函数式编程思想的一种应用。闭包 不等于 函数式编程。

 

猜你喜欢

转载自blog.csdn.net/qq_41664272/article/details/89330769