Python学习笔记——6.模块
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 is module demo")s = 1
在解释器或者其它脚本中,使用如 ...
Python学习笔记——5.类
主要是关于用户自定义类的知识,比较重要。
特点
Python3 中所有的类都会默认继承一个基类
object,因此会具有一些基础的属性/方法。(在 Python2 中,自定义类是否继承
object 会有一些细微的区别)
在 Python
中,一切都是对象,有函数对象,有类对象,还有类得到的实例对象,因此和
C++不同,下文不会使用对象这个词来代表实例,我们需要区分类对象和它产生的实例对象。
Python
类模型的语法太过于自由了,写起来就像搭积木一样自由,并且类和实例对象都支持支持动态修改,写法充满危险。(注:基本数据类型比如
int 不支持动态修改它的属性,只有自定义类型可以)
Python
作为典型的动态类型语言,在使用过程中并不存在对函数参数类型的强制约束,传入的对象只要满足相应的接口要求,就可以完全正常使用。这种处理方式通常被称为鸭子模型:当一个东西走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么它就可以被称为鸭子。这种放弃类型检查的做法使得代码的编写更加简单,但是也遗留了更多的隐患。
Python vs C++: 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
变量赋值过程:逐个实参被赋值给对应的形参变量。在函数体内部对形参的修改是 ...
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
的内容太多太杂,这里只会介绍最容易理解的,最本质的面向对象的接口,然后 ...