当前位置: 首页 > news >正文

流畅的Python(十)-序列的修改、散列和切片

一、核心要义

以第九章定义的二维向量为基础,定义表示多为向量的Vector类。该类将支持如下功能:

1. 基本的序列协议

2. 适当的切片支持,且返回的是新Vector实例

3.综合各个元素的值计算散列值

4.格式化展示

二、代码示例

1、前情提要

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/2/17 13:56
# @Author  : Maple
# @File    : 00-相关背景知识.py
# @Software: PyCharmclass MySeq:def __getitem__(self, index):return indexif __name__ == '__main__':# mylist = [1,2,3,4,5,6]# print(mylist[1:5:2]) # [2, 4]# 1. 自定义序列的getitem方法中的index测试s = MySeq()## 1-1 单个索引,index返回的是整数print(s[1])## 1-2 1:4 返回的是slice(1, 4, None),其中1是序列的起始位置,4是结束位置,而且是左闭右开,即[1,4)print(s[1:4]) # slice(1, 4, None)## 1-3 1:4:2 返回的是slice(1, 4, 2),其中1是序列的起始位置,4是结束位置,2代表步长print(s[1:4:2]) # slice(1, 4, 2)## 1-4 复合切片1print(s[1:4:2,9]) # (slice(1, 4, 2), 9)#1-5 复合切片2print(s[1:4:2,7:9]) #(slice(1, 4, 2), slice(7, 9, None))# 2.slice测试"""slice是Python内置的类型"""##2-1 slice有一个indices方法, 以及start,step和stop三个数据属性print(dir(slice)) # [..'indices', 'start', 'step', 'stop']]##2-2 而indices方法主要是用于优雅地处理缺失索引和负索引,以及长度超过目标序列的切片### 2-2-1 对一个长度为5的序列,进行切片,其中起始位置缺失,结束位置为10(很显然已经超过了序列长度),步长为2### indices方法会帮忙将切片调整为 :(0, 5, 2)print(slice(None,10,2).indices(5))### 2-2-2 对一个长度为5的序列,进行切片,其中起始位置为-3,结束位置未知,步长未知### indices方法会帮忙将切片调整为 :(2, 5, 1)print(slice(-3,None,None).indices(5))# 3. 格式化测试name = 'maple'age = 18print('{name!r} and {age!r}'.format(name= name,age= age)) # 'maple' and 18print('{!r} and {!r}'.format(name,age)) # 'maple' and 18,不能使用关键字参数传递print('{name!r} and {!r}'.format(age,name=name))  # 'maple' and 18,positional argument要放在前面

2、Vector类的改造

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/2/17 14:19
# @Author  : Maple
# @File    : 01-Vector类的改造.py
# @Software: PyCharm"""相对于第9章的Vector类-构造方法是传入形如(1,2)这样的二元元组本章的Vector类
-(1)首先是可以接收任意多个参数
-(2)构造方法传入的是可迭代的对象
"""
import math
import reprlib
from array import arrayclass Vector:typecode = 'd'def __init__(self,components):self._components = array(self.typecode,components)def __repr__(self):# 返回的components是str类型components = reprlib.repr(self._components)components =  components[components.find('['):-1]return 'Vector({})'.format(components)def __str__(self):return str(tuple(self))def __iter__(self):return iter(self._components)def __bytes__(self):return (bytes([ord(self.typecode)]) + bytes(self._components))def __eq__(self, other):return tuple(self) == tuple(other)def __bool__(self):return bool(abs(self))def __abs__(self):return math.sqrt(sum(x * x for x in self._components))@classmethoddef frombytes(cls,octets):typecode = chr(octets[0])memv = memoryview(octets[1:]).cast(typecode)return cls(memv)if __name__ == '__main__':v = Vector([1,2,3,4])print('*******1. repr测试*****************')# 1. repr测试 :如果没有定义str方法,print(v)会调用__repr__方法print(v) # Vector([1.0, 2.0, 3.0, 4.0])# 2.str测试print('*******2. str测试*****************')print(v) # (1.0, 2.0, 3.0, 4.0)# 3.相等性测试print('*******3.相等性测试*****************')v2 = Vector([1,2,3,4])print(v is v2) # False,不同的对象print(v == v2) # False,值相等# 4.迭代测试print('*******4.迭代测试****************')for i in v:"""1.02.03.04.0
"""print(i)# 5.模长(abs)测试print('*******5.模长(abs)测试****************')print(abs(v)) # 5.477225575051661# 6. bytes测试print('*******6. bytes测试****************')print(bytes(v)) # b'd\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x10@#7. frombytes测试print('*******7. frombytes测试****************')v_byte = bytes(v)v_clone = Vector.frombytes(v_byte)print(v ==v_clone)# 8. 切片测试: 未实现getitem方法,无法使用切片print(v[1:3]) # TypeError: 'Vector' object is not subscriptable

3、Vector类切片功能实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/2/17 14:57
# @Author  : Maple
# @File    : 02-Vector类切片功能实现.py
# @Software: PyCharm#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/2/17 14:19
# @Author  : Maple
# @File    : 01-Vector类的改造.py
# @Software: PyCharm"""相对于第9章的Vector类-构造方法是传入形如(1,2)这样的二元元组本章的Vector类
-(1)首先是可以接收任意多个参数
-(2)构造方法传入的是可迭代的对象
"""
import math
import numbers
import reprlib
from array import arrayclass Vector:"""切片返回数组"""typecode = 'd'def __init__(self,components):self._components = array(self.typecode,components)def __repr__(self):# 返回的components是str类型components = reprlib.repr(self._components)components =  components[components.find('['):-1]return 'Vector({})'.format(components)def __str__(self):return str(tuple(self))def __iter__(self):return iter(self._components)def __bytes__(self):return (bytes([ord(self.typecode)]) + bytes(self._components))def __eq__(self, other):return tuple(self) == tuple(other)def __bool__(self):return bool(abs(self))def __abs__(self):return math.sqrt(sum(x * x for x in self._components))@classmethoddef frombytes(cls,octets):typecode = chr(octets[0])memv = memoryview(octets[1:]).cast(typecode)return cls(memv)def __len__(self):return len(self._components)def __getitem__(self, index):# index是一个slice类型数据,返回数组return self._components[index]class Vector2:"""切片仍然返回Vector类型数据"""typecode = 'd'def __init__(self,components):self._components = array(self.typecode,components)def __repr__(self):# 返回的components是str类型components = reprlib.repr(self._components)components =  components[components.find('['):-1]return 'Vector({})'.format(components)def __str__(self):return str(tuple(self))def __iter__(self):return iter(self._components)def __bytes__(self):return (bytes([ord(self.typecode)]) + bytes(self._components))def __eq__(self, other):return tuple(self) == tuple(other)def __bool__(self):return bool(abs(self))def __abs__(self):return math.sqrt(sum(x * x for x in self._components))@classmethoddef frombytes(cls,octets):typecode = chr(octets[0])memv = memoryview(octets[1:]).cast(typecode)return cls(memv)def __len__(self):return len(self._components)def __getitem__(self, index):cls = type(self)if isinstance(index,slice):return cls(self._components[index])elif isinstance(index,numbers.Integral):return self._components[index]else:msg = '{cls.__name__} indices must be integers'return TypeError(msg.format(cls = cls))if __name__ == '__main__':v = Vector([1,2,3,4,5])# 1. 切片测试:返回的是数组print(v[1])  # 2.0print(v[1:3]) # array('d', [2.0, 3.0])print(v[1:5:2]) # array('d', [2.0, 4.0])# slice(1,5,2)print(v[-4:10:2]) # array('d', [2.0, 4.0])# 2. 切片测试:返回的是Vector类型数据v2 = Vector2([1, 2, 3, 4, 5])print(v2[1])  # 2.0print(v2[1:3])  # (2.0, 3.0)print(v2[1:5:2])  # (2.0, 4.0)print(v2[1.0]) # Vector2 indices must be integers

4、Vector类动态存取属性

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/2/17 15:10
# @Author  : Maple
# @File    : 03-Vector类动态存取属性.py
# @Software: PyCharm
import numbers
import reprlib
from array import arrayclass Vector:"""实现能够通过单个变量访问前几个分量,比如 v.x,v.y等实现方式: getattr方法"""typecode = 'd'shortcut_names = 'xyzt'def __init__(self,components):self._components = array(self.typecode,components)def __repr__(self):# 返回的components是str类型components = reprlib.repr(self._components)components =  components[components.find('['):-1]return 'Vector({})'.format(components)def __str__(self):return str(tuple(self))def __iter__(self):return iter(self._components)def __bytes__(self):return (bytes([ord(self.typecode)]) + bytes(self._components))def __eq__(self, other):return tuple(self) == tuple(other)def __bool__(self):return bool(abs(self))def __abs__(self):return math.sqrt(sum(x * x for x in self._components))@classmethoddef frombytes(cls,octets):typecode = chr(octets[0])memv = memoryview(octets[1:]).cast(typecode)return cls(memv)def __len__(self):return len(self._components)def __getitem__(self, index):cls = type(self)if isinstance(index,slice):return cls(self._components[index])elif isinstance(index,numbers.Integral):return self._components[index]else:msg = '{cls.__name__} indices must be integers'return TypeError(msg.format(cls = cls))def __getattr__(self, item):# 只有当v.x实例不存在x属性时,才会调用getattrcls = type(self)if len(item) == 1:position = cls.shortcut_names.find(item)if 0 <= position < len(self._components):return self._components[position]msg = '{.__name__!r} object has not attribute {!r}'raise AttributeError(msg.format(cls,item))class Vector2:"""实现能够通过单个变量访问前几个分量,比如 v.x,v.y等实现方式: getattr方法"""typecode = 'd'shortcut_names = 'xyzt'def __init__(self, components):self._components = array(self.typecode, components)def __repr__(self):# 返回的components是str类型components = reprlib.repr(self._components)components = components[components.find('['):-1]return 'Vector({})'.format(components)def __str__(self):return str(tuple(self))def __iter__(self):return iter(self._components)def __bytes__(self):return (bytes([ord(self.typecode)]) + bytes(self._components))def __eq__(self, other):return tuple(self) == tuple(other)def __bool__(self):return bool(abs(self))def __abs__(self):return math.sqrt(sum(x * x for x in self._components))@classmethoddef frombytes(cls, octets):typecode = chr(octets[0])memv = memoryview(octets[1:]).cast(typecode)return cls(memv)def __len__(self):return len(self._components)def __getitem__(self, index):cls = type(self)if isinstance(index, slice):return cls(self._components[index])elif isinstance(index, numbers.Integral):return self._components[index]else:msg = '{cls.__name__} indices must be integers'return TypeError(msg.format(cls=cls))def __getattr__(self, item):# 只有当v.x实例不存在x属性时,才会调用getattrcls = type(self)if len(item) == 1:position = cls.shortcut_names.find(item)if 0 <= position < len(self._components):return self._components[position]msg = '{.__name__!r} object has not attribute {!r}'raise AttributeError(msg.format(cls, item))def __setattr__(self, name, value):cls = type(self)if len(name) == 1:# 限制修改'xyzt'单字母属性值if name in cls.shortcut_names:error = 'readonly attribute {attr_name!r}'elif name.islower():# 限制修改单字母(a-z)的属性值error = "can't set attributes 'a' to 'z' in {cls_name}!r"else:error = ''if error:msg = error.format(cls_name=cls, attr_name=name)raise AttributeError(msg)# 允许修改名字为其它值的属性super().__setattr__(name, value)if __name__ == '__main__':# 1.未设置setattr方法时的测试v = Vector([1,2,3,4,5])print(v.x) # 1.0# print(v.q) #  'Vector' object has not attribute 'q'v.x = 10# 当设置了v.x = 10之后,相当于给v实例新增了属性x(self.x = x),之后再访问v.x,不会走getattr方法,而是直接访问实例v的属性x的值print(v.x) # 10# 但是v的第一个分量值仍然为1.0,并没有发生变化(也正常,毕竟getattr方法也没有修改_components的值)# 但是上述两条结果时矛盾的:v.x(本意是对应实例v的第一个分量)的值发生了变化,但是通过直接访问v-的第一个分量值却又没有发生变化# 为了避免上述矛盾,可以通过setattr方法,限制修改`单字母`属性的值print(v) # (1.0, 2.0, 3.0, 4.0, 5.0)# 2. 设置setattr方法时的测试print('*********2. 设置setattr方法时的测试************')v2 = Vector2([1, 2, 3, 4, 5])print(v2.x)## 2-1  尝试修改v2.x的值#v2.x = 10 # AttributeError: readonly attribute 'x'## 2-2 尝试修改[a-z]之间某个单值属性的值#v2.a = 100 # AttributeError: can't set attributes 'a' to 'z' in <class '__main__.Vector2'>!r## 2-3 尝试修改名字为其它值的属性v2.name = 'Maple'# 修改成功print(v2.name) # Maple# 3.散列测试v3 = Vector2([1, 2, 3, 4, 5])v4 = Vector2([1, 2, 3, 4, 5])# 未实现hash方法,不能散列化set([v3,v4]) #TypeError: unhashable type: 'Vector2'

5、Vector类实现散列化

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/2/17 17:26
# @Author  : Maple
# @File    : 04-Vector类实现散列化.py
# @Software: PyCharmimport  functools
import numbers
import operator
import reprlib
from array import array"""
实现__eq__(已实现,为提升效率,改写以下)和__hash__
"""class Vector:typecode = 'd'shortcut_names = 'xyzt'def __init__(self, components):self._components = array(self.typecode, components)def __repr__(self):# 返回的components是str类型components = reprlib.repr(self._components)components = components[components.find('['):-1]return 'Vector({})'.format(components)def __str__(self):return str(tuple(self))def __iter__(self):return iter(self._components)def __bytes__(self):return (bytes([ord(self.typecode)]) + bytes(self._components))def __bool__(self):return bool(abs(self))def __abs__(self):return math.sqrt(sum(x * x for x in self._components))@classmethoddef frombytes(cls, octets):typecode = chr(octets[0])memv = memoryview(octets[1:]).cast(typecode)return cls(memv)def __len__(self):return len(self._components)def __getitem__(self, index):cls = type(self)if isinstance(index, slice):return cls(self._components[index])elif isinstance(index, numbers.Integral):return self._components[index]else:msg = '{cls.__name__} indices must be integers'return TypeError(msg.format(cls=cls))def __getattr__(self, item):# 只有当v.x实例不存在x属性时,才会调用getattrcls = type(self)if len(item) == 1:position = cls.shortcut_names.find(item)if 0 <= position < len(self._components):return self._components[position]msg = '{.__name__!r} object has not attribute {!r}'raise AttributeError(msg.format(cls, item))def __setattr__(self, name, value):cls = type(self)if len(name) == 1:# 限制修改'xyzt'单字母属性值if name in cls.shortcut_names:error = 'readonly attribute {attr_name!r}'elif name.islower():# 限制修改单字母(a-z)的属性值error = "can't set attributes 'a' to 'z' in {cls_name}!r"else:error = ''if error:msg = error.format(cls_name=cls, attr_name=name)raise AttributeError(msg)# 允许修改名字为其它值的属性super().__setattr__(name, value)def __eq__(self, other):# 如果分量太多,下面这种方式效率太低# return tuple(self) == tuple(other)if len(self) != len(other):return Falsefor x, y in zip(self, other):if x != y:return Falsereturn Truedef __hash__(self):# 生成一个迭代器hashes = (hash(x) for x in self._components)return functools.reduce(operator.xor, hashes, 0)# 等价于下面的写法# return functools.reduce(lambda x,y : x *y ,hashes,0)if __name__ == '__main__':v1 = Vector([1, 2, 3, 4, 5])v2 = Vector([1, 2, 3, 4, 5])print(set([v1, v2]))  # {Vector([1.0, 2.0, 3.0, 4.0, 5.0])}

6、Vector类格式化

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/2/17 17:38
# @Author  : Maple
# @File    : 05-Vector类格式化.py
# @Software: PyCharmimport  functools
import itertools
import math
import numbers
import operator
import reprlib
from array import arrayclass Vector:typecode = 'd'shortcut_names = 'xyzt'def __init__(self, components):self._components = array(self.typecode, components)def __repr__(self):# 返回的components是str类型components = reprlib.repr(self._components)components = components[components.find('['):-1]return 'Vector({})'.format(components)def __str__(self):return str(tuple(self))def __iter__(self):return iter(self._components)def __bytes__(self):return (bytes([ord(self.typecode)]) + bytes(self._components))def __bool__(self):return bool(abs(self))def __abs__(self):return math.sqrt(sum(x * x for x in self._components))@classmethoddef frombytes(cls, octets):typecode = chr(octets[0])memv = memoryview(octets[1:]).cast(typecode)return cls(memv)def __len__(self):return len(self._components)def __getitem__(self, index):cls = type(self)if isinstance(index, slice):return cls(self._components[index])elif isinstance(index, numbers.Integral):return self._components[index]else:msg = '{cls.__name__} indices must be integers'return TypeError(msg.format(cls=cls))def __getattr__(self, item):# 只有当v.x实例不存在x属性时,才会调用getattrcls = type(self)if len(item) == 1:position = cls.shortcut_names.find(item)if 0 <= position < len(self._components):return self._components[position]msg = '{.__name__!r} object has not attribute {!r}'raise AttributeError(msg.format(cls, item))def __setattr__(self, name, value):cls = type(self)if len(name) == 1:# 限制修改'xyzt'单字母属性值if name in cls.shortcut_names:error = 'readonly attribute {attr_name!r}'elif name.islower():# 限制修改单字母(a-z)的属性值error = "can't set attributes 'a' to 'z' in {cls_name}!r"else:error = ''if error:msg = error.format(cls_name=cls, attr_name=name)raise AttributeError(msg)# 允许修改名字为其它值的属性super().__setattr__(name, value)def __eq__(self, other):# 如果分量太多,下面这种方式效率太低# return tuple(self) == tuple(other)if len(self) != len(other):return Falsefor x, y in zip(self, other):if x != y:return Falsereturn Truedef __hash__(self):# 生成一个迭代器hashes = (hash(x) for x in self._components)return functools.reduce(operator.xor, hashes, 0)# 等价于下面的写法# return functools.reduce(lambda x,y : x *y ,hashes,0)# 计算n维球体的某个角坐标def angle(self,n):r = math.sqrt(sum(x * x for x in self[n:]))a = math.atan2(r,self[n-1])if (n == len(self) - 1) and (self[-1] < 0):return math.pi * 2 - 1else:return adef angles(self):return (self.angle(n) for n in range(1,len(self)))def __format__(self, fmt_spec):if fmt_spec.endswith('h'): # 超球面体fmt_spec = fmt_spec[:-1]coords = itertools.chain([abs(self)],self.angles())outer_format = '<{}>'else:coords = selfouter_format = '({})'components = (format(c,fmt_spec) for c in coords)return outer_format.format(', '.join(components))if __name__ == '__main__':# 格式化输出测试v1 = Vector([1, 2, 3, 4, 5])# 球面极坐标输出print(format(v1,'.2fh')) # <7.42, 1.44, 1.30, 1.13, 0.90># 其它正常格式输出print(format(v1,'.2f')) # (1.00, 2.00, 3.00, 4.00, 5.00)print(format(v1,'.2e')) #(1.00e+00, 2.00e+00, 3.00e+00, 4.00e+00, 5.00e+00)

相关文章:

流畅的Python(十)-序列的修改、散列和切片

一、核心要义 以第九章定义的二维向量为基础&#xff0c;定义表示多为向量的Vector类。该类将支持如下功能&#xff1a; 1. 基本的序列协议 2. 适当的切片支持&#xff0c;且返回的是新Vector实例 3.综合各个元素的值计算散列值 4.格式化展示 二、代码示例 1、前情提要 …...

TCP/IP五层各层协议详解

TCP/IP协议栈是网络通信的基础&#xff0c;它由五层协议组成&#xff0c;分别是物理层、数据链路层、网络层、传输层和应用层。以下是对各层协议的详细解释&#xff1a; 1. 物理层&#xff08;Physical Layer&#xff09;&#xff1a;该层负责传输比特流&#xff0c;主要定义传…...

MySQL 基础知识(九)之视图

目录 1 视图的介绍 2 视图算法 3 创建视图 4 查看视图结构 5 修改视图 6 删除视图 7 参考文档 1 视图的介绍 视图是一张并不存储数据的虚拟表&#xff0c;其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了视图的定义&#xff0c;通过 SQL 语句使用视图时…...

算法之力扣数青蛙

题目连接 文章目录 题目解析算法原理第一步第二步第三步第三步第四步指向o 代码讲解代码实现 题目解析 先给大家来讲解一下这个题目的意思吧&#xff0c;这个题目是说呢给你一个蛙叫的字符串让你去设计一个算法求出发出这种蛙叫最少需要几只青蛙。比如说第一个样例发出这种叫声…...

【后端高频面试题--Nginx篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--Nginx篇 往期精彩内容什么是Nginx&#xff1f;为什么要用Nginx&#xff1f;为…...

TiDB 在医疗保障信息平台的应用实践

文章介绍了 TiDB 在医疗保障信息平台中的应用。东软医保云应用管理平台通过与 TiDB 联合&#xff0c;成功满足了医疗保障业务中高并发、实时性和复杂查询的要求。在某地市医疗保障信息平台的实践中&#xff0c;TiDB 分布式数据库有效实现了在线交易和实时分析服务&#xff0c;日…...

支付交易——跨境交易

摘要 老王兢兢业业经营生意多年&#xff0c;一步步从小杂货店做到现在&#xff0c;成立大型贸易公司。在做大做强的过程中&#xff0c;老王觉得国内市场已经饱和&#xff0c;竞争处处是红海。老王留意海外很多年了&#xff0c;决定走出去&#xff0c;转向海外:将国外的商品引进…...

上位机图像处理和嵌入式模块部署(上位机主要功能)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前关于机器视觉方面&#xff0c;相关的软件很多。比如说商业化的halcon、vision pro、vision master&#xff0c;当然也可以用opencv、pytorch自…...

【前端工程化面试题】webpack的module、bundle、chunk分别指的是什么?

首先从语法方面 在配置文件中有 module 这个配置项&#xff0c;里面有 rules 选项用来配置各种 loader&#xff0c;还有其他各种选项&#xff0c;参考官网。bundle 和 chunk 在配置文件中是没有这个选项的&#xff0c;但是会出现在配置的值中。 module 模块 指单个文件&#xf…...

软件实例分享,家具生产出库管理系统软件教程

软件实例分享&#xff0c;家具生产出库管理系统软件教程 一、前言 以下软件程序教程以 佳易王家具行业生产出库管理系统软件V16.1为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 销售管理——产品状态查询变更&#xff0c;可以根据生产进度变更…...

[uniapp的页面传参]详细讲解uniapp中页面传参的传递方式和接受方式 使用案例 代码注释

目录 一、传递方式1. URL传参2. Storage传参3. Vuex传参4.api传参eventChannel 二、接受方式1. URL传参2. Storage传参3. Vuex传参4.api传参eventChannel 三、使用案例四.提醒 在uniapp中&#xff0c;页面传参是非常常见的需求。本文将详细讲解uniapp中页面传参的传递方式和接受…...

Python实现时间序列分析霍尔特季节性平滑模型(Holt算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 霍尔特季节性平滑模型是指数平滑技术的一种扩展形式&#xff0c;由E. S. Holt和P. R. Winters分别独立…...

Rokid Station 进fastboot

前一阵子手里的station开不开机了&#xff0c;反复重启&#xff0c;摸索出进fastboot的方法&#xff1a; 关机状态下同时按电源键下面的确认键&#xff08;○键&#xff09;&#xff0c;指示灯会进入白色常亮状态&#xff0c;插入电脑会在设备管理器内显示DNL设备&#xff08;…...

Java支持的默认访问修饰符是什么?

Java支持的默认访问修饰符是没有指定任何访问修饰符&#xff0c;通常被称为“包访问级别”或“默认访问级别”。当一个类成员&#xff08;包括类、接口、变量以及方法&#xff09;没有显式地指定任何访问修饰符时&#xff0c;它就会拥有默认访问级别。 在默认访问级别下&#…...

Java使用Documents4j实现Word转PDF(知识点+案例)

文章目录 前言源码获取一、认识Documents4j二、快速集成2.1、pom.xml依赖2.2、word转PDF实现项目目录WordUtils.javaDemo6.java测试效果 参考文章资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里…...

CSimplemathproblem ---- 牛客网

题目描述 这一节课&#xff0c;Priest给大家做了一个小测试。 老师给了你两个正整数X, Y。并按照一下规则做运算&#xff0c;求出答案Z。 如果X是Y的因数&#xff0c;则Z等于X Y。否则Z Y - X。 输入描述: 输入两个正整数X, Y。 (1 < X < Y < 100000000000000)。 输…...

[嵌入式系统-27]:RT-Thread -14- 操作系统配置:rtconfig.h文件与menuconfig命令

目录 一、rtconfig.h 1.1 概述 1.2 软硬件资源配置 1.3 功能模块选择 1.4 内核配置详解 1.5 调度器配置 1.6 硬件设备驱动配置 1.7 网络配置 1.8 调试配置 二、menuconfig 2.1 概述 2.2 主要功能 三、RT Thread配置 VS Linux配置 一、rtconfig.h 1.1 概述 rtco…...

C++面向对象程序设计-北京大学-郭炜【课程笔记(一)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;一&#xff09;】 1、引用的概念1.1、引用应用的简单示例1.2、常引用 2、"const"关键字的用法&#xff08;常量指针/指针常量&#xff09;3、动态内存分配4、内联函数5、函数重载5.1、什么是函数重载5.2、函数…...

C语言:国家名称按字母表排序

题目描述 输入一个整数n(n<20)&#xff0c;表示待输入国家的数量。随后输入n个国家或地区的名称 (名称长度为1~30)&#xff0c;要求按字母顺序升序输出。 注意&#xff1a;名称中可能包含空格符。 提示 字符串比较请使用函数&#xff1a; int strcmp(const char* str1&a…...

2/18作业

1. #!/bin/bash function fun() { uidgrep ^ubuntu /etc/passwd | cut -d : -f 3 gidgrep ^ubuntu /etc/passwd | cut -d : -f 4 echo "uid为$uid,gid为$gid" } resultfun echo $result...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...

ZYNQ学习记录FPGA(二)Verilog语言

一、Verilog简介 1.1 HDL&#xff08;Hardware Description language&#xff09; 在解释HDL之前&#xff0c;先来了解一下数字系统设计的流程&#xff1a;逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端&#xff0c;在这个过程中就需要用到HDL&#xff0c;正文…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...