目录
1. 生成器
1. 定义:生成器是一种能够实现惰性计算、延迟执行和节省内存的迭代器。在Python中,通过yield语句实现生成器 2. 生成器可以使用多种方式进行定义,包括通过函数、生成器类以及生成器表达式等 3. 生成器中的函数不是直接返回一个值,而是返回一个生成器对象。取值时,通过next()方法或for循环操作获取生成器对象中的值
1.1 yield生成器
1. 生成器当中可以有一个或者多个yield关键字 2. yield关键字可以返回一个值(跟return关键字一样) 3. 当函数执行完毕之后,下次再进行调用会从yield后面开始继续执行代码 4. 生成器的执行方式和普通函数不一样 5. 通过使用next()内建函数进行执行生成器
def a():
print(1)
yield '生成器第一次卡点'
print(2)
yield '生成器第二次卡点'
print(3)
yield '生成器第三次卡点'
print(4)
# b代表的是一个生成器对象
b = a()
print(next(b))
print(next(b))
print(next(b))
print(next(b)) # 当执行到最后一个且没有生成器时会抛出异常,属于正常逻辑 # StopIteration
2. 反射
反射原理:通过字符串的名字值(属性名,方法名),对实例对象进行访问和修改。即对类对象进行属性和方法的操作(添加,删除,修改,查看)
2.1 hasattr方法
1. 定义:判断该对象是否有指定名字的属性或方法 2. hasattr(obj,name_str):判断输入的name_str字符串在对象obj中是否存在(属性或方法)。返回值是bool类型,存在返回True,否则返回False
class A:
age = 18
def __init__(self):
self.name = '张三'
def a(self):
print("方法a")
print(hasattr(A, 'age')) # True
print(hasattr(A, 'name')) # False
b = A()
print(hasattr(b, 'name')) # True
print(hasattr(b, 'a')) # True
print(hasattr(b, 'b')) # False
2.2 getattr方法
1. 定义:获取对象指定名称的属性或方法,返回值是str类型 2. getattr(obj,name_str): 将按照输入的name_str字符串在对象obj中查找,如找到同名属性,则返回该属性;如找到同名方法,则返回方法的引用;如果未能找到同名的属性或者方法,则抛出异常:AttributeError 3. getattr()可以返回类、对象、模块的的属性和方法 4. 反射获取成员方法,返回方法是一个引用地址,要想执行该方法,需要在后面加上小括号
class A:
age = 18
def __init__(self):
self.name = '张三'
def a(self):
print("方法a")
# 创建类对象
b = A()
# 反射获取类变量
print(getattr(A, 'age'))
# 反射获取成员变量
print(getattr(b,'name'))
# 反射获取成员方法,返回方法是一个引用地址,要想执行该方法,需要在后面加上小括号
getattr(b,'a')()
# 如果在对象或者类中找不倒指定的字符串,则报AttributeError出错误
# print(getattr(A, 'age1')) # AttributeError: type object 'A' has no attribute 'age1'. Did you mean: 'age'?
# print(getattr(b,'name1')) # AttributeError: 'A' object has no attribute 'name1'. Did you mean: 'name'?
# getattr(b,'a1')() # AttributeError: 'A' object has no attribute 'a1'. Did you mean: 'a'?
2.3 setattr方法
1. 定义:给指定的对象添加属性以及属性值 2. setattr(obj,name_str,value): obj对象,name_str为属性名或者方法名,value为属性值或者方法的引用 3. 设置成员方法时,name_str为设置加入的方法名,value为要加入方法的引用(不需要加引号)
class A:
age = 18
def __init__(self,name):
self.name = name
def a(self):
print("方法a")
def b():
print('这是方法b')
x = A('张三')
# 设置属性值
setattr(x,'age','20')
print(getattr(x,'age'))
# 将属性/方法反射为方法的引用
# 第二个参数是设置的方法名/属性名,第三个参数是方法引用
setattr(x,'name',b)
getattr(x,'name')()
setattr(x,'a',b)
getattr(x,'a')()
# 动态设置一个实例方法
setattr(x,'b',print)
x.b('这是反射后的打印2')
# 如果该类里面有这个方法(属性)名那么会进行覆盖
setattr(x,'a',print)
x.a('这是反射后的打印')
2.4 delattr方法
1. 定义:删除对象指定名称的属性或方法值,无返回值 2. delattr(obj,name_str):将你输入的字符串name_str在对象obj中查找,如找到同名属性或者方法就进行删除 3. 执行结果:删除属性和方法之后,再次调用就会报AttributeError错误
class A:
age = 18
def __init__(self):
self.name = '张三'
def a(self):
print("方法a")
b = A()
delattr(A,'age')
print(getattr(A, 'age')) # AttributeError: type object 'A' has no attribute 'age'
delattr(b,"name")
print(getattr(b, 'name')) # AttributeError: 'A' object has no attribute 'name'
delattr(b,'a')
getattr(b,'a')() # AttributeError: a
3. 推导式
3.1 列表推导式
# i后面可以接收一个可迭代对象:容器类型的数据(字符串,元组,字典,列表,集合)
list = [i for i in range(1,10)]
print(list)
list2 = [i *2 for i in 'asdfg']
print(list2)
3.2 集合推导式
set = {i for i in range(1,10)}
print(set)
set2 = {i *2 for i in 'asdfg'}
print(set2)
# 由于集合有去重的特性,所以这种情况最后的结果不定
set3 = {random.randint(1,20) for i in range(10)}
print(set3)
3.3 集合推导式
dict = {key:value for key in range(4) for value in range(10)}
print(dict) # {0: 9, 1: 9, 2: 9, 3: 9}
# 等价于
value = None
for key in range(4):
print(key)
for value in range(10):
pass
print(value)