Python基础与拾遗1:Python中的数字

写在前面

转瞬之间,笔者已经有一年没有更新博客了。从硕士研究生毕业进入工作岗位后,也经历了一年半左右的时间。2019-2020是不平凡的两年,国际形势风云突变,时代的尘埃落在每个人的头顶上都是一座大山。在工业界中繁忙的工作之余,笔者也深切感受到基础的重要性。因此,从2021年开始,笔者决定多放送一些基础相关的干货。在计算机视觉领域中,Python语言是必不可少的数据处理,可视化,人工智能相关任务中所使用的工具,笔者打算从Python语言开始,为大家带来总结的干货与应用经验。

在博客写作中,笔者的风格是,偏重拾遗,而不过分重复互联网上现有的资源。个人才疏学浅,欢迎大家进行探讨与补充。

在笔者学习Python基础的过程中,主要使用到以下两类资源:

  1. 书籍资源。笔者主要参考机械工业出版社的《Python学习手册》第4版,Mark Luts著,李军 刘红伟等译。个人认为知识点覆盖比较细节,可以当成字典进行查阅或工作之余查缺补漏。本博客也主要借鉴书籍中的内容。
    在这里插入图片描述

  2. 网络资源。读研时笔者通常会从菜鸟教程上学习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) 复数常量
  1. 整数就是十进制字符串,浮点数带“.”或者在整数与小数后面加上e或者E再跟上数字。
  2. 在超过32位时,Python 2.6及之后版本会自动给末未加上L或者l,为长整数。Python 3.0及之后版本则不会。
  3. 二进制,八进制,十六进制使用前缀。在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 属性引用
(…) 元组,表达式,生成器表达式
{…} 字典,集合,集合和字典解析
  1. Python 2.6及之后的版本中,值不相等除了!=,可以用<>,Python 3.0及之后的版本中不行。
  2. Python 2.6及之后的版本中,后引号表达式’X’与repr(X)作用相同,Python 3.0及之后的版本中移除,使用repr与str。
  3. Python 2.6及之后的版本中,除法/表示截断除法,Python 3.0及之后的版本中表示真正的除法
  4. 括号会改变优先级。
  5. 当两个混合类型相加时,会自动升级到复杂的数据类型,比如整数加浮点数。
  6. 连续比较,比分开单个比较更快,比如以下第一行速度快于第二行。连续比较允许任意长度。
X < Y < Z
X < Y and Y < Z

变量

  1. 变量在他第一次赋值时创建
  2. 变量在表达式中使用将被替换为它们的值。
  3. 变量在表达式中使用以前必须被赋值。
  4. 变量像对象一样不需要在最开始就声明(注意与C,C++等语言的区别)。

除法

  1. X / Y。在 Python 2.6及之后的版本中如果都是整数,就执行Floor除法,否则执行真除法;在Python3.0中执行真除法。
  2. X // Y。在所有Python版本中都执行Floor除法。
  3. //执行Floor除法总是向下取整。5 // -2,结果为-3。
  4. 要在 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

复数

  1. 复数的运算结果也是复数

二进制,八进制与十六进制

  1. 十进制与其他三种进制之间的转化,使用oct, hex和bin函数。
oct(64) # 八进制
hex(64) # 十六进制
bin(64) # 二进制
  1. 其他三种进制转化成十进制,使用int函数。
int('100', 8) # 八进制100转10进制
int('100', 16) # 十六进制100转10进制
int('100', 2) # 二进制100转10进制

常用内置数学工具

  1. 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)
  1. 次方运算。
pow(2, 4)
2 ** 4
  1. 绝对值与求和运算。
abs(-42.0)
sum((1, 2, 3, 4))
  1. 求最小与最大值运算。
min(3, 1, 4, 2)
max(3, 1, 2, 4)
  1. 取整运算(也可用来进制转换)。
int(2.5)
  1. 四舍五入运算。
round(2.5)
round(2.56789, 2)
  1. 随机值运算。
import random
random.random() # 随机生成[0, 1)范围内的数
random.randint(1, 10) # 在参数范围[1,10]内随机生成整数,注意能取到上界
random.choice([1, 2, 3, 4, 5, 6]) # 在列表中随机取值

小数与分数

  1. 小数问题由来
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')
  1. 小数的全局精度。
decimal.getcontext().prec = 4 # 小数点后最多四位数
  1. 分数。
from fractions import Fraction
Fraction(4, 6) # Fraction(2, 3)
Fraction(0.25) # Fraction(1, 4)
  1. 分数和小数,都可以通过字符串创建。
Decimal('0.1')
Fraction('0.25')

集合

  1. 在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]}
  1. 多种运算符。
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. 运算符的限制
{
    
    1, 2, 3} | [3, 4] # TypeError: unsupported operand type(s) for |: 'set' and 'list'
{
    
    1, 2, 3}.union([3, 4]) # {1, 2, 3, 4}
  1. 集合中只能包含不可变的元素,可变的元素不允许,比如列表,字典等。
  2. 普通的集合不能嵌入到其他集合中,frozenset这种冻结集合可以。

布尔

  1. bool类型数据,其值为True或者False。
  2. 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
咬定青山不放松,脚踏实地加油干!


  1. https://zhuanlan.zhihu.com/p/87672024. ↩︎

猜你喜欢

转载自blog.csdn.net/jiongnima/article/details/113416979