0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成器练习
类的单例模式
定义
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式通常用于需要控制资源访问或者状态共享的场景,比如连接池、日志记录器、配置管理器等。
代码演示
class Student:
flag = 0
def __new__(cls, *args, **kwargs):
if not cls.flag:
cls.flag = super().__new__(cls)
return cls.flag
stu = Student()
stu1 = Student()
print(stu is stu1) # True
反射函数
反射函数通常指的是那些能够动态地访问和操作对象、类、模块等结构和属性的函数,如动态的给对象设置属性。
1、setattr(obj,attr,val) 给obj对象添加属性 attr,值val
2、getattr(obj,attr) 获取obj对象的attr属性值
3、delattr(obj,attr) 删除obj对象的attr属性
4、hasattr(obj,attr) 判断obj对象是否有attr属性
代码演示
class Student:
pass
dic = {'name': '张三', 'age': 18, 'sex': '男'}
stu = Student()
setattr(stu, 'name', '李四')
setattr(stu, 'age', 18)
print(stu.__dict__) # {'name': '李四', 'age': 18}
for key, value in dic.items():
setattr(stu, key, value)
print(stu.__dict__) # {'name': '张三', 'age': 18, 'sex': '男'}
print(getattr(stu, 'name')) # 张三
print(getattr(stu, 'age')) # 18
# print(getattr(stu, 'tel'))
delattr(stu, 'sex')
print(stu.__dict__) # {'name': '张三', 'age': 18}
print(hasattr(stu, 'name')) # True
print(hasattr(stu, 'del')) # False
记录类的创建个数
class Student:
def __new__(cls, *args, **kwargs):
instance = super().__new__(cls)
if hasattr(cls, 'count'): # 如果Student类中有‘count’属性,则将创建数量加1
cls.count += 1
else:
cls.count = 1
return instance
stu1 = Student()
stu2 = Student()
stu3 = Student()
stu4 = Student()
stu5 = Student()
print(Student.count) # 5
迭代器
定义
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能向前遍历,不能后退。
可迭代对象: 可以遍历,可以重复遍历
迭代器:是一个特殊的可迭代对象,iter(可迭代对象)
特点
使用next函数一次获取一个
每获取一个删除一个
获取结束后,报 StopIteration错
可以遍历,不可以重复遍历
ls = [1, 2, 3]
lss = iter(ls)
print(next(lss)) # 1
print(next(lss)) # 2
print(next(lss)) # 3
print(list(lss)) # []
print('*' * 99)
for i in lss:
print('***')
print(i)
生成器
定义
生成器是Python中用于迭代的特殊类型的函数。它们以一种惰性(lazy)的方式生成值,即逐个产生并返回,而不是一次性生成一个大的序列。这意味着生成器在处理大型数据集时非常高效,因为它们不需要占用大量内存。生成器是一种特殊的迭代器。
特点
满足迭代器的所有特点
生成器存储的是算法,不存储数据,节省内存空间
生成无穷个数据
写法
元组生成推导式实现
函数内部使用 yield
yield:返回结果个调用者,并且将代码挂起,等待下次next调用(从挂起的位置继续执行)
tup = (item for item in range(10))
print(next(tup)) # 0
print(next(tup)) # 1
print('*' * 99)
for e in tup:
print(e)
print('*' * 99)
def fn1():
i = 1
while i <= 10:
yield i
i += 1
fn = fn1()
print(next(fn)) # 1
print(next(fn)) # 2
print(next(fn)) # 3
print('-----------')
for i in fn:
print(i)
生成器练习
生成器生成1-无穷的数字
def fn1():
i=1
while True:
yield i
i+=1
fn1=fn1()
print(next(fn1)) # 1
print(next(fn1)) # 2
print(next(fn1)) # 3
生成器生成无穷个素数
# 判断是否为素数,若为素数则返回True,不是素数则返回False
def is_prime(n):
for i in range(2,n):
if n % i ==0:
return False
else:
return True
def fn2():
i = 2
while True:
if is_prime(i):
yield i
i += 1
fn2 = fn2()
print(next(fn2)) # 2
print(next(fn2)) # 3
print(next(fn2)) # 5
print(next(fn2)) # 7
print(next(fn2)) # 11
标签:Student,迭代,Python,生成器,next,stu,单例,print
From: https://blog.csdn.net/2201_75539182/article/details/143493482