首页 > 编程语言 >0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成器练习

0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成器练习

时间:2024-11-06 19:17:20浏览次数:3  
标签:Student 迭代 Python 生成器 next stu 单例 print

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

相关文章

  • 0基础学Python——面向对象-可迭代、面向对象-迭代器、call方法、call方法实现装饰器
    0基础学Python——面向对象-可迭代、面向对象-迭代器、call方法、call方法实现装饰器、计算函数运行时间面向对象--可迭代实现方法面向对象--迭代器实现方法call方法作用call方法实现装饰器代码演示计算函数运行时间代码演示面向对象–可迭代把对象看做容器,存储......
  • 基于卷积神经网络的柑桔病害识别与防治系统,resnet50,mobilenet模型【pytorch框架+pytho
     更多目标检测和图像分类识别项目可看我主页其他文章功能演示:柑橘病害识别与防治系统,卷积神经网络,resnet50,mobilenet【pytorch框架,python源码】_哔哩哔哩_bilibili(一)简介基于卷积神经网络的柑桔病害识别与防治系是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,......
  • Python 日志分级记录到不同文件的实现
    Python日志分级记录到不同文件的实现介绍如何使用Python的logging模块,按INFO、WARNING和ERROR级别将日志记录到不同的文件中。通过封装CustomLogger类,方便在项目中直接调用,简化日志管理。1.实现目标分级日志记录:将INFO、WARNING、ERROR级别的日志分别记录到不......
  • python球探数据分析
    Python球探数据分析入门指南作为一名刚入行的小白,你可能会对如何使用Python进行球探数据分析感到困惑。不用担心,这篇文章将为你提供一份详细的入门指南,帮助你逐步掌握这项技能。流程概览首先,让我们通过一个表格来了解整个数据分析的流程:步骤描述1获取数据2数据......
  • Leetcode刷题Python之3254.长度为K的子数组的能量值I
    提示:关于数组子问题的挑战,涉及能量值的计算。文章目录一、问题描述示例二、解题思路三、代码实现1.引入库2.代码解释总结一、问题描述给定一个长度为n的整数数组nums和一个正整数k,我们需要计算每个长度为k的子数组的能量值。能量值的定义如下:如果子数......
  • c++ 嵌入 python问题
     在嵌入式Python环境中,确保你的C++应用程序能够加载静态编译的Python解释器,需要设置Python解释器的搜索路径。以下是实现这一目标的步骤:1.设置环境变量你可以通过设置环境变量 PYTHONHOME 来指定Python解释器的根目录。这个环境变量告诉Python解释器去哪里查找......
  • 【毕业设计】基于深度学习的水族馆生物识别 人工智能 深度学习 目标检测 Python
    一、背景意义    随着水族馆的普及和水生生态保护意识的提高,生物识别技术在水族馆管理、教育和研究中的重要性日益凸显。传统的生物识别方法往往依赖于人工观察和专家判断,效率低、准确性差且容易受到主观因素影响。水族馆中涉及的生物种类繁多,包括鱼类、虾类、海洋哺乳......
  • python项目打包指南
    #Python是解释型语言,我们写的Flask或Django项目如果部署,#源码可能会泄露,因此我们可以把项目打包成exe,来保护源码#需要用到工具-pyinstaller:把python项目打包成不同平台的可执行文件-nsis:NSIS(NullsoftScriptableInstallSystem)是一个开源的Windows系统下安装程序制作......
  • 第十三届蓝桥杯Python 大学 B 组 数位排序
    数位排序问题描述小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。例如,2022排在409前面,因为2022的数位之和是6,小于409的数位之和13。又如,......
  • 蓝桥杯【第13届省赛】Python B组 C题
    C:纸张尺寸【问题描述】    在ISO国际标准中定义了A0纸张的大小为1189mm×841mm,将A0纸沿长边对折后为A1纸,大小为841mm×594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。将A1纸沿长边对折后为A2纸,依此类推。     输入纸张的名称......