第2章 运算符、表达式与内置对象
对象
Python 是一种面向对象的编程语言,在 Python 中一切都是对象。除了常见的整数、实数、复数、字符串、列表、元组、字典、集合外,还有 zip、map、enumerate、filter 等对象。函数和类也是对象。以下是 Python 中一些常用的内置对象类型。
2.1 Python 常用内置对象
数字对象
数字类型在 Python 中非常基础,支持整数、浮点数、复数等。示例如下:
- 整数:
1234
- 浮点数:
3.14
- 复数:
3+4j
字符串对象
字符串可以使用单引号、双引号、三引号作为定界符。例如:
- 单引号:
'swfu'
- 双引号:
"I'm a student"
- 三引号:
'''Python'''
- 原始字符串:
r'abc'
字节串对象
字节串用字母 b
引导,可以使用单引号、双引号、三引号作为定界符:
b'hello world'
列表对象
列表中的元素可以是任意类型,用方括号 []
包含,元素之间用逗号分隔:
[1, 2, 3]
['a', 'b', ['c', 2]]
字典对象
字典中的元素以键值对形式出现,用大括号 {}
包含,键和值之间用冒号分隔:
{1: 'food', 2: 'taste', 3: 'import'}
元组对象
元组中的元素用圆括号 ()
包含,元素之间用逗号分隔:
(2, -5, 6)
(3,)
集合对象
集合中的元素用大括号 {}
包含,元素之间用逗号分隔,不允许重复:
{'a', 'b', 'c'}
布尔型和空类型
- 布尔型:
True
,False
- 空类型:
None
表 2-1 常用的 Python 内置对象
对象类型 | 类型名称 | 示例 |
---|---|---|
数字 | int, float, complex | 1234, 3.14, 1.3e5, 3+4j |
字符串 | str | 'swfu', "I'm a student", r'abc' |
字节串 | bytes | b'hello world' |
列表 | list | [1, 2, 3], ['a', 'b', ['c', 2]] |
字典 | dict | {1: 'food', 2: 'taste', 3: 'import'} |
元组 | tuple | (2, -5, 6), (3,) |
集合 | set, frozenset | {'a', 'b', 'c'} |
布尔型 | bool | True, False |
空类型 | NoneType | None |
2.1.1 常量与变量
在 Python 中,常量和变量的概念有所不同。常量指的是不需要改变也不能改变的值,如一个数字 3 或一个元组 (1, 2, 3)
。变量的值是可以变化的,且在 Python 中不需要事先声明变量名及其类型,直接赋值即可创建任意类型的变量。例如:
# 创建整型变量
x = 3
print(type(x)) # <class 'int'>
# 修改变量类型和值
x = 'Hello world.'
print(type(x)) # <class 'str'>
# 再次修改变量类型和值
x = [1, 2, 3]
print(type(x)) # <class 'list'>
Python 采用基于值的内存管理模式。赋值语句执行时,首先计算表达式的值,然后在内存中找到一个位置存放该值,最后创建变量并指向这个内存地址。
2.1.2 数字
Python 内置的数字类型包括整数、实数和复数。Python 支持任意大的数字,具体取决于内存大小。实数运算可能会有误差,因此在进行相等性测试时,应使用两者之差的绝对值是否足够小来判断。例如:
# 实数相减结果稍有偏差
print(0.4 - 0.1) # 0.30000000000000004
# 判断两个实数是否相等
print(abs(0.4 - 0.1 - 0.3) < 1e-6) # True
Python 内置支持复数类型及其运算,并且形式与数学上的复数完全一致。例如:
x = 3 + 4j
y = 5 + 6j
print(x + y) # (8+10j)
print(x * y) # (-9+38j)
print(abs(x)) # 5.0
Python 3.6.x 支持在数字中间位置使用单个下画线作为分隔来提高数字的可读性,例如:
print(1_000_000) # 1000000
print(1_2_3_4) # 1234
2.1.3 字符串与字节串
在 Python 中,没有字符常量和变量的概念,只有字符串类型。字符串可以用单引号、双引号、三引号作为定界符,并且支持嵌套。例如:
x = 'Hello world.'
y = "Python is a great language."
z = '''Tom said, "Let's go."'''
print(z) # Tom said, "Let's go."
Python 3.x 支持 Unicode 编码的 str
类型字符串,同时也支持字节串类型 bytes
。可以对 str
类型的字符串调用 encode()
方法进行编码得到 bytes
字节串,反之亦然。例如:
# 字符串类型
print(type('Hello world')) # <class 'str'>
# 字节串类型
print(type(b'Hello world')) # <class 'bytes'>
# 编码和解码
encoded_str = 'Hello world'.encode('utf-8')
print(encoded_str) # b'Hello world'
decoded_str = encoded_str.decode('utf-8')
print(decoded_str) # Hello world
2.1.4 列表、元组、字典、集合
列表、元组、字典和集合是 Python 中常用的序列类型。以下表格比较了这几种数据结构的区别。
比较项 | 列表(list) | 元组(tuple) | 字典(dict) | 集合(set) |
---|---|---|---|---|
定界符 | 方括号 [] | 圆括号 () | 大括号 {} | 大括号 {} |
是否可变 | 是 | 否 | 是 | 是 |
是否有序 | 是 | 是 | 否 | 否 |
是否支持下标 | 是 | 是 | 是(键作为下标) | 否 |
元素分隔符 | 逗号 | 逗号 | 逗号 | 逗号 |
对元素形式的要求 | 无 | 无 | 键:值 | 无 |
对元素值的要求 | 无 | 无 | 键必须可哈希 | 必须可哈希 |
元素是否可重复 | 是 | 是 | 键不可重复,值可重复 | 否 |
元素查找速度 | 快 | 快 | 非常快 | 非常快 |
新增和删除元素速度 | 尾部操作快,其他位置慢 | 不允许 | 快 | 快 |
以下是创建和使用这些对象的示例:
# 创建列表对象
x_list = [1, 2, 3]
# 创建元组对象
x_tuple = (1, 2, 3)
# 创建字典对象
x_dict = {'a': 97, 'b': 98, 'c': 99}
# 创建集合对象
x_set = {1, 2, 3}
# 访问列表和元组元素
print(x_list[1]) # 2
print(x_tuple[1]) # 2
# 访问字典元素
print(x_dict['a']) # 97
# 检查集合元素
print(3 in x_set) # True
除了这些数据结构,Python 还提供了 map
、zip
、filter
、enumerate
、reversed
等大量迭代器对象。这些迭代器对象大多具有与 Python 序列相似的操作方法,不同之处在于迭代器对象具有惰性求值的特点,仅在需要时才给出新的元素,减少了对内存的占用。
以上是 Python 常用内置对象的概述。理解这些基本对象及其操作是学习 Python 的基础,熟练掌握后可以更高效地编写 Python 程序。