Skip to content

Commit

Permalink
2024-09-20 13:21:27
Browse files Browse the repository at this point in the history
JQiue committed Sep 20, 2024
1 parent a000924 commit bbb6e30
Showing 23 changed files with 2,473 additions and 1,701 deletions.
1 change: 0 additions & 1 deletion docs/.vuepress/theme.ts
Original file line number Diff line number Diff line change
@@ -73,7 +73,6 @@ const theme = hopeTheme({
? 'https://waline.jinqiu.wang'
: 'http://127.0.0.1:8360',
reaction: true,
lang: 'en',
},
mdEnhance: {
katex: true,
6 changes: 3 additions & 3 deletions docs/ds-algorithm/other.md
Original file line number Diff line number Diff line change
@@ -197,11 +197,11 @@ class Dictionary {

:::

## 散列表
## 哈希表

数组查找已经够快了,但是只能根据下标进行访问,如果根据内容查找,依然需要遍历每一个数组元素

散列表是字典类的一种,也叫哈希表,是通过计算一个键值对的函数,将所需要查询的数据映射到表中的某个位置来访问数据,这个映射函数被称为哈希函数或散列函数,极大的增强了查找速度
哈希表是字典类的一种,也叫散列表,是通过计算一个键值对的函数,将所需要查询的数据映射到表中的某个位置来访问数据,这个映射函数被称为哈希函数或散列函数,极大的增强了查找速度

哈希函数能够决定容器的访问效率,常用的哈希函数有:

@@ -282,7 +282,7 @@ class HashTable {

:::

## 哈希冲突
### 哈希冲突

由于哈希算法计算结果长度有限,很小概率下一些键会产生相同的哈希值,当不同的值在哈希表中对应相同位置时,就被称为冲突。使用一个数据结构来保存数据的目的显然不是丢失掉这些数据,而是通过某种方法来将它们保存起来,因此发生这种情况时必须要去解决

34 changes: 6 additions & 28 deletions docs/operating-system/linux.md
Original file line number Diff line number Diff line change
@@ -7,9 +7,7 @@ Linux 是一种免费开源的类 Unix 操作系统,使用了 UNIX 设计哲

## 发行版

Linux 发行版是指基于 Linux 内核开发的完整操作系统。它们会额外打包一些应用软件并提供生态支持

主要的 Linux 发行版有:
Linux 发行版是指基于 Linux 内核开发的完整操作系统,它们会额外打包一些应用软件并提供生态支持,主要的 Linux 发行版有:

+ Debian:非常成熟稳定,用于种服务器及工作站
+ Ubuntu:基于 Debian 开发,桌面版用户体验好,很受个人用户欢迎
@@ -331,29 +329,11 @@ scp 本地文件路径 目标机器:目标机器的文件路径

在 Linux 中,环境变量的加载顺序是非常重要的,不同的加载顺序会导致环境变量的优先级和作用范围发生变化。以下是 Linux 中常见的环境变量加载顺序:

1. /etc/profile

这是系统级别的配置文件,在系统启动时加载。
在这个文件中设置的环境变量对所有用户都生效。

2. /etc/environment

这也是系统级别的配置文件,在系统启动时加载。
在这个文件中设置的环境变量对所有用户都生效。

3. /etc/profile.d/*.sh

这个目录下的所有 .sh 脚本文件会在系统启动时被加载。
可以在这些脚本文件中设置针对特定服务或应用的环境变量。

4. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile
这些是用户级别的配置文件,在用户登录时加载。
在这些文件中设置的环境变量只对当前用户生效。

5. ~/.bashrc
这也是用户级别的配置文件,在每次打开 shell 时加载。
在这个文件中设置的环境变量只对当前用户生效。
需要注意的是,上述加载顺序是针对使用 Bourne shell 及其衍生 shell (如 bash) 的情况。如果使用其他 shell,如 zsh 或 fish,加载顺序可能会略有不同。
1. /etc/profile - 这是系统级别的配置文件,在系统启动时加载。在这个文件中设置的环境变量对所有用户都生效。
2. /etc/environment - 这也是系统级别的配置文件,在系统启动时加载。在这个文件中设置的环境变量对所有用户都生效。
3. /etc/profile.d/*.sh - 这个目录下的所有 .sh 脚本文件会在系统启动时被加载。可以在这些脚本文件中设置针对特定服务或应用的环境变量。
4. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile - 这些是用户级别的配置文件,在用户登录时加载。在这些文件中设置的环境变量只对当前用户生效。
5. ~/.bashrc - 这也是用户级别的配置文件,在每次打开 shell 时加载。在这个文件中设置的环境变量只对当前用户生效。需要注意的是,上述加载顺序是针对使用 Bourne shell 及其衍生 shell (如 bash) 的情况。如果使用其他 shell,如 zsh 或 fish,加载顺序可能会略有不同。

另外,对于 systemd 服务,环境变量的加载顺序也会略有不同。通常建议直接在 systemd 服务文件的 [Service] 部分设置环境变量,以确保它们能被正确加载

@@ -502,8 +482,6 @@ journalctl
journalctl -u your-service.service
```



如果 Linux 发行版支持 systemd,那么从启动时开始,它每秒钟都会从系统的所有进程和应用程序中收集日志。所有这些日志事件都由 systemd 的 journald 守护程序管理。journald 收集所有的日志(信息、警告、错误等),并将其作为二进制数据存储在磁盘文件中,日志以二进制形式存储在路径 /var/log/journal

由于日志保留在磁盘中,而且每秒钟都在收集,所以它占用了巨大的磁盘空间,`journalctl --disk-usage`查看占用空间
117 changes: 92 additions & 25 deletions docs/python/README.md
Original file line number Diff line number Diff line change
@@ -5,39 +5,41 @@ tag: [Python]
article: false
---

Python 是一门开源的,免费的,通用型脚本语言,上手简单,功能强大,坚持“极简主义”
Python 是一门开源的,免费的,通用型脚本语言,上手简单,功能强大,坚持“极简主义”

Python 语言是在 ABC 教学语言的基础上发展来的,遗憾的是,ABC 语言虽然非常强大,但却没有普及应用,Guido 认为是它不开放导致的

基于这个考虑,Guido 在开发 Python 时,不仅为其添加了很多 ABC 没有的功能,还为其设计了各种丰富而强大的库,利用这些 Python 库,程序员可以把使用其它语言制作的各种模块(尤其是C语言和 C++)很轻松地联结在一起,因此 Python 又常被称为“胶水”语言。这使 Python 几乎无所不能,不管是传统的 Web 开发,PC 软件开发,Linux 运维,还是当下最热门的机器学习,大数据分析,网络爬虫,它都能胜任
基于这个考虑,Guido 在开发 Python 时,不仅为其添加了很多 ABC 没有的功能,还为其设计了各种丰富而强大的库,利用这些 Python 库,程序员可以把使用其它语言制作的各种模块(尤其是 C 和 C++)很轻松地联结在一起,因此 Python 又常被称为“胶水”语言。这使 Python 几乎无所不能,不管是传统的 Web 开发,PC 软件开发,Linux 运维,还是当下最热门的机器学习,大数据分析,网络爬虫,它都能胜任

同时 Python 也是完全面向对象的语言,函数,模块,数字,字符串都是对象,在 Python 中一切皆对象

从整体上来看,Python 最大的特点就是简单:

1. 语法简洁明了,即使是非专业的初学者也非常容易上手
2. 和其他语言相比,要实现同一个功能,而 Python 的代码往往是最短的
3. 丰富的标准库和第三方库,大大减少了开发工作量

## Python 的缺点
Python,作为一种解释型语言,运行速度相对较慢。这是所有解释型语言的共同特点,不仅仅是 Python 的问题。正是因为 Python 屏蔽了很多底层细节,这个代价是非常大的,这个过程中 Python 需要做出很多工作,消耗了较多资源。然而,这个问题并非无解。有些实现如 PyPy 通过即时编译(JIT)等技术显著提升了 Python 的执行速度。此外,对于大多数应用场景,Python 的性能已经足够,而且随着硬件性能的不断提升,这个问题变得越来越不明显。在需要极高性能的场景下,可以考虑使用 Cython 或其他优化技术,或者将关键部分用 C/C++ 实现然后集成到 Python 中

Python 运行速度是最慢的,当然这是所有的解释性语言的通病,正是因为 Python 屏蔽了很多底层细节,这个代价是非常大的,这个过程中 Python 需要做出很多很多工作,消耗了很多资源。虽然缺点是运行速度慢,但这并不是什么大问题,因为计算机的运行速度是越来越快的,只要多花钱就可以堆很高的性能,即用硬件的性能来弥补软件的不足
Python 3.x 是一次重大升级,为了避免引入历史包袱,Python 3.x 和 Python 2.x 并没有考虑兼容性,这导致大部分已经使用 Python 2.x 生产的应用项目无法升级 Python 3.x,虽然官方仍在维护 Python 2.x,但是大部分刚刚起步的项目却使用的 Python 3.x,学新不学旧才是最聪明的做法,因此 Python 3 才是学习的主力,但是对于学透的人来说,无非就是写法上的不同

## 2 VS 3
## Python 的实现

Python 3.x 是一次重大升级,为了避免引入历史包袱,Python 3.x 和 Python 2.x 并没有考虑兼容性,这导致大部分已经使用 Python 2.x 生产的应用项目无法升级 Python 3.x,虽然官方仍在维护 Python 2.x,但是大部分刚刚起步的项目却使用的 Python 3.x,学新不学旧才是最聪明的做法,因此 Python3 才是学习的主力,但是对于学透的人来说,无非就是写法上的不同
Python 不仅在说语言本身,也包括具体的实现,Python 实际上是一个可以通过不同的方式来实现的语言规范

## Python 的解释器
+ [CPython](http://www.python.org/) - 官方版本的 C 语言实现,大部分人的选择
+ [PyPy](https://www.pypy.org/) - 支持 JIT 即时编译,具有静态类型,特点是运行速度快
+ [Cython](https://cython.org/) - 将 Python 代码编译成 C 代码,可以显著提高性能
+ [Jython](http://www.jython.org/) - 可以运行在 Java 平台,如果想要和 Java 代码库进行对接,或为 JVM 编写,就应该考虑它
+ [IronPython](https://ironpython.net/) - 可以运行在 .NET 和 Mono 平台

Python 不仅在说语言本身,也包括具体的实现,Python 实际上是一个可以通过不同的方式来实现的语言规范
## 安装 && 运行

+ [CPython](http://www.python.org/) 官方版本的 C 语言实现,大部分人的选择
+ [Jython](http://www.jython.org/) 可以运行在 Java 平台,如果想要和 Java 代码库进行对接,或为 JVM 编写,就应该考虑它
+ [IronPython](https://ironpython.net/) 可以运行在 .NET 和 Mono 平台
+ [PyPy](https://www.pypy.org/) 支持 JIT 即时编译,具有静态类型,特点是运行速度快
::: tabs

## 配置环境
@tab:active Windows

在系统上安装 Python 就像安装普通软件一样简单,下载安装包一路猛击即可
在 Windows 上安装 Python 就像安装普通软件一样简单,下载安装包一路猛击即可

安装包地址:[Download](https://www.python.org/downloads/)

@@ -50,7 +52,7 @@ Python 不仅在说语言本身,也包括具体的实现,Python 实际上是

+ `embeddable zip file`表示`.zip`格式的绿色免安装版本,可以直接嵌入(集成)到其它的应用程序中
+ `executable installer`表示`.exe`格式的可执行程序,这是完整的离线安装包,一般选择这个即可
+ `web-based installer`表示通过网络安装的,也就是说下载到的是一个空壳,安装过程中还需要联网下载真正的 Python 安装包
+ `web-based installer`表示通过网络安装的,也就是说下载到的是一个 Python 安装器,而不是本身,安装过程中还需要联网下载真正的 Python 安装包

安装时候请尽量勾选`Add Python 3.8 to PATH`,这样就可以在系统任何位置使用 Python 提供的命令工具

@@ -63,27 +65,37 @@ Python 不仅在说语言本身,也包括具体的实现,Python 实际上是
+ Manuals:使用手册
+ Python:进入交互式命令界面

## 运行
@tab Linux

Python 支持两种代码的运行方式
大多数 Linux 发行版已预装 Python,如果需要安装或升级,可以使用发行版的包管理器。例如,在 Ubuntu 上

1. 交互式
2. 文件式
```sh
sudo apt update
sudo apt install python3
```

在命令行窗口中直接输入代码并按下回车就能立即看到结果,还可以继续输入下一行代码,再次回车看到结果,整个过程就像和计算机对话一样,这就是为什么很多非程序员喜欢 Python 的原因,只要输入执行的运算,Python 就能立即显示答案,优点是适合学习语法和部分代码,缺点是代码不能保存,不能用来做太大的项目
:::

创建一个以`.py`为后缀的源文件,将所有的代码放入源文件中,让解释器逐行读取并执行,源文件是纯文本文件,文件式编写是最正统的开发模式,也是最主流的使用方式,Python3.x 已经将 UTF-8 作为默认的编码格式,这意味着它可以支持中文(不建议这么做),运行源文件通常有两种办法
Python 支持两种代码的运行方式

1. 使用 IDLE 打开源文件,然后在菜单中选择`Run->Run Module`,或者按下 F5
2. 使用 python 提供的命令来执行源文件(安装编译器勾选 Add Python to PATH),进入源文件目录下执行`python <源文件路径>`,可以是相对路径,也可以是绝对路径
1. 交互式 - 直接在命令行中输入 python 或 python3 启动交互式环境,优点是适合学习语法和部分代码,缺点是代码不能保存,不能用来做太大的项目
2. 文件式 - 创建`<filename>.py`文件,然后使用 python filename.py 运行,此模式适合编写完整的项目

## pip
## 包管理器

pip 是官方的包管理器

```sh
pip install <packagename> # 安装包
pip uninstall <packagename> # 卸载包
pip list # 列出已安装的包
pip freeze > requirements.txt # 生成依赖列表
pip install -r requirements.txt # 从依赖列表安装包
```

### requirements.txt

requirements.txt 文件包含项目所需要的依赖,但它不会自动生成,通常移植时进行使用,`pip install`会安装声明的依赖
`requirements.txt`文件列出了当前项目所有依赖的包及其版本,方便在其他环境重新部署项目。手动编写`requirements.txt`较为繁琐,通常使用`pip freeze`命令自动生成

```
annotated-types==0.6.0
@@ -101,6 +113,61 @@ typing_extensions==4.10.0
uvicorn==0.27.1
```

### 虚拟环境

Python 应用通常会使用许多第三方包,不同的应用所需的包也不尽相同。为了避免不同的项目之间产生依赖包的版本冲突,Python 提供了虚拟环境(virtual environment)的功能。虚拟环境是 Python 解释器的一个独立副本,每个虚拟环境都有自己的 Python 二进制文件、库和脚本目录,与系统全局环境和其他虚拟环境隔离

Python 3.3 及以上版本通过 venv 模块原生支持虚拟环境,无需额外安装。创建虚拟环境的命令:

```sh
python -m venv /path/to/new/virtual/environment
```

例如要在当前目录下创建一个名为 venv 的虚拟环境,可以运行:

```sh
python -m venv venv
```

创建好虚拟环境后,需要激活才能使用,Windows 下激活虚拟环境:

```sh
venv\Scripts\activate
```

Linux 或 macOS 下激活虚拟环境:

```sh
source venv/bin/activate
```

进入虚拟环境后,命令行提示符前面会出现虚拟环境的名称,表示当前正在虚拟环境中运行。在虚拟环境中安装的包不会影响系统全局环境

退出虚拟环境,只需运行:

```sh
deactivate
```

### uv

uv 是用 Rust 编写的非常快的 Python 包和项目管理器

```sh
uv python install # 安装最新版 Python
uv python install 3.11 3.12 # 安装特定版本以及多个版本
uv python install pypy@3.12 # 安装其他实现
uv python list # 查看可用和已安装的 Python 版本
uv run example.py # 运行脚本
uv tool install ruff # 安装工具
uv tool upgrade ruff # 升级工具
uv init hello-world # 初始化一个项目
uv build # 构建项目
uv add requests # 添加依赖到 pyproject.toml
uv remove requests # 添加依赖到 pyproject.toml
uvx ruff # 运行工具
```

## 参考资料

+ Python 编程:从入门到实践
47 changes: 0 additions & 47 deletions docs/python/standard.md
Original file line number Diff line number Diff line change
@@ -49,53 +49,6 @@ print("%s%d%f" % (name, age, height)) # 可以同时输出多个变量
这里的(name, age, height)本质上是元组类型
:::

## 类型检测

### type

type 函数用于返回对象的类型

```python
print(type(1)) # <class 'int'>
print(type(1.1)) # <class 'float'>
print(type("1")) # <class 'str'>
print(type(True)) # <class 'bool'>
print(type([])) # <class 'list'>
print(type(())) # <class 'tuple'>
print(type({})) # <class 'dict'>
print(type({1,})) # <class 'set'>
```

### isinstance

isinstance 函数用于判断一个对象是否为另一个已知的类型,可以是 Python 定义的,也可是通过 class 定义的类

```python
print(isinstance(1, int)) # true
print(isinstance(1.1, float)) # true
print(isinstance("1", str)) # true
print(isinstance(True, bool)) # true
print(isinstance([], list)) # true
```

### type 和 isinstance 的不同

```python
class Person:
def say(slef):
print("I am a human")

class Student(Person):
pass

print(type(Student()) == Student) # true
print(type(Student()) == Person) # false
print(isinstance(Student(), Student)) # true
print(isinstance(Student(), Person)) # true
```

结论可知,type 不会考虑该类型的继承关系,而 isinstance 则会将子类认为父类的类型,会考虑继承关系

## 类型转换

1. int:转换为整型
Loading

0 comments on commit bbb6e30

Please sign in to comment.