从0开始python学习-18.生成器、反射、推导式

目录

1. 生成器

1.1 yield生成器

2. 反射

2.1 hasattr方法

2.2 getattr方法

2.3 setattr方法

2.4 delattr方法

3. 推导式

3.1 列表推导式

3.2 集合推导式

3.3 集合推导式


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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值