概述
Python中常用的数据类型(data types)或数据结构(data structures)共有五种:
1. 数值(number)
2. 字符串(string)
3. 列表(list)
4. 元组(tuple)
5. 字典(dictionary)
今天我们主要讨论数值(number)这一数据类型,以及与它相关的常用运算符、函数。最后,我们会一起做一些运算示例来巩固对数值的理解。
一、数值的概念
数值类型的数据包括整数型(integer)和浮点型(float)两种。整数型数值,顾名思义,就是整数数值;而浮点型数据为浮点数值,即带有小数点的数值。
关于整数型数值和浮点型数值的区别,请看下面的代码示例:
num1=8
print(num1)
# return: 8
print(type(num1))
# return: <class 'int'>
num2=8.0
print(num2)
# return: 8.0
print(type(num2))
# return: <class 'float'>
注意:
1. 注释符号#之后一定要加上一个空格,且#注释语句要单独放在一行,否则会出现PEP 8: E262 inline comment should start with '# '的警告。
2. 用=赋值,=前后都必须有空格,否则会出现PEP 8: E225 missing whitespace around operator的警告。
在上面的代码中,我们首先将整数型数值 8 赋值给变量 num1,然后打印 num1 变量,返回结果为8。再打印type(num1),type()函数返回变量的数据类型,所以返回结果为<class 'int'>,说明 num1 变量为整数型数据。
我们再将浮点型数值 8.0 赋值给变量 num2, 然后打印 num2 变量,返回结果为8.0。再打印type(num2),返回结果为<class 'float'>,说明num2变量为浮点型数据。
二、常用数值运算符
通常,我们需要对数值进行运算。下表是Python中常用的数值运算符。
运算类型 | 运算符 | 英文 |
---|---|---|
加 | + | addition |
减 | - | subtraction |
乘 | * | multiplication |
除 | / | division |
取幂(如计算5的2次方) | ** | exponentiation |
整除(如3/2 = 1.5 , 3//2 = 1) | // | floor division |
取余(如10 % 3 = 1 ) | % | remainder, modulo |
转换成整数 | int() | integer conversion |
转换成浮点数 | float() | float conversion |
关于常用的数值运算符,请看下面的代码示例:
num1 = 5
num2 = 2
print(num1 + num2)
# 7
print(num1 - num2)
# 3
print(num1 * num2)
# 10
print(num1 / num2)
# 2.5
# Python 2.7中,两个整数型数值相除,其结果也是整数型数值,所以结果是2, 不是2.5
# Python 3.x中,两个整数型数值相除,其结果可以是浮点型数值,所以结果是2.5
print(num1 ** num2)
# 25
print(num1 // num2)
# 2, 也就是商的整数部分
print(num1 % num2)
# 1, 5除以2余数是1
关于浮点型数值和整数型数值的转换,请看下面的代码示例:
num1 = 5
# 整数型
num2 = 2.0
# 浮点型
print(num1)
# 5
print(num2)
# 2.0
print(float(num1))
# 5.0
print(int(num2))
# 2
print(float(8))
# 8.0
print(int(2.2))
# 2
print(int(2.6))
# 2
在Python 3.x 版本中,如果参与运算的数值均为整数型数值,运算结果也可以是浮点型数值。请看下面的代码示例:
num1 = 5
num2 = 2
num3 = 2.0
print(num1 / num2)
# 2.5
print(num1 / num3)
# 2.5
print(38/189)
# 0.20105820105820105
三、常用数值函数
1. abs()
用于取数值的绝对值。请看下面的代码示例:
print(abs(2.2))
# 2.2
print(abs(-2.6)
# 2.6
print(abs(0))
# 0
2. round()
用于对数值进行四舍五入。在Python 3.x版本中,round()函数返回的是整数(不同于2.x版本返回浮点数)。请看下面的代码示例:
print(round(5.4))
# 5
print(round(5.5))
# 6
print(round(5.6))
# 6
print(type(round(5.6)))
# <class 'int'>
3. math模块函数
Python语言的 math 模块中有很多涉及数学计算的函数。使用 math 模块,首先要引入该模块,即 import math。引入 math 模块之后,我们要通过 math.function()的方式来调用该模块中的函数,其中function为函数名。
下面介绍 math 模块中几个常用的函数。
(1)math.sqrt()
用于计算平方根,返回的数据为浮点型数据。请看下面的代码示例:
import math
print(math.sqrt(9))
# 3.0
print(math.sqrt(26))
# 5.09901951359
(2)math.log()
我们可以用math.log(x,y)函数计算对数,其中x为真数,y为底数。比如,下面的例子分别计算以2和10为底数,以1008为真数的对数,请看下面的代码示例:
import math
print(math.log(1008,2))
# 9.9772799235
print(math.log(1008,10))
# 3.00346053211
利用 math.log(x,y)函数计算对数时,如果省略了y底数,则计算的是以自然数e为底数的自然对数。比如下面的例子计算以自然数e为底数,以1008为真数的对数。请看下面的代码示例:
import math
print(math.log(1008))
# 6.91572344863
另一个计算自然对数的方法是,在math模块中引入log和自然数e(from math import e)。请看下面的代码示例,结果与上面相同:
from math import e, log
print(log(1008, e))
# 6.91572344863
4. random模块函数
Python语言的random模块内置一些函数可以生成随机数。与math模块类似,在使用random的函数之前,需要先引入random模块(import random)。
(1)random.random()函数生成0至1之间的一个随机浮点数。
(2)random.randint(x,y)函数随机生成x至y之间的一个整数。x和y为整数,随机生成的结果大于等于x,小于等于y。
(3)random.randrange(x,y,z)函数随机生成x至y之间的一个整数,步长为z。x、y、z均为整数,随机生成的结果大于等于x,小于y。
请看下面的代码示例:
import random
print(random.random())
# 0至1之间的一个随机浮点数
print(random.randint(0,10))
# 0至10之间的一个随机整数
print(random.randrange(1,10))
# 1至9之间的一个随机整数
print(random.randrange(1,10,2))
# 1, 3, 5, 7, 9中的一个随机数
(4)random.choice(list)函数的参数是一个序列(字符串、列表、元组等)。其结果为该序列中随机获取的一个元素。
(5)random.shuffle(list)函数的参数是一个列表,用于将列表中的元素顺序打乱。
请看下面的代码示例:
import random
list1 = ['Mary', 'Michael', 'Julia', 'Leo']
print(random.choice(list1))
# 结果为list1四个元素中随机选择的一个元素
random.shuffle(list1)
print(list1)
# 结果可能为'Mary', 'Michael', 'Julia', 'Leo'的任意排列组合,每次运行结果不同
# 可以直接print(random.shuffle(list1))吗? 答:不可以,直接这么输出,会显示None
注意:
1. 一定要先写random.shuffle(list1),再print(list1),不能直接print(random.shuffle(list1)),否则会输出None。
(6)random.sample(sequence, n)函数将从序列sequence中随机获取n个元素。请看下面的代码示例:
import random
list1 = ['A', 'B', 'C', 'D']
print(random.sample(list1, 2))
# 结果可能是A, B, C, D中任意的两个元素,每次运行结果不同
print(list1)
# ['A', 'B', 'C', 'D'], 不改变原序列
四、数值计算示例
1. 熵的计算
熵(Entropy)表示某一随机变量不确定性的均值。熵值越大,随机变量的不确定性越强,而正确估计其值的概率就越小。熵的计算公式如下:
其中,p(x)为随机变量x出现的概率。
下面我们以波里尼西亚语为例,尝试进行一种语言字符熵的计算。
已知波里尼西亚语由6个字符组成,我们可以将它看成是6个随机变量的序列,这6个随机变量出现的概率如下表所示。
字符 | p | t | k | a | i | u |
---|---|---|---|---|---|---|
概率 | 1/8 | 1/4 | 1/8 | 1/4 | 1/8 | 1/8 |
根据上面的熵的计算公式,波里尼西亚语的字符熵为:
上面的式子可以简写成:
下面我们用Python来计算式子:
import math
entropy = -(4*(1.0/8)*math.log((1/8), 2)+2*(1.0/4)*math.log(float(1.0/4), 2))
print(entropy)
# 结果为:2.5
所以我们得出,波里尼西亚语的字符熵为2.5。
2. 计算二元组的共信息值
二元组(Bigram)指的是字符串中两个相邻的单词组合。比如在字符串“I love Python programming”中,有“I love” “love Python” “Python programming”等三个二元组。我们可以通过计算二元组的共信息值来判断该二元组内两个单词的共现是否具有显著意义。
下面是二元组共信息值的计算公式。假设有二元组(x,y),则:
其中:f(x)为x词在语料库中出现的频次;
f(y)为y词在语料库中出现的频次;
f(x,y)为(x,y)在语料库中出现的频次;
N为语料库的库容。
下面我们以英文单词搭配“there are”为例,试着用Python进行二元组共信息值的计算。我们假设二元组(there, are)在某库容为100,000词的语料库中共现的频次为335,there在该语料库中的频次为2844,are在该语料库中的频次为4393。请看下面的代码示例:
import math
N = 1000000.0
f_x = 2844.0
f_y = 4393.0
f_xy = 335.0
MI = math.log((f_xy*N) / (f_x*f_y), 2)
print(MI)
# 结果为: 4.74488932095713
所以我们得出,二元组(there, are)的共信息值为4.74488932095713。
注意:
1. 频次和库容的数字后面都要加上.0,把它们转换成浮点数,否则math.log()会报错。
3. 计算二元组的T值
除了共信息值之外,我们还可以通过计算二元组的T值来判断该二元组内两个单词的共现是否具有显著意义。二元组T值的计算公式如下:
其中:f(x)为x词在语料库中出现的频次;
f(y)为y词在语料库中出现的频次;
f(x,y)为(x,y)在语料库中出现的频次;
N为语料库的库容。
下面还是以英文单词搭配“there are”为例,试着计算二元组(there, are)的T值。该二元组在库容为1000,000词的语料库中的共现频次为335,there在该语料库中的频次为2844,are在该语料库中的频次为4393。请看下面的代码示例:
import math
N = 1000000.0
f_x = 2844.0
f_y = 4393.0
f_xy = 335.0
T = (f_xy - ((f_x * f_y) / N)) / math.sqrt(f_xy)
print(T)
# 结果为: 17.620401904694393
# 注意:将频次和库容后面均加上了.0,以将之转换成浮点数。
所以我们得出,二元组(there, are)的T值为17.620401904694393。
参考资料:雷蕾. 基于Python的语料库数据处理[M]. 北京:科学出版社,2020.13-25.
最后
以上就是酷酷啤酒为你收集整理的【Python第5篇】Python中的数据类型——数值及常用运算符、函数、计算示例的全部内容,希望文章能够帮你解决【Python第5篇】Python中的数据类型——数值及常用运算符、函数、计算示例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复