Git学习笔记——1. 基础
关于 Git 的学习笔记整理,这部分资料准备了很久,因为中文的教程大都过于简略,并且不涉及原理,学不明白,至于英文的文档也过于复杂,各种参数选项非常复杂。学习笔记的内容并不是由浅入深地介绍Git,而是一个梳理笔记,主要参考Git 官方手册 Git 必要配置 Git 的配置分成三层: 第一层是仓库级,在仓库目录下,文件为.git/config 第二层是用户级,在用户主目录下,文件为~/.gitconfig(主要修改的是用户级配置) 第三层是系统级,在安装目录下,安装时的选项会保存在这里 范围越小的配置文件优先级越高。除了这几个配置文件,还有一些可选的辅助配置文件,例如 关于排除文件的规则配置 .gitignore 关于文件格式的配置 .gitattributes 关于子模块的配置 .gitsubmodule 值得注意的,Git在每次操作时,会检查当前工作目录中实际存储的.gitignore以及其它配置文件,而不是Git保存的最新版本,即使我们修改了.gitignore,也不需要先单独提交.gitignore,它的规则会立即生效。 我们主要关注用户级配置文件,有如下常用...
Git 命令速查
基础操作 仓库初始化 1git init 克隆远程仓库 1git clone <url> xxx 查看仓库状态 1git status 添加文件到暂存区 123git add <file>git add . 提交更改 123git commitgit commit -m "commit message" 查看提交历史 1git log 分支基本操作 查看分支 1git branch -va 查看相对于当前分支的未合并分支 1git branch --no-merged 创建新分支 1git branch <branch_name> 切换分支 1git switch <branch_name> 新建并切换到分支 1git switch -c <branch_name> 重命名分支 1git branch -m master main 删除分支 1git branch -d <branch_name> 分支合并操作 普通合并 12git switch mastergit merge iss53...
Python 学习笔记——11.类型注解和帮助系统
虽然 Python 作为动态语言具有极高的灵活性,编程非常便利,但是为了让程序更加清晰可读,有必要加入类型注解,要求 Python 3.9+,一些关于类型注解需要的内容在 typing 模块,在高版本中部分情况可以省略导入typing模块。 类型注解不是强制的,并不会真正影响Python脚本的执行,但是静态代码检查可以基于类型注解提供警告,以提高编程的可靠性。这种类型检查的使用也很繁琐,容易误报警告,过度使用类型注解会丧失Python的灵活性。 变量注解 在定义变量时可以注解它的类型,这对静态代码分析很有帮助,例如 12age: int = 20age = '20' 第二行会标红:静态检查不通过,但是代码仍然可以正常执行。 注意: 在 VScode+jupyter 中,只有处于同一个 cell 的代码才会执行静态检查,不同 cell 之间不会进行检查。 这种变量类型注解写错了可能找不出来,例如 age: float = 20,这不会影响程序执行效果,但是会误导静态分析。 例如几种基本的类型 1234a: int = 3b: float = 3.14c:...
Python 学习笔记——10.基本类型常用操作
记录一下涉及到字符串,列表,元组和字典这几个基本类型的常用操作吧。 字符串 字符串的本质是就是一些字符组成的不可变序列,Python把单个字符视作长度为1的字符串进行统一处理。使用字符串字面量来定义一个字符串对象 1s = 'abcd' 一些关于字符串的常用操作: 使用 in 判断一个字符串是否包含某个字符 使用 + 可以连接两个字符串 使用 * 可以将字符串重复几次 123456"ab" in "abcd" # true"ab" in "bcd" # false"12" + "34" # '1234'"12" * 3 # '121212'3 * "12" # '121212' 索引 可以使用索引获取指定位置的字符: 正向索引从第一个字符开始,依次为s[0],s[1]... 反向索引从最后一个字符开始,依次为s[-1],s[-2]... ...
Python 学习笔记——9.变量
变量作为Python中最基础的概念,但是我却很难捋清楚它的概念,因此放在了笔记的后面。 Python的变量使用非常灵活方便,但是这也导致了Python变量的底层原理不易理解,这一点与C/C++的变量完全不同。 在这篇笔记中,重点区分几个概念: 字面量:字面值是内置数据类型常量值的表示法 对象:对象具有类型,类型实例化得到对象 变量:可以指向一个任何类型对象的指针 关于字面量和字面量集的表示语法在前面已经介绍过,这里不再重复。 对象 在 Python 中,一切皆为对象,函数也是对象。 每一个对象都具有类型,对象是类型的实例,这些是面向对象的通用概念,在Python中也一样成立。 我们不需要像 C++一样手动管理内存中对象的创建与销毁,而是由 Python 虚拟机的负责(本质还是通过 C 的 malloc 之类的函数以及系统调用),内存回收机制 GC 负责管理和自动销毁没有被变量直接指向或间接使用的对象。GC的判定方法可以理解为对每一个对象都维持一个引用计数,如果计数为零则删除,和 C++的智能指针类似。事实上,我们无法在Python中显式地销毁内存中的任何对象。 基本数据类型可...
Python 学习笔记——8.函数与类进阶
现在关注几个函数和类的进阶概念:迭代器,生成器,闭包,装饰器等。 迭代器 Python 内置的列表等可以支持 for 遍历,本质上是因为列表等提供了迭代所需要的接口,我们可以让自定义类也支持迭代遍历。 首先,for 遍历的实质,以下面的例子说明 123456789s = 'abcd'it = iter(s)print(next(it)) # aprint(next(it)) # bprint(next(it)) # cprint(next(it)) # dprint(next(it)) # 迭代终止,抛出StopIteration异常 对于一个自定义容器类 Demo,我们希望它支持迭代器遍历,那么需要实现如下的内容: 容器类(或者说可迭代对象)提供 Demo.__iter__ 方法,返回一个迭代器类 Iter,迭代器需要记录当前状态 迭代器类提供 Iter.__next__ 方法,返回容器中的元素,并且在迭代完成后抛出 StopIteration 异常,这个异常会被 for 语句自动捕获。 例如一个反向迭代器 12345678910111213141516...
Python 学习笔记——7.输入输出
现在关注Python的输入输出,这里并不会对各种输入输出语法进行详细的介绍,只是针对几种可能的需求,够用就行。 print 基本输出 函数原型 1234567def print( *values: object, sep: str | None = " ", end: str | None = "\n", file: SupportsWrite[str] | None = None, flush: Literal[False] = False,) -> None: ... 例子 12345print("hello,world!")# hello,world!a = 1; b = 2; print("a=",a,"b=",b)# a= 1 b= 2 这里如果连续打印多个项,会默认加上空格分隔,可以用关键字参数更改sep。 12print("hi","Alex",sep='-')# hi-A...
Python 学习笔记——6.模块和包
Python 除了在解释器中实时执行,或者单个脚本执行,在复杂程序中也有必要对代码进行组织封装,这就是 Python 的模块文件,与模块相对的,称导入并使用模块的脚本为主文件。(这里主要讨论 Python 源码模块,Python 的部分内置模块并不适用) 模块例子 一个模块的简单例子如下,由一个 demo.py 文件组成,此时 demo 就是模块名。模块的内容包括其中定义的函数以及可执行的语句等。 12345678910111213141516171819# demo.pydef fib(n): a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print()def fib2(n): result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b return result# print("hi, this ...
Python 学习笔记——5.类
主要是关于用户自定义类的知识,比较重要,由于 Python 的语法太自由了,这部分写起来反而很麻烦,需要想方设法加上限制。 特点 Python3 中所有的类都会默认继承一个基类 object,因此会具有一些基础的属性/方法。(在 Python2 中,自定义类是否继承 object 会有一些细微的区别) 在 Python 中,一切都是对象,有函数对象,有类对象,还有类得到的实例对象,因此和 C++不同,下文不会使用对象这个词来代表实例,我们需要区分类对象和它产生的实例对象。 Python 类模型的语法太过于自由了,写起来就像搭积木一样自由,并且类和实例对象都支持支持动态修改,写法充满危险。(注:基本数据类型比如 int 不支持动态修改它的属性,只有自定义类型可以) Python 作为典型的动态类型语言,在使用过程中并不存在对函数参数类型的强制约束,传入的对象只要满足相应的接口要求,就可以完全正常使用。这种处理方式通常被称为鸭子模型:当一个东西走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么它就可以被称为鸭子。这种放弃类型检查的做法使得代码的编写更加简单,但是也遗留了更多的隐患。 ...
Python 学习笔记——4.函数
函数格式 Python 要求使用如下格式来定义函数。 1234def 函数名([参数列表]): ["函数文档字符串"] 函数体 [return语句] 其中只有函数体是必要的(如果是空函数也需要使用pass或...占位),参数列表,文档字符串和return语句都可以省略。 函数说明文档的字符串使用连续三个单引号或双引号包裹,看起来像多行注释。 简单示例 空函数,没有任何效果 12def null(): pass HelloWorld 函数,打印字符串 12345def hello_world(): """ hello,world """ print('Hello, World!') 包含输入输出的减法函数 1234def subtract(x,y): return x-ysubtract(3,2) # 1 函数参数 参数传递机制 函数的参数传递相当于 Python 变量赋值过程:逐个实参被赋值给对应的形参变量。在函数体内部对形参的...