关键字
global
在全局作用域下存在一个全局变量,但是在局部作用域下对相同的函数名进行赋值了,意味一个新的变量,那么刚开始想要的是对全局赋值,就需要使用global
def modify_a():
global a
a = 30
if __name__ == '__main__':
a = 1
modify_a()
print(a) # 30
nonlocal
有时候在一个嵌套函数内使用了外部函数的变量,如果只是读取不会有影响,但是赋值的话就会有影响
def bar():
a = 10
def foo():
nonlocal a
a += 1
print(a)
return foo
bar()() # 11
面向对象
__slots__
python中对象都是动态创建的,可以直接对任意一个对象未知的属性进行赋值,这样就动态创建了这个属性,但是在定义类的时候,并不需要这样,可以使用__slots__
来类来进行限制
class Human():
__slot__ = ("name", "age")
def __init__(self, name:str, age:int):
self.name = name
self.age = age
if __name__ == "main":
people = Human("xiaoming", 12)
people.like = 12
枚举类
定义一系列常量的时候可以使用枚举,尤其规定状态的时候
- 无法改变,不重复
- 枚举的意义在定义的
name
- 枚举不可用来作比较,可以使用
is
来比较身份 - 注意如果值相同,后面的会成为第一个的别名,因此可以使用
unique
from enum import Enum, unique @unique class VIP(Enum): BLACK = 0 YELLO = 1 RED = 2 # 使用 VIP.RED # VIP.RED # 获取名 VIP.RED.name # RED # 获取值 VIP.RED.value # 2
@property
@property
对类的属性进行getter,setter
class Human():
__slot__ = ("name", "age")
def __init__(self, name:str, age:int):
self.name = name
self._age = age
@property
def age(self):
return self._age
@age.setter
def age(self, age):
self._age = age
if __name__ == "main":
people = Human("xiaoming", 12)
people.like = 12
生成器,迭代器
生成器
- 生成值的一种机制
yield
, 普通函数和生成器函数就差一个关键字yield
,用来返回生成的值# 斐波拉契数列为例 def fb(num): # n 代表计数, a 表示上一个值, b 表示前两个值之和 n, a, b = 0, 0, 1 while n < num: