在 Linux Bash 命令中,有;,&&,||三种命令链接方式,本文将介绍他们之间的区别
三种连接方式的区别
;:各个命令之间相互独立,不管前面的语句是否成功执行,所有命令都将被执行&&:命令依次被执行,只有当前面的命令执行成功后,后面的命令才会被执行||:命令依次被执行,只有当前面的命令执行失败后,后面的命令才会被执行
凡事预则立,不预则废
show engines;show variables like '%storage_engine%';show create table tableName;alter table tableName engine = innodb;create table mytable (id int, titlechar(20)) engine = innodb变量 @@autocommit
1 | select @@autocommit; |
@@autocommit 为0时表示不以显示事务开头的语句或者以事务开头(begin; 或者 start transaction;)都会被缓存起来并且在commit;提交前都可以用rollback;回滚
@@autocommit 为1时表示必须以事务开头的语句才会被缓存,否则一个sql语句将会被当做一个事务提交,将不能使用rollback;语句回滚
说明:不是所有引擎都支持事务,常用的支持事务的引擎是InnoDB
Hexo命令归纳整理
hexo init [folder]
# 在cmd命令下,cd到你所需要建立博客的文件夹,执行此命令,其中folder为可选指令,若不写,则默认当前目录
hexo new [layout] \<title\>
#layout为可选项,默认使用_config.yml中的default_layout。新建文章的指令
hexo generate
# 生成静态文件,
# 可选参数:
-d ,–deploy 文件生成后立即部署网站
-w , –watch 件事文件变动
hexo deploy
# 发布到网站,这里就是发布到 _config.yml中deploy中设置的网址上。
# 参数
-g , –generate 部署前生成静态文件
每一个rn项目都有一个package.json文件,里面有很多组件信息,使用npm install将按照package.json安装所需要的组件放在生成的node_modules文件夹中,rn项目下的每一个文件中都可以通过import引入node_modules的组件来加以使用
hexo clean 清除缓存文件(db.json)和已生成的静态文件(public),通常更换主题后,无效时,可以运行此命令
hexo server
# 启动server,就可以在本地预览效果。
#参数,默认网址http://localhost:4000/
-p , –port 重设端口
-s , –static 只是用静态文件
-l , –log 启动日志记录,使用覆盖记录格式
-i , –ip 重新制定服务器ip
梯度方向是函数局部上升最快的方向

__getattr__和__setattr__等,实现了将字典键转换为对象属性的功能1 | pip install easydict |
简单使用示例:
1 | from easydict import EasyDict as edict |
嵌套字典的访问:
1 | my_dict = edict({ |
动态设置属性:
1 | my_dict = edict() |
常见的字典操作:
1 | my_dict = edict({'key1': 'value1'}) |
获取默认值:
1 | my_dict = edict({'name': 'Alice'}) |
namedtuple 都是 Python 中用于简化数据访问的工具namedtuple 是”先定义类,再用类创建实例”;EasyDict 是”直接用通用类创建实例,动态定义结构”namedtuple 需要先定义特定结构的类(如Person),再创建该类的实例,适合固定结构的数据EasyDict类创建实例,实例的字段结构可以动态变化,适合灵活的数据场景namedtuple;若需 动态结构、灵活修改 ,优先便捷性,用 EasyDictnamedtuple 是 tuple 的子类,属于不可变(immutable)数据结构namedtuple 定义时需要指定固定的字段名,结构是静态的,不能动态添加新字段dict 的子类,属于可变(mutable)数据结构obj.field)和 键值访问(如 obj['field']),但底层实现不同:namedtuple 本质是元组,字段值存储在固定位置,访问速度更快__getattr__ 实现属性访问,性能略低于 namedtuplenamedtuple 不可变:创建后无法修改字段值,也不能添加新字段,类似常量集合,示例如下:
1 | from collections import namedtuple |
EasyDict 可变:支持修改现有字段、添加新字段、删除字段等操作,示例如下:
1 | from easydict import EasyDict as edict |
namedtuple 显式定义了一个新的类(如Person),这个类继承自tuple,并且在定义时就固定了字段结构,例如:
1 | from collections import namedtuple |
Person() 是创建该类的实例,每个实例都严格遵循预定义的字段结构EasyDict 没有要求你显式定义新的类(如Person),但它本身是一个通用的 EasyDict 类,所有实例都属于这个类,例如:
1 | from easydict import EasyDict as edict |
p 视为一个”动态对象”,它属于 EasyDict 类,但其字段可以灵活添加/修改,不需要提前定义特定的类(如Person)namedtuple 适合存储 固定结构、不可变的数据(如配置项、记录、坐标等),强调数据的稳定性和内存效率Point(x=1, y=2)、数据库查询结果等namedtuple 比 EasyDict 更轻量,内存占用更少namedtuple 可直接通过 _asdict() 转换为普通字典,EasyDict 本身就是字典,可直接序列化namedtuple 在定义时已明确字段,类型提示更友好;EasyDict 动态字段较多,类型提示较弱由于queue不是Python标准库,所以在LeetCode等OJ上面不能直接使用,我们可以选择heapq来使用最大最小堆
堆排序示例
1 | import heapq |
加入元素
1 | heapq.heappush(heap, num) |
弹出元素
1 | num = heapq.heappop(heap) |
获取最大最小值
1 | import heapq |
获取堆顶元素
1 | top = nums[0] |
heapq模块只实现了最小堆, 最大堆需要我们自己实现iter() 函数主要用于生成迭代器iter() 函数的主要作用是把可迭代对象转变为迭代器next() 函数来获取下一个元素__iter__() 和 __next__() 方法来自定义迭代器StopIteration 异常或者设置哨值能够终止迭代iter()函数的基本用法函数用法:
1 | iter(iterable) |
iterable 可以是列表、元组、字符串、集合等可迭代对象示例:遍历列表
1 | my_list = [1, 2, 3, 4, 5] |
iter() 函数,还能自定义迭代器,这需要在类中实现 __iter__() 和 __next__() 方法 1 | class MyNumbers: |
StopIteration 异常来终止迭代 1 | class MyNumbers: |
iter() 函数调用并返回一个迭代器的对象for 循环遍历,不存储迭代状态(即每次调用 iter() 都会生成一个新的迭代器)__next__() 方法和 __iter__() 方法的对象iter() 函数返回的对象、生成器(generator)等next() 方法会返回下一个元素,直到耗尽后抛出 StopIteration__iter__() 方法返回自身(所以迭代器也是一种可迭代对象)iter() 的第二个参数iter() 函数还有一种不太常见的用法,就是接收两个参数1 | def my_function(): |
__iter__ 函数的用法for i in x 循环中,x.__iter__() 只会被调用一次 ,且该方法的返回值必须是一个 Iterator(迭代器)__iter__ 的调用 1 次后,循环的所有迭代过程,都基于 __iter__ 返回的同一个迭代器__iter__ 的返回值要求:必须返回一个实现了迭代器协议的对象(即同时具有 __iter__() 和 __next__() 方法的对象)__iter__:“生产迭代器”(返回新的迭代器实例);__iter__:“暴露自己”(返回自己,因为自己就是 “干活的”)__next__(),真正用于返回下一个元素for 循环的对象,一定是具有 __iter__() 函数的for i in x 的底层逻辑完全遵循迭代协议,步骤如下:x.__iter__(),获取一个迭代器对象(记为 it);it.__next__(),每次返回的结果赋值给 i,执行循环体;it.__next__() 抛出 StopIteration 异常时,循环捕获该异常并正常终止(不会暴露给用户)x.__iter__() 只在第一步执行一次,后续所有迭代都依赖第一步返回的那个 it 迭代器iterable 对象?for i in x 时,Python 的迭代机制会:field 主要关联两个核心场景:dataclasses 模块的 field() 函数 ,用于定制数据类字段pydantic 的 Field 类 (注意:首字母是大写), 用于数据校验/序列化dataclasses 是 Python 内置的轻量级数据类工具field() 用于精细化定义数据类的字段(替代默认的简单赋值),支持定制默认值、初始化行为、序列化等用法示例:
1 | from dataclasses import dataclass, field |
field() 核心参数说明
defaultdefault_factory 二选一) field(default=0)default_factoryfield(default_factory=list)init __init__ 方法(默认 True) field(init=False)repr__repr__ 输出中(默认 True) compare __eq__/__lt__ 等,默认 True) hash__hash__ 计算(默认 None,继承 compare 值) metadatafield(metadata={"desc": "用户ID"})示例:基础使用(默认值/工厂函数)
1 | from dataclasses import dataclass, field |
示例2:定制初始化/序列化行为
1 | @dataclass |
示例3:附加元数据
1 | @dataclass |
pydantic 是Python主流的数据校验库Field 用于定义模型字段的校验规则、默认值、文档等,功能比 dataclasses.field 更丰富1 | pip install pydantic |
用法说明:
1 | from pydantic import BaseModel, Field |
核心参数说明
default/default_factory:Field(default=10) / Field(default_factory=list)aliasField(alias="user_id")gt/ge/ lt/leField(gt=0)(值必须>0)min_length/max_lengthField(min_length=2, max_length=10)patternField(pattern=r"^[A-Z]+$")description Field(description="用户年龄")nullable Optional)Field(nullable=True)examplesField(examples=[18, 20])示例1:基础校验
1 | from pydantic import BaseModel, Field |
示例2:别名与默认值
1 | class Product(BaseModel): |
示例3:结合文档(OpenAPI)
1 | from pydantic import BaseModel, Field |
dataclasses.field 还是 pydantic.Field,可变类型(list/dict/set)的默认值必须用 default_factory,否则所有实例会共享同一对象tags: list = []tags: list = field(default_factory=list)nullable=True 允许字段为None;v2 需用 Optional[类型](如 age: Optional[int] = Field(None))Field 的参数更简洁,推荐使用最新版@dataclass(frozen=True),此时 init=False 的字段需在 __post_init__ 中赋值各种镜像源管理
1 | pip config list |
在命令后面添加如下参数即可将安装源换成阿里云
1 | -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com |
只在当前命令中修改,以后想要使用时需要继续添加参数
特别说明: 在阿里云的服务器上使用这个指令时效果非常明显
修改文件~/.pip/pip.conf内容, 如果没有该文件则新建一个
1 | vim ~/.pip/pip.conf |
这个命令修改当前用户的默认pip命令镜像
各种镜像列表:
1 | 官方:https://pypi.org/simple |
其中清华的比较常用
/etc/apt/source.list 1 | sudo /vim/apt/source.list |
1 | deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse |
1 | deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse |
1 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse |
/etc/yum.repos.d/CentOS-Base.repo 1 | # backup |
查看 conda 源:
1 | conda config --show channels |
删除 conda 源:
1 | conda config --remove channels [target_url] |
清空 conda 源:
1 | conda config --remove-key channels |
defaults 源,如果要删除该源,需要手动删除添加 conda 源:
1 | conda config --add channels [new_channel_url] |
安装时临时指定镜像
1 | conda install -c [channel_url] [package_name] |
/cloud/pytorch/ :提供PyTorch深度学习框架及其依赖库/cloud/menpo/ :提供计算机视觉相关工具(如dlib、OpenCV)/cloud/conda-forge/ :社区维护的开源包(覆盖科学计算、数据分析等领域)/pkgs/free/ :Anaconda早期免费版仓库(现多合并至main)/pkgs/main/ :Anaconda官方核心包(Python、NumPy、SciPy等基础库)示例添加清华源:
1 | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ |
conda config --set show_channel_urls yes 可让后续的安装都打印 conda 源信息一条指令恢复默认源(清空所有源):
1 | conda config --remove-key channels |
hexo d后也会出现CNAMEsource文件夹下面新建该文件hexo generate时会将source文件夹下面的文件都拷贝到public文件夹下面