Python基本数据类型 ·上

一、什么是数据类型

编程语言通过一些复杂的计算机物理底层机制,创造不同类型的数据,用来表示现实世界中的不同信息,以便于计算机更好的存储和计算。

每种编程语言都会有一些基本的数据类型用来表示现实世界中的常见信息。

Python 中的常见数据类型如下

数值类型

描述 名称
数学概念中的整数 int(整数)
数学概念中的实数 float(浮点数)
数学概念中的复数 complex(复数)

序列类型

名称 描述
str(字符串() 字符串是字符的序列表示,用来表示文本信息
list(列表) 列表用来表示有序的可变元素集合。例如表示一个有序的数据组。
tuple(元组) 元组用来表示有序的不可变元素集合。

散列类型

名称 描述
set(集合) 数学概念中的集合,无限不重复元素的集合
dict(字典) 字典是无序键值对的集合。用来表示有关联的数据,例如表示一个人的基本信息。

其他类型

名称 描述
bool(布尔型) bool 型数据只有两个元素,True 表示真,False 表示假。用来表示条件判断结果。
None None 表示空。

是否 bool 属于 Number 的一种呢?

# 可以将它转成 int 呢?
print(int(True))
print(int(False))

# 输出结果
1
0

因为 int 能讲 bool 转成整型,True 就是 1,False 就是 0

二、数值类型

1. 整数类型(int)

python 中整数类型用 int 表示,与数学中的整数概念一致

  age = 18

其中 age 是变量名,= 是赋值运算符,18 是值。

上面的代码表示创建一个整数 18 然后赋值给变量 age。

1.变量

在程序运行过程中会有一些中间值,在稍后的执行中会用到,这时可以将这些中间值赋值给变量,然后在后面的代码中通过调用这些变量名来获取这些值。可以简单的理解为给这些值取一个别名,这个别名就代表这个值。

变量的命名规则:

  1. 由大小写字母 A-Z a-z,数字 0-9 和下划线 _ 组成
  2. 不能以数字开头
  3. 不能是关键字
  4. 变量名大小写敏感
  # 正确的案例
lucky_num = 88
lucky_num2 = 888
  # 错误的案例
1lucky_num = 88
  # 上面的age 和 Age是两个不同的变量
Age = 19

python 官方占用了一些变量名作为程序的关键字,总共 35 个,这些关键字不能作为自定义变量名使用。

import keyword
print(keyword.kwlist)

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

2.赋值运算符

在 python 中 = 是赋值运算符,而不是数学意义上的等于号。python 解释器会先计算 = 右边的表达式,然后将结果复制给 = 左边的变量。

res = 1           # 定义变量res赋值为1
res = res + 1     # 先计算res + 1 再赋值给变量res
res               # res的值为2

3. type 函数和 print 函数

python 提供了内建函数 type 用来查看值或者变量的类型。

只需要将变量或者值作为参数传入 type 函数即可。

  type(age)

int

  type(18)

int

print 函数用来在屏幕上输出传入的数据的字符串表现形式,是代码调试最重要的函数。

print(age)
print(type(age))
# 注意交互式输出和print函数输出的区别

运行结果:

18
<class 'int'>

4.整数的常见表示形式

在 python 中整数最常见的是 10 进制整数,也有二进制,八进制和十六进制。

10 进制
  • 0,1,2,3,4,5,6,7,8,9
  • 满 10 进 1 位
  • 正常写的 Number 都是 10 进制
a = 10  # 十进制
print('a的类型为:', type(a), a)

a 的类型为: <class 'int'> 10


2 进制
  • 0,1
  • 满 2 进 1 位
b = 0b1110  # 二进制
print('b的类型为:', type(b),b)

b 的类型为: <class 'int'> 14


8 进制
  • 0,1,2,3,4,5,6,7
  • 满 8 进 1 位
c = 0o57    # 八进制
print('c的类型为:', type(c),c)

c 的类型为: <class 'int'> 47


16 进制
  • 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
  • 满 16 进 1 位
d = 0xa5c   # 十六进制
print('d的类型为:', type(d), d)

d 的类型为: <class 'int'> 2652

int() 转成十进制

int 可以将数字字符串和 Number 类型的值转成整数

# 转成十进制
print(0b101)
print(0o777)
print(0xBBB)
print(int(0b101))
print(int(0o777))
print(int(0xBBB))
print(int("-123"))
print(int(1.1))
print(int(1.9))

# 输出结果
5
511
3003
5
511
3003
-123
1
1
  • 不写 int() 的话,也可以将其他进制的数自动转成十进制
  • int() 能将纯整数(不能是浮点数)的字符串转成 int 类型
  • 传入浮点数不会进行四舍五入,直接取整数部分

bin() 其他进制数转二进制

# 转成二进制
print(bin(10))  # 10 转成 2进制
print(bin(0o7))  # 7 转成 2进制
print(bin(0xA))  # 10 转成 2进制
print(bin(0o27))  # 8*2+7 转成 2进制
print(bin(0x22E))  # 16^2*2+16*2+14 转成 2进制

# 输出结果
0b1010
0b111
0b1010
0b10111
0b1000101110

oct() 其他进制转成八进制

# 转成八进制
print(oct(110))
print(oct(0b100))
print(oct(0xAAA))

# 输出结果
0o156
0o4
0o5252

hex() 其他进制转成十六进制

# 转成十六进制
print(hex(110))
print(hex(0b100))
print(hex(0o777))

# 输出结果
0x6e
0x4
0x1ff

5.整数的取值范围

python 中整数类型的理论取值范围是[-无穷,无穷],实际取值范围受限于运行 python 程序的计算机内存大小。

2. 浮点数类型(float)

python 中浮点数数用 float 表示,与数学中的实数概念一致,也可以理解为有小数。

a = 0.0
print('a的类型为:', type(a))

a 的类型为: <class 'float'>

1.浮点数的表现形式

在 python 中浮点数可以表示为 a.b 的格式,也可以表示为小写或大写 E 的科学计算法。例如:

  • float() 能将纯整数(也能是浮点数)的字符串转成 float 类型
a = 0.0
print('a的类型为:', type(a))

a 的类型为: <class 'float'>

# 小数部分为零可以省略不写
b = 76.
print('b的类型为:', type(b))

b 的类型为: <class 'float'>

# 整数部分为0可以省略不写
c = .78
print('b的类型为',:type(c),c)

c的类型为: <class 'float'> 0.78

d = -3.1415926
print('d的类型为:', type(d))

d 的类型为: <class 'float'>

e = 9.5e-2
print('d的类型为:', type(e))

e的类型为: <class 'float'>

f = 9.5e2
print('f的类型为:', type(f),f)

f的类型为: <class 'float'> 950.0

float('6.2222')

6.2222

思考:

浮点数可以表示所有的整数数值,python 为何要同时提供两种数据类型?

  相同的操作整数要比浮点数快5-20倍

2.数学运算符

与数学中的常用运算符一致

运算符 描述
+ 加法运算符 1+1
- 减法运算符 3-2
* 乘法运算符 9*9
/ 除法运算符 9/3,除法运算后的结果一定为 float 类型
// 整除运算符 10/3,也称为 地板除 向下取整
% 取模运算符 10%3,表示 10 除以 3 取余数
** 幂次运算符 2**3,表示 2 的 3 次幂
() 括号运算符,括号内的表达式先运算 (1+2)* 3

注意一个浮点数和一个整数进行运算后的结果一定为浮点数

  2+1.0

3.0

  9/3 # 除法运算的结果一定为float类型

3.0

  9//2 # 地板除,向下取整

4

9.0//2 # 当有浮点数进行运算时,结果一定是浮点数,不管是什么计算符

4.0

# 求模
print(5 % 2)
print(5.1 % 2)

# 输出结果
1
1.0999999999999996
  • 浮点数的求模结果为一堆小数位,而不是 1.1
  • 因为在计算机内存,有的浮点数无法被精确的表示,在这里,只能使用近似值来表示 1.1
# 幂运算
print(2 ** 3)  # 2 的 3次方
print(1.1 ** 3)  # 1.1 的 3 次方

# 输出结果
8
1.3310000000000004

3.组合赋值运算符

赋值运算符与算术运算符可以组合使用,注意算术运算符要写在前面且中间不能有空格。

运算符 描述 实例
= 等于-简单的赋值 c = a + b print(c) # 30
+= 加等于 c += a 等同于 c = c + a
-= 减等于 c -= a 等同于 c = c - a
*= 乘等于 c *= a 等同于 c = c * a
/= 除等于 c /= a 等同于 c = c/a
%= 取余等于 c%=a 等同于 c = c%a
**= 幂等于 c ** =a 等同于 c = c ** a
//= 取整除等于 c//=a 等同于 c = c//a

体现了程序员的"懒惰",这种懒惰大力提倡,使得代码简洁和高效。

a = 1
a += 2  #  a = a+2
a 

3

4. 浮点数的不精确性

整数和浮点数在计算机中的表示不同,python 提供无限制且准确的整数计算,浮点数却是不精确的,例如:

  0.2+0.1

0.30000000000000004
根据 sys.float_info.dig 的值,计算机只能提供 15 个数字的准确性。浮点数在超过 15 位数字计算中产生的误差与计算机内部采用二进制运算有关。

import sys

print(sys.float_info.dig)

15

思考:

3.1415926535897924*1.23456789 的计算怎么准确

拓展:高精度浮点运算类型
import decimal
a = decimal.Decimal('3.141952653')
b = decimal.Decimal('1.23456789')
print(a * b)

3.87895385729411217

5. 浮点数和整数的相互转化

int,float 是 python 的内置函数,通过它们可以对浮点数类型和整数类型相互转化

a = 1.9
# 转化为整数
# 通过调用int函数,提取浮点数的整数部分
b = int(a)
print(b, type(b))

1 <class 'int'>

c = 2
# 转化为浮点数
# 通过调用float函数,将整数转化为小数部分为0的浮点数
d = float(c)
print(d, type(d))

2.0 <class 'float'>

3.复数

科学计算中的复数。

a = 12.3+4j
print('a的类型为:', type(a))
# 运行结果:a的类型为: <class 'complex'>
print(a.real)
print(a.imag)

a 的类型为: <class 'complex'>
12.3
4.0