机械学习—零基础学习日志(python编程2)
零基础为了学人工智能,正在艰苦的学习
这里把,函数以及类相关的知识做一个笔记,放在这里。
期待与大家交流~
变量作用域
- Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
- 定义在函数内部的变量拥有局部作用域,该变量称为局部变量。
- 定义在函数外部的变量拥有全局作用域,该变量称为全局变量。
- 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。
- 当内部作用域想修改外部作用域的变量时,就要用到
global和nonlocal关键字了。
def discounts(price, rate):final_price = price * ratereturn final_priceold_price = float(input('请输入原价:')) # 98
rate = float(input('请输入折扣率:')) # 0.9
new_price = discounts(old_price, rate)
print('打折后价格是:%.2f' % new_price) # 88.20
闭包机制
- 闭包是函数式编程的一个重要的语法结构,是一种特殊的内嵌函数。
- 如果在一个内部函数里对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包。
- 通过闭包可以访问外层非全局作用域的变量,这个作用域称为 闭包作用域。
def funX(x):def funY(y):return x * yreturn funYi = funX(8)
print(type(i)) # <class 'function'>
print(i(5)) # 40
上面的代码看到,funx(x)返回了一个函数funy,一般而言,函数调用完毕,x变量的内存应该释放,但是因为这里涉及闭包机制。这里的x其实转为,堆存放。所以x=8,这里是被存储的。具体解释下方,有进一步说明。
def make_counter(init):counter = [init]def inc(): counter[0] += 1def dec(): counter[0] -= 1def get(): return counter[0]def reset(): counter[0] = initreturn inc, dec, get, resetinc, dec, get, reset = make_counter(0)
inc()
inc()
inc()
print(get()) # 3
dec()
print(get()) # 2
reset()
print(get()) # 0
如何理解闭包机制。从计算机的原理做一个讲解。(From ChatGPT)
内存管理
在计算机中,内存管理主要分为栈(stack)和堆(heap)。
-
栈内存:
- 栈内存用于存储局部变量和函数调用信息。每次函数调用时,函数的局部变量和一些函数调用信息都会被压入栈中;当函数返回时,这些信息会被弹出栈。
- 栈是自动管理的,随着函数调用和返回自动调整。
-
堆内存:
- 堆内存用于动态分配内存,如对象和闭包中的变量。堆内存中的数据由垃圾收集器管理,当不再需要时会被回收。
- 堆内存允许在函数返回之后依然保留数据,这对闭包特别重要。
闭包实现
-
创建闭包:
- 当外部函数
make_counter被调用时,参数init被存储在栈中。 - 在
make_counter函数内,定义了几个内部函数(inc、dec、get和reset),并且它们都引用了counter列表。
- 当外部函数
-
移动到堆内存:
- 当
make_counter返回时,内部函数引用的counter列表会被移动到堆内存中。这是因为即使make_counter函数返回了,内部函数依然需要访问和修改counter。 - 堆内存中的数据不会因为外部函数返回而被清除,只有当没有引用指向这些数据时,垃圾收集器才会回收它们。
- 当
-
函数引用和调用:
- 返回的内部函数
inc、dec、get和reset都保留了对堆内存中counter列表的引用。 - 当这些函数被调用时,它们通过闭包机制访问并修改
counter列表中的值。
- 返回的内部函数
总结
闭包机制是因为,本来应该释放内存空间的数值继续被存放。后续的函数调用直接使用了原来函数的赋值。
Lambda 表达式
Python 使用 lambda 关键词来创建匿名函数,而非def关键词,它没有函数名,其语法结构如下:
lambda argument_list: expression
lambda- 定义匿名函数的关键词。argument_list- 函数参数,它们可以是位置参数、默认参数、关键字参数,和正规函数里的参数类型一样。:- 冒号,在函数参数和表达式中间要加个冒号。expression- 只是一个表达式,输入函数参数,输出一些值。
注意:
expression中没有 return 语句,因为 lambda 不需要它来返回,表达式本身结果就是返回值。- 匿名函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
lbd_sqr = lambda x: x ** 2
print(lbd_sqr)
# <function <lambda> at 0x000000BABB6AC1E0>y = [lbd_sqr(x) for x in range(10)]
print(y)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]sumary = lambda arg1, arg2: arg1 + arg2
print(sumary(10, 20)) # 30func = lambda *args: sum(args)
print(func(1, 2, 3, 4, 5)) # 15
匿名函数的应用
filter(function, iterable)过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用list()来转换。
odd = lambda x: x % 2 == 1
templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(templist)) # [1, 3, 5, 7, 9]
map(function, *iterables)根据提供的函数对指定序列做映射。
odd = lambda x: x % 2 == 1
templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(templist)) # [1, 3, 5, 7, 9]
map(function, *iterables)根据提供的函数对指定序列做映射。
类与对象 对象 = 属性+方法
- 继承:子类自动共享父类之间数据和方法的机制
class MyList(list):passlst = MyList([1, 5, 2, 7, 8])
lst.append(9)
lst.sort()
print(lst)# [1, 2, 5, 7, 8, 9]
- 多态:不同对象对同一方法响应不同的行动
self 是什么?
Python 的 self 相当于 C++ 的 this 指针。
类的方法与普通的函数只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称(对应于该实例,即该对象本身),按照惯例它的名称是 self。在调用方法时,我们无需明确提供与参数 self 相对应的参数。
Python 的魔法方法
据说,Python 的对象天生拥有一些神奇的方法,它们是面向对象的 Python 的一切...
它们是可以给你的类增加魔力的特殊方法...
如果你的对象实现了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,而这一切都是自动发生的...
类有一个名为__init__(self[, param1, param2...])的魔法方法,该方法在类实例化时会自动调用。
class Ball:def __init__(self, name):self.name = namedef kick(self):print("我叫%s,该死的,谁踢我..." % self.name)a = Ball("球A")
b = Ball("球B")
c = Ball("球C")
a.kick()
# 我叫球A,该死的,谁踢我...
b.kick()
# 我叫球B,该死的,谁踢我...
__new__方法
__new__(cls[, ...])在一个对象实例化的时候所调用的第一个方法,在调用__init__初始化前,先调用__new__。__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由 Python 解释器自动提供,后面的参数直接传递给__init__。__new__对当前类进行了实例化,并将实例返回,传给__init__的self。但是,执行了__new__,并不一定会进入__init__,只有__new__返回了,当前类cls的实例,当前类的__init__才会进入。
class A(object):def __init__(self, value):print("into A __init__")self.value = valuedef __new__(cls, *args, **kwargs):print("into A __new__")print(cls)return object.__new__(cls)class B(A):def __init__(self, value):print("into B __init__")self.value = valuedef __new__(cls, *args, **kwargs):print("into B __new__")print(cls)return super().__new__(cls, *args, **kwargs)b = B(10)# 结果:
# into B __new__
# <class '__main__.B'>
# into A __new__
# <class '__main__.B'>
# into B __init__class A(object):def __init__(self, value):print("into A __init__")self.value = valuedef __new__(cls, *args, **kwargs):print("into A __new__")print(cls)return object.__new__(cls)class B(A):def __init__(self, value):print("into B __init__")self.value = valuedef __new__(cls, *args, **kwargs):print("into B __new__")print(cls)return super().__new__(A, *args, **kwargs) # 改动了cls变为Ab = B(10)# 结果:
# into B __new__
# <class '__main__.B'>
# into A __new__
# <class '__main__.A'>
利用__new__实现单例模式。
class Earth:passa = Earth()
print(id(a)) # 260728291456
b = Earth()
print(id(b)) # 260728291624class Earth:__instance = None # 定义一个类属性做判断def __new__(cls):if cls.__instance is None:cls.__instance = object.__new__(cls)return cls.__instanceelse:return cls.__instancea = Earth()
print(id(a)) # 512320401648
b = Earth()
print(id(b)) # 512320401648
-
super().__new__(cls)调用:super()返回基类对象,这个对象可以访问父类的方法。__new__(cls)调用基类的__new__方法。对于大多数类来说,这意味着调用的是object.__new__方法,因为object是所有类的最终基类。cls作为参数传递,告诉__new__要创建的是哪个类的实例。
-
创建新实例:
super().__new__(cls)实际上创建了一个新的cls类型的实例,并返回该实例。这个实例还没有被初始化(即__init__还没有被调用)。
-
赋值给类变量
cls._instance:cls._instance是一个类变量,用于保存这个新创建的实例。- 这个赋值操作确保了类的
_instance属性持有这个单例实例,以便以后调用Singleton()时,可以返回同一个实例。
详细解释
-
第一次调用
Singleton():cls._instance是None,所以执行super().__new__(cls)创建一个新的Singleton实例,并将其赋值给cls._instance。- 返回这个新创建的实例。
-
后续调用
Singleton():cls._instance已经不是None,直接返回cls._instance,不再创建新实例。
通过这种方式,cls._instance = super().__new__(cls) 确保了 Singleton 类只有一个实例。这在需要确保类的唯一实例存在的情况下非常有用,例如实现配置管理器、数据库连接池等场景。
公有变量和函数
公有变量和函数是可以在类的外部访问和使用的。它们没有任何特殊的前缀。默认情况下,Python 中的所有变量和函数都是公有的。
其实就是你平常见得很多的函数,都是公有的。
class MyClass:def __init__(self):self.public_var = 10def public_method(self):print("This is a public method")# 创建类的实例
obj = MyClass()
# 访问公有变量
print(obj.public_var) # 输出: 10
# 调用公有方法
obj.public_method() # 输出: This is a public method
私有变量和函数
私有变量和函数则是在类的外部不可访问和修改的。在 Python 中,通过在变量名或函数名前加上两个下划线 __ 来定义私有变量和函数。
前面加上两个__,这个函数的调用方法就变化了,一般而言你是无法调用的。
class MyClass:def __init__(self):self.__private_var = 20def __private_method(self):print("This is a private method")def access_private(self):print(self.__private_var)self.__private_method()# 创建类的实例
obj = MyClass()
# 尝试直接访问私有变量(会导致错误)
# print(obj.__private_var) # AttributeError# 尝试直接调用私有方法(会导致错误)
# obj.__private_method() # AttributeError# 通过公有方法间接访问私有变量和方法
obj.access_private() # 输出: 20 \n This is a private method
但是你真的无法改动了嘛,不是,你还是可以改变的。
Python 并没有真正的私有成员。所谓的私有变量和函数实际上是通过名称改写(name mangling)来实现的。
Python 在类定义中,如果成员名称以双下划线开头,Python 解释器会将其改写为 _类名__变量名 的形式,以避免与其他类的名称冲突。
例如,以上例子中的 __private_var 和 __private_method 实际上被改写为 _MyClass__private_var 和 _MyClass__private_method。因此,它们仍然可以通过这种方式访问,但这不是推荐的做法。
注意事项:区别总结
-
私有方法
__test:- 使用名称改写(name mangling)机制实现私有化。
- 只能在类内部访问,不能从类外部直接访问。
- 名称改写后实际名称为
_ClassName__test。
-
特殊方法
__test__:- 通常是 Python 的魔术方法(magic method),具有特定的用途。
- 可以从类外部直接访问。
- 不会被名称改写机制处理。
继承
【例子】如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。
import randomclass Fish:def __init__(self):self.x = random.randint(0, 10)self.y = random.randint(0, 10)def move(self):self.x -= 1print("我的位置", self.x, self.y)class GoldFish(Fish): # 金鱼passclass Carp(Fish): # 鲤鱼passclass Salmon(Fish): # 三文鱼passclass Shark(Fish): # 鲨鱼def __init__(self):self.hungry = Truedef eat(self):if self.hungry:print("吃货的梦想就是天天有得吃!")self.hungry = Falseelse:print("太撑了,吃不下了!")self.hungry = Trueg = GoldFish()
g.move() # 我的位置 9 4
s = Shark()
s.eat() # 吃货的梦想就是天天有得吃!
s.move()
# AttributeError: 'Shark' object has no attribute 'x'
解决该问题可用以下两种方式:
- 调用未绑定的父类方法
Fish.__init__(self) - 使用super函数
super().__init__()
类、类对象和实例对象
类对象:创建一个类,其实也是一个对象也在内存开辟了一块空间,称为类对象,类对象只有一个。
实例对象:就是通过实例化类创建的对象,称为实例对象,实例对象可以有多个。
类属性:类里面方法外面定义的变量称为类属性。类属性所属于类对象并且多个实例对象之间共享同一个类属性,说白了就是类属性所有的通过该类实例化的对象都能共享。
class MyClass:# 类属性class_attribute = "I am a class attribute"def __init__(self, instance_attribute):# 实例属性self.instance_attribute = instance_attribute# 创建两个实例
obj1 = MyClass("Instance 1 attribute")
obj2 = MyClass("Instance 2 attribute")# 访问类属性
print(MyClass.class_attribute) # 输出: I am a class attribute
print(obj1.class_attribute) # 输出: I am a class attribute
print(obj2.class_attribute) # 输出: I am a class attribute# 修改类属性
MyClass.class_attribute = "Class attribute changed"# 再次访问类属性
print(MyClass.class_attribute) # 输出: Class attribute changed
print(obj1.class_attribute) # 输出: Class attribute changed
print(obj2.class_attribute) # 输出: Class attribute changed# 访问实例属性
print(obj1.instance_attribute) # 输出: Instance 1 attribute
print(obj2.instance_attribute) # 输出: Instance 2 attribute# 修改实例属性
obj1.instance_attribute = "Instance 1 attribute changed"# 再次访问实例属性
print(obj1.instance_attribute) # 输出: Instance 1 attribute changed
print(obj2.instance_attribute) # 输出: Instance 2 attribute
- 类属性定义:
class_attribute是类属性,它在类的主体中定义,不在任何方法内。 - 实例属性定义:实例属性
instance_attribute是在__init__方法中定义的,这些属性属于各自的实例。 - 共享类属性:所有实例对象都可以访问类属性,并且类属性的修改会影响所有实例对象。
- 独立实例属性:实例属性是独立的,每个实例对象有自己的一份实例属性,修改一个实例的实例属性不会影响其他实例的实例属性。
class A(object):def __init__(self, value):print("into A __init__")self.value = valuedef __new__(cls, *args, **kwargs):print("into A __new__")print(cls)return object.__new__(cls)class B(A):def __init__(self, value):print("into B __init__")self.value = valuedef __new__(cls, *args, **kwargs):print("into B __new__")print(cls)return super().__new__(cls, *args, **kwargs)b = B(10)# 结果:
# into B __new__
# <class '__main__.B'>
# into A __new__
# <class '__main__.B'>
# into B __init__class A(object):def __init__(self, value):print("into A __init__")self.value = valuedef __new__(cls, *args, **kwargs):print("into A __new__")print(cls)return object.__new__(cls)class B(A):def __init__(self, value):print("into B __init__")self.value = valuedef __new__(cls, *args, **kwargs):print("into B __new__")print(cls)return super().__new__(A, *args, **kwargs) # 改动了cls变为Ab = B(10)# 结果:
# into B __new__
# <class '__main__.B'>
# into A __new__
# <class '__main__.A'>
# 若__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行,将没有__init__被调用。所以这没有调用__init__
属性访问
__getattr__(self, name): 定义当用户试图获取一个不存在的属性时的行为。__getattribute__(self, name):定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若不存在,接着去调用__getattr__)。__setattr__(self, name, value):定义当一个属性被设置时的行为。__delattr__(self, name):定义当一个属性被删除时的行为。
迭代器
- 迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。
- 迭代器是一个可以记住遍历的位置的对象。
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
- 迭代器只能往前不会后退。
- 字符串,列表或元组对象都可用于创建迭代器:
- 生成器可以用来实现复杂的逻辑,例如产生无限序列或处理大型数据流而不会一次性将所有数据加载到内存中。
主要参考资料:阿里云《龙珠训练营》 AI学习课程 AI学习 - 阿里云天池
使用ChatGPT做学习
相关文章:
机械学习—零基础学习日志(python编程2)
零基础为了学人工智能,正在艰苦的学习 这里把,函数以及类相关的知识做一个笔记,放在这里。 期待与大家交流~ 变量作用域 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的…...
element-plus的表单输入框有清除按钮的,文字输入前后宽度不一致怎么解决
输入内容之后多了一个可清除的图标,输入框的宽度也被撑开了 根据输入前后的dom对比发现,多了一个图标的span标签 :deep(.el-input__wrapper) {position: relative;.el-input__inner {padding-right: 18px;}.el-input__suffix {position: absolute;right:…...
解决Docker拉取镜像时 i/o timeout错误
目录 一,设置Docker镜像源(推荐) 1.1 解决方案1:配置加速地址 1.2 解决方案2:使用代理拉取镜像 1.3 解决方案3:备用办法:直接传送镜像 二,目前可用的镜像源 一,设置…...
面壁的智能开源 MiniCPM-V 2.6 边缘人工智能多模态功能与 GPT-4V 不相上下
"MiniCPM-V2.6 "是一个边缘多模态人工智能模型,仅拥有 80 亿个参数,却在单图像、多图像和视频理解任务中取得了低于 200 亿个参数的三项 SOTA(艺术境界)成绩,显著增强了边缘多模态能力,并与 GPT-…...
dhcp+checkkickstar的实验理解
文章目录 实验介绍使用的服务介绍PXE服务dhcp服务Kickstart 服务tftp服务 第一部分(基础部分)代码展示注意点第一点第二点 结果展示 第二部分(…...
Android网络安全:如何防止中间人攻击
文章目录 引言一、中间人攻击概述二、预防中间人攻击的方法2.1 使用HTTPS2.2 证书锁定(Certificate Pinning)2.3 使用SSL/TLS最佳实践2.4 验证主机名 三、总结 引言 中间人攻击(Man-in-the-Middle,简称MITM)是一种常见…...
NOI Linux 2.0 的安装说明以及使用指南
关于 NOI Linux 2.0 NOI Linux 是 NOI 竞赛委员会基于 Ubuntu 操作系统开发的一款 Linux 桌面发行版,是一套免费的、专门为信息学奥林匹克竞赛选手设计的操作系统,是 NOI 系列赛事指定操作系统,适用于常见笔记本电脑和桌面电脑。 新建虚拟机…...
07、MySQL-多表查询
目录 1、内连接 1.1 隐式内连接 1.2 显式内连接 2、外连接 2.1 左外连接 2.2 右外连接 3、自连接 4、联合查询 5、子查询 5.1 标量子查询 5.2 列子查询 5.3 行子查询 5.4 表子查询 1、内连接 概念:相当于查询A、B表交集的部分数据 1.1 隐式内连接 语法&…...
20240809 每日AI必读资讯
乒乓球AI机器人赢了人类!正反手灵活转换,擦网球高球都能接 - 谷歌发布首个达到人类竞技水平的机器人Agent,挑战乒乓球赛场。 - 机器人通过学习大量乒乓球状态数据,掌握了正手上旋球、反手瞄准等技能,展现出高速运动…...
《投资的原理》阅读笔记一
这是我准备集中学习投资类书籍后阅读的第8本书,但是是第一本读到一半决定从新开始、每章都写笔记的第一本书。 《投资的原理》的作者陈嘉禾先生是一位资深的价值投资者,书中也是大力弘扬着价值投资,跟我倾向于量化投资方向的想法并不合拍&am…...
金九银十,全网最详细的软件测试面试题总结
前面看到了一些面试题,总感觉会用得到,但是看一遍又记不住,所以我把面试题都整合在一起,都是来自各路大佬的分享,为了方便以后自己需要的时候刷一刷,不用再到处找题,今天把自己整理的这些面试题…...
ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现
一.环境配置 腾讯云的ubuntu操作系统,已经安装有docker 和 vulhub 直接来到 启动环境docker-compose,要在root权限下运行。 docker-compose up -d 若出现等待时间过长的情况,请参考这篇文章http://t.csdnimg.cn/SYhbE 访问http://公网ip:8…...
网络协议四 物理层,数据链路层
从这一节开始学习 五层模型。学习方法是从最底层物理层开始学习 七层模型 五层模型 各个层用的协议,以及加上协议后的称谓 各个层的作用 应用层:可以认为是原始数据,该数据称为 报文,用户数据。 运输层:也叫传输层&am…...
Python知识点:如何使用Twisted进行异步网络编程
Twisted是一个事件驱动的网络编程框架,支持异步编程,适用于处理大量并发网络连接的应用。使用Twisted进行异步网络编程可以分为以下几个步骤: 安装Twisted: 首先需要安装Twisted库,可以使用pip进行安装: pi…...
循环神经网络
一、RNN神经网络 基本网络结构 RNN神经网络数学模型 RNN反向传播 二、LSTM神经网络 LSTM的遗忘门 对数据进行筛选,有的抛弃,有的保留 LSTM的输入门 LSTM输出门 LSTM缓解RNN梯度消失问题...
SQL进阶技巧:有序数据合并问题之如何按照指定的规则对数据进行合并?【详解collect_list函数有序性保证】
目录 0 问题描述【小红书面试题】 1 数据准备 2 问题分析 3 小结 0 问题描述【小红书】 有如下需求,需要将左边的表变换成右边的表,注意字段内容的顺序及对应内容的一致性。 第一个字段为name,第二个字段为subject,第三个字段为score,变换后要求subject按照语文、数学…...
windows和office微软官方免费激活教程
微软提供了windows系统和office的官方免费激活,其实不用去买什么激活码,官方提供了激活方式,完全免费。目前测试没发现什么问题,windows还支持永久激活,比一些乱七八糟的kms激活工具还省心。 github地址:Gi…...
【C++ 面试 - 基础题】每日 3 题(七)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
Java面试题精选:消息队列(一)
1、为什么使用消息队列 问题用意: 其实就是想问一下消息队列有哪些使用场景,你项目中什么业务场景用到了消息队列,有什么技术挑战。使用MQ后给你带来了什么好处 规范回答: 消息队列的常见使用场景很多,但比较核心的…...
宝塔面板启用 QUIC 与 Brotli 的完整教程
环境 系统:Ubuntu 22.04.4 LTS x86_64 宝塔版本:7.7.0 (可使用本博客提供的一键安装优化脚本) nginx版本:1.26.1 开放UDP端口 注意:在你的服务器商家那里也要开放443 udp端口 sudo ufw allow 443/udp然后重新加载 UFW 以使新…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
