Python学习笔记——3.流程控制与异常
一些关于流程控制的语法,没什么好说的,各种语言都大同小异,直接给例子即可。
条件语句
if 条件
直接给例子,只需要注意一下用elif而非else if
1234567891011121314if a==1: ...if x<0: ...else: ...if x<0: ...elif x==0: ...else: ...
最简单的单行 if 也是可以的
1if True: print("hello")
还可以使用如下的单行 if 表达式,类似于 C
语言的三目运算符,它算作表达式,因此也可以用在 lambda 表达式中
123result = 1 if True else -1 # 1result = (lambda : 1 if 3>4 else -1)() # -1
注意:在 if 中的条件可以包括与或非等更复杂的逻辑判断,但是只能使用
and or not 来代表,不支持
&& || !;(C++对这两套都支持,但是主要使用后者)
match 匹配
Python 早期不支持 switch ...
Python学习笔记——2.字面量与运算符
字面量
字面值是内置数据类型常量值的表示法,也就是硬编码在 Python
脚本中的数据,包括数字和字符串等的表示形式。
数值字面量
主要包括如下的数值字面量
整数,例如100
浮点数,例如3.12,10.,.001和3.14e-10
复数,例如1+2j(注意不是 i 而是 j,并且 j
前面不能有空格)
注意:
对于整数,默认十进制,可以使用 0b 开头表示二进制,使用
0x 开头表示十六进制等。
对于长整数,可以加下划线增加可读性,没有实际效果。例如
123_456_789。
根据参考文档,严格来说数值字面量不含正负号-和+,并且有纯虚数而没有复数,复数是实数和纯虚数的组合。
布尔字面量
布尔字面量包括两个:True 和 False。
在某些情况下,相当于数字中的 1 和 0: 121 == True # True0 == False # True
字符串字面量
Python 不区分字符和字符串,字符视作长度为 1 的字符串。
字符串需要用单引号或者双引号包裹,\
被用作转义特殊字符,例如 \" 表示双引号。 12print('hello,\"li,hua ...
Python学习笔记——1.基础
概述
Python 是一个非常友好的高级语言,Python
的特点比如:面向对象,动态类型,交互式执行,万金油,胶水语言。 Python
类似于 Java,不允许直接操作内存,底层实现了垃圾收集机制(GC)。
Python
在轻量级的使用上无疑是非常香的,并且现在在数据科学领域也达到了称霸的地位。
虽然我同时也在主要使用 C++,但是 C++ 语法的复杂程度让我从来没有写完整
C++ 学习笔记的打算,Python 倒是可以尝试一下。
正所谓:人生苦短,我用 Python。
接下来的笔记并不是具有顺序性的,内容会相互交叉,因为如果非要对笔记进行先后排序,就必须将函数、类等重要内容拆成基础和进阶部分来写,但作为整理性质的笔记,并没有这个必要。
关于 Python 绘图的部分,我计划专门写一个系列关于 Python
数据可视化的笔记。
主要参考官方教程和官方文档,前者适合入门,而后者在概念理解上更加详细。
Python 常识
解释器
和 c/c++这种编译型语言不同,Python 作为解释型语言,需要 Python
解释器才能运行,Python 解释器有很多不同的实现:
CPython 是 ...
Python绘图笔记——4.其他
补充几个不常用的图像绘制的示例代码。
直方图
函数原型为 12def ax.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs): ...
其中的主要选项包括:
x,要统计的数据,array or sequence of arrays
bins,决定数据 x 如何被分割
如果 bins 是整数 n,则数据 x 分割为 n 个等宽部分
如果 bins 是一个序列,则定义 bin 的边缘,包括第一个 bin
的左边缘和最后一个 bin 的右边缘,这样 bin 可能不等距
如果 bins 是字符串,则支持分割策略,'aut ...
Python绘图笔记——3.动画
这里记录一下 Python 的 matplotlib
的动画效果,注意我们需要分别考虑如下三种运行环境,它们对于动画的支持是不一样的:
浏览器启动 Jupyter Notebook 或 Jupyter Lab
直接运行 Python 脚本
VSCode 启动 Jupyter(目前仍然不支持动画)
例如浏览器启动 Jupyter 可能需要相关的插件(例如 ipympl
插件),并且需要魔法命令
1%matplotlib notebook
在启动内核后,至少需要执行这个魔法命令一次,否则无法播放动画,两个同时播放的动画甚至还会相互影响。
在直接运行 Python 脚本时,Jupyter
的魔法指令是语法错误,对于动画而言,直接运行 Python 脚本反而比 Jupyter
更方便。
matplotlib 绘制动画主要包括两种方法:FuncAnimation 和
ArtistAnimation,下面的代码都需要导入如下的库
123import numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as ...
Python绘图笔记——2.曲线图
现在关注最常见的绘制曲线图需求。
绘制曲线
使用 Axes 的 plot 方法绘制曲线图,假设
x,y,x2,y2
都是一维的数组,那么可以使用下面几种方式绘制曲线
12345ax.plot(y) # 一条散点连成的曲线,横坐标取从0开始的整数,纵坐标取自yax.plot(x,y) # 一条散点连成的曲线,横坐标取自x,纵坐标取自yax.plot(x,y,x2,y2) # 两条曲线,第一条横坐标取自x,纵坐标取自y,第二条横坐标取自x2,纵坐标取自y2
还可以附加一些细节参数,例如颜色,曲线样式,图例等,下面依次介绍。
颜色
几个常用的颜色及其缩写如下:
蓝色 blue-b
绿色 green-g
红色 red-r
白色 white-w
黑色 black-k(因为b已经被blue占用)
金黄色 yellow-y
蓝绿色(青色)cyan-c
品红色 magenta-m
可以使用关键字参数设置固定的颜色 color='red'
或者使用十六进制的颜色编码如
color='#32CD32'。支持如下的简写:
将常用颜色使用简写,例如 color='r'
将关键字 color 简写为 c, ...
Python绘图笔记——1.基础
matplotlib 介绍
matplotlib 大致是类似 matlab 风格的 2D 绘图库(3D
的功能比较弱,还是基于 2D 引擎勉强实现的),同时提供了两套 api:
一个是面向过程的,主要调用 matplotlib.pyplot
的函数;
一个是面向对象的,主要调用 matplotlib
的两个子类:matplotlib.figure.Figure 和
matplotlib.axes.Axes ,使用它们的方法进行细节操作。
面向过程的 api
适合简易使用的场景,但是不容易弄清原理;为了更复杂的绘图要求,这里主要采用面向对象的
api。关于绘图的呈现方式,在 Jupyter 中很可能会自动绘图而不需要
plt.show(),这与魔法指令 %matplotlib inline
有关。
在这一系列笔记中,需要使用如下模块: 123import numpy as npimport matplotlib as mplimport matplotlib.pyplot as plt
由于 matplotlib
的内容太多太杂,这里只会介绍最容易理解的,最本质的面向对象的接口,然后 ...
编码学习笔记
编码是最繁琐的问题之一了,尤其对于 C++这种 string
还只是char *简易封装的底层语言来说,对于非 ASCII
的字符串需要考虑各个环节的编码,只要错了一项最终就是乱码。对于一些更高级的语言比如
Python3,全部使用 utf8 就少了很多乱七八糟的乱码问题。
ASCII 码
首先从 ASCII 码开始,在早期的计算机中,使用一个字节(8 比特,实际上是
7
比特)来表示所有英文字母和常见的标点符号,以及回车,制表符等控制字符,如下表。
这里 4 比特用一个十六进制数来表示,实际上没有用完\(2^8=256\)个,只用了一半 128
个,具体而言就是只用了 7 比特,最高位始终为 0。
一些控制字符比如著名的换行符:CR/LF,制表符 HT(tab),剩下的 128
个字符,其实对于绝大多数欧美的拼音文字都是足够的,因此基于 ASCII
码也产生了很多表示西欧文字的编码方案。但是对于成千上万的汉字编码,一个字节显然是不可能完成的任务,典型的中日韩三国的编码问题,通常这被称为
CJK 编码,针对这些语言必须设计多字节编码方案。
多字节编码
仅仅使用 ASCII
字符显然是 ...
Burgers方程转换公式
作为典型的守恒律方程,Burgers
方程可以完成时间导和空间导的彻底转换,这里记录一下,后面肯定会用到。
\[
u_t + u u_x = 0
\]
一阶导信息
1u_t -> u_x
一阶导还是显然的:
\[
u_x = -\frac{u_t}{u}
\]
二阶导信息
1u_tt -> u_xt -> u_xx
做一下准备,对原始方程进行如下的求导
\[
\begin{aligned}
u_t + u u_x &= 0\\
u_{tt} + u_t u_x + u u_{xt} &=0, (\partial_t)\\
u_{tx} + u_x u_x + u u_{xx} &=0, (\partial_x)
\end{aligned}
\]
得到
\[
u_{xt} = -\frac{1}{u}\left(u_{tt} + u_t u_x\right)
\]
还有
\[
u_{xx} = -\frac{1}{u}\left(u_{tx} + u_x u_x\right)
\]
三阶导信息
1u_ttt -> u_xtt -> u ...
项目的常用配置文件
这里考虑的是使用 git 进行版本控制的跨平台项目,主要考虑普通文本以及
C++项目中需要的配置文件。 下文包括这些配置文件的基本介绍以及模板。
.editorconfig
通过 .editconfig,我们可以实现跨平台,跨 IDE
的文本统一控制,常见的设置包括
tab,文本编码,换行符等。很多代码编辑器和IDE都支持
.editconfig:VS 直接支持,VScode
需要使用官方插件来提供支持。
某些文件对格式是非常敏感的,我们需要对此进行专门设置:
Makefile 必须使用 tab,不能使用空格替代!
bat 脚本,pwsh 脚本以及 VS
配置文件这些与windows平台深度绑定的,建议使用 CRLF
换行符,否则可能导致异常
markdown 文件允许结尾的空格
对数据文件不允许更改换行符
对 build 文件夹,out 文件夹和 data 文件夹的内容撤销所有设置
为了达到上述要求,对应的.editconfig 文件示例如下
123456789101112131415161718192021222324252627282930313233343536373839 ...