转瞬之间,笔者已经有一年没有更新博客了。从硕士研究生毕业进入工作岗位后,也经历了一年半左右的时间。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) | 复数常量 |
优先级由高到底列表如下:
操作符 | 描述 |
---|---|
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 | 属性引用 |
(…) | 元组,表达式,生成器表达式 |
{…} | 字典,集合,集合和字典解析 |
X < Y < Z
X < Y and Y < Z
# 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(64) # 八进制
hex(64) # 十六进制
bin(64) # 二进制
int('100', 8) # 八进制100转10进制
int('100', 16) # 十六进制100转10进制
int('100', 2) # 二进制100转10进制
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')
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}
type(True) #
isinstance(True, int) # True
True == 1 # True
True is 1 # False
True or False # True
True + 4 # 5
以上,欢迎各位读者朋友提出意见或建议。
欢迎阅读笔者后续博客,各位读者朋友的支持与鼓励是我最大的动力!
written by jiong
咬定青山不放松,脚踏实地加油干!
https://zhuanlan.zhihu.com/p/87672024. ↩︎