写在前面
转瞬之间,笔者已经有一年没有更新博客了。从硕士研究生毕业进入工作岗位后,也经历了一年半左右的时间。2019-2020是不平凡的两年,国际形势风云突变,时代的尘埃落在每个人的头顶上都是一座大山。在工业界中繁忙的工作之余,笔者也深切感受到基础的重要性。因此,从2021年开始,笔者决定多放送一些基础相关的干货。在计算机视觉领域中,Python语言是必不可少的数据处理,可视化,人工智能相关任务中所使用的工具,笔者打算从Python语言开始,为大家带来总结的干货与应用经验。
在博客写作中,笔者的风格是,偏重拾遗,而不过分重复互联网上现有的资源。个人才疏学浅,欢迎大家进行探讨与补充。
在笔者学习Python基础的过程中,主要使用到以下两类资源:
-
书籍资源。笔者主要参考机械工业出版社的《Python学习手册》第4版,Mark Luts著,李军 刘红伟等译。个人认为知识点覆盖比较细节,可以当成字典进行查阅或工作之余查缺补漏。本博客也主要借鉴书籍中的内容。
-
网络资源。读研时笔者通常会从菜鸟教程上学习Python相关基础,简洁明了,推荐大家借鉴。
由于现有主流使用的是Python3.x,视觉领域中也有部分框架使用的是Python2.x,比如Caffe 1.0。因此,在笔者的博客中,主要重点在Python 3.x的总结与拾遗,会捎带Python 2.x的用法。
废话不多说,下面开始干货,第一讲:Python中的数字。
数字常量
Python中常用的数字常量列表如下:
数字 | 常量 |
---|---|
1234, -24, 0, 99999999999999 | 整数(无穷大小) |
1.23, 1., 3.14e-10, 4E210, 4.0e+210 | 浮点数 |
0177, 0x9ff, 0b10101010 | Python 2.6后的八进制,十六进制和二进制常量 |
0o(O)177, 0x(X)9ff, 0b(B)10101010 | Python3.0后的八进制,十六进制和二进制常量 |
3+4j, 3.0+4.0j, 3J, complex(3, 4) | 复数常量 |
- 整数就是十进制字符串,浮点数带“.”或者在整数与小数后面加上e或者E再跟上数字。
- 在超过32位时,Python 2.6及之后版本会自动给末未加上L或者l,为长整数。Python 3.0及之后版本则不会。
- 二进制,八进制,十六进制使用前缀。在Python 2.6及之后版本中,八进制可以仅以0开头,Python 3.0中不行。
表达式操作符
优先级由高到底列表如下:
操作符 | 描述 |
---|---|
yield x | 生成器函数发送协议 |
lambda args: expression | 生成匿名函数 |
x if y else z | 三元选择表达式 |
x or y | 逻辑或(x为假才会计算y) |
x and y | 逻辑与(x为真才会计算y) |
not x | 逻辑非 |
x in y, x not in y | 成员关系(可迭代对象,集合等) |
x is y, x is not y | 对象实体测试 |
x < y, x <= y, x > y, x >= y, x == y, x != y | 大小比较,集合子集和超集值相等性操作符 |
x | y | 按位或,集合并集 |
x ^ y | 按位异或,集合对称差 |
x & y | 按位与,集合交集 |
x << y, x >> y | 左移或右移y位 |
x + y, x - y | 加法/合并,减法,集合差集 |
x * y, x % y, x / y, x // y | 乘法/重复,余数/格式化,除法真除法,除法floor除法 |
-x, +x | 一元减法,识别 |
~x | 按位求补(取反) |
x ** y | 幂运算 |
x[i] | 索引(序列,映射或其他)点号区属性运算,函数调用 |
x[i:j:k] | 分片 |
x(…) | 调用(函数,方法,类及其他可调用的) |
x.attr | 属性引用 |
(…) | 元组,表达式,生成器表达式 |
{…} | 字典,集合,集合和字典解析 |
- Python 2.6及之后的版本中,值不相等除了!=,可以用<>,Python 3.0及之后的版本中不行。
- Python 2.6及之后的版本中,后引号表达式’X’与repr(X)作用相同,Python 3.0及之后的版本中移除,使用repr与str。
- Python 2.6及之后的版本中,除法/表示截断除法,Python 3.0及之后的版本中表示真正的除法。
- 括号会改变优先级。
- 当两个混合类型相加时,会自动升级到复杂的数据类型,比如整数加浮点数。
- 连续比较,比分开单个比较更快,比如以下第一行速度快于第二行。连续比较允许任意长度。
X < Y < Z
X < Y and Y < Z
变量
- 变量在他第一次赋值时创建。
- 变量在表达式中使用将被替换为它们的值。
- 变量在表达式中使用以前必须被赋值。
- 变量像对象一样不需要在最开始就声明(注意与C,C++等语言的区别)。
除法
- X / Y。在 Python 2.6及之后的版本中如果都是整数,就执行Floor除法,否则执行真除法;在Python3.0中执行真除法。
- X // Y。在所有Python版本中都执行Floor除法。
- //执行Floor除法总是向下取整。5 // -2,结果为-3。
- 要在 Python 2.6及之后的版本中使得/做真除法。
# Python 2.6及之后的版本
# 真除法
X = 5
Y = 2
X / float(Y) # 2.5
# 或者
from __future__ import division
X = 5
Y = 2
X / Y # 2.5
复数
- 复数的运算结果也是复数
二进制,八进制与十六进制
- 十进制与其他三种进制之间的转化,使用oct, hex和bin函数。
oct(64) # 八进制
hex(64) # 十六进制
bin(64) # 二进制
- 其他三种进制转化成十进制,使用int函数。
int('100', 8) # 八进制100转10进制
int('100', 16) # 十六进制100转10进制
int('100', 2) # 二进制100转10进制
常用内置数学工具
- math库。
import math
math.pi, math.e
math.sin(2 * math.pi / 180)
math.sqrt(144)
math.sqrt(2)
math.floor(-2.5)
math.trunc(-2.5)
- 次方运算。
pow(2, 4)
2 ** 4
- 绝对值与求和运算。
abs(-42.0)
sum((1, 2, 3, 4))
- 求最小与最大值运算。
min(3, 1, 4, 2)
max(3, 1, 2, 4)
- 取整运算(也可用来进制转换)。
int(2.5)
- 四舍五入运算。
round(2.5)
round(2.56789, 2)
- 随机值运算。
import random
random.random() # 随机生成[0, 1)范围内的数
random.randint(1, 10) # 在参数范围[1,10]内随机生成整数,注意能取到上界
random.choice([1, 2, 3, 4, 5, 6]) # 在列表中随机取值
小数与分数
- 小数问题由来。
0.1+0.1+0.1-0.3 # 结果是否为0.?
5.551115123125783e-17 # 真实结果
原因主要是因为计算机中对数字的存储格式决定的,详见知乎专栏《为什么0.1+0.2不等于0.3?原来编程语言是这么算的……》1,因此引入了小数模块
from decimal import Decimal
Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3') # 输出Decimal('0.0')
- 小数的全局精度。
decimal.getcontext().prec = 4 # 小数点后最多四位数
- 分数。
from fractions import Fraction
Fraction(4, 6) # Fraction(2, 3)
Fraction(0.25) # Fraction(1, 4)
- 分数和小数,都可以通过字符串创建。
Decimal('0.1')
Fraction('0.25')
集合
- 在Python 2.6及之后的版本中,用set关键字构造集合。
x = set('abcde')
y = set('bdxyz')
在Python 3.0及之后的版本中,也可以直接花括号构造集合,并支持集合解析。
x = {
1, 2, 3, 4}
{
x ** 2 for x in [1, 2, 3, 4]}
- 多种运算符。
x = set('abcde')
y = set('bdxyz')
'e' in x # True
x - y # set(['a', 'c', 'e'])
x | y, z = x.update(y) # set(['a', 'c', 'b', 'e', 'd', 'y', 'x', 'z'])
x & y, z = x.intersection(y) # set(['b', 'd'])
x ^ y # set(['a', 'c', 'e', 'y', 'x', 'z'])
x > y, x < y # False False
z.add('m') # set(['a', 'c', 'b', 'e', 'd', 'y', 'x', 'z', 'm'])
x.remove('a') # set(['b', 'e', 'd', 'c'])
S = set([1, 2, 3])
S.issubset(range(-5, 5)) # True
- 运算符的限制
{
1, 2, 3} | [3, 4] # TypeError: unsupported operand type(s) for |: 'set' and 'list'
{
1, 2, 3}.union([3, 4]) # {1, 2, 3, 4}
- 集合中只能包含不可变的元素,可变的元素不允许,比如列表,字典等。
- 普通的集合不能嵌入到其他集合中,frozenset这种冻结集合可以。
布尔
- bool类型数据,其值为True或者False。
- True和False看作是预定义的设置为整数1和0的变量。
type(True) # <class 'bool'>
isinstance(True, int) # True
True == 1 # True
True is 1 # False
True or False # True
True + 4 # 5
以上,欢迎各位读者朋友提出意见或建议。
欢迎阅读笔者后续博客,各位读者朋友的支持与鼓励是我最大的动力!
written by jiong
咬定青山不放松,脚踏实地加油干!