内置类型有数字、序列、映射、类、实例和异常,所有对象都可以比较是否相等、检测逻辑值,以及转换为字符串。
一,逻辑值检测
对象在默认情况下均被视为真值。
除非当该对象被调用时其所属类定义了 __bool__()
方法且返回 False
。
或是定义了 __len__()
方法且返回零。
二,布尔运算
与c++不同,但逻辑计算上可以等价。
| if x is false, then y, else x | (1) |
| if x is false, then x, else y | (2) |
| if x is false, then | (3) |
三,比较
| 等于 |
| 对象标识 |
不同标识的类的实例比较结果通常为不相等,除非类定义了 __eq__() 方法
运算符重载:
equal | == | |
less than | < | |
less equal | <= | |
greater than | > | |
greater equal | >= | |
not equal | __ne__() | != |
四,数字类型
整数, 浮点数 和 复数 complex
布尔值属于整数的子类型,整数具有无限的精度。
复数包含实部和虚部,分别以一个浮点数表示,要从一个复数 z 中提取这两个部分,可使用 z.real
和 z.imag
。
在数字字面值末尾加上 'j'
或 'J'
会生成虚数(实部为零的复数),你可以将其与整数或浮点数相加来得到具有实部和虚部的复数。
整数类型的附加方法
bit_length
()
返回以二进制表示一个整数所需要的位数,不包括符号位和前面的零
浮点类型的附加方法
as_integer_ratio
()
返回一对整数,其比率正好等于原浮点数并且分母为正数。
is_integer
()
判断是否为整数
五,迭代器类型
容器对象要提供迭代支持,必须定义一个方法:
container.
__iter__
() 返回一个迭代器对象。
迭代器对象自身需要支持以下两个方法,它们共同组成了 迭代器协议:
iterator.
__iter__
() 返回迭代器对象本身。
这是同时允许容器和迭代器配合 for 和 in 语句使用所必须的。
iterator.
__next__
() 从容器中返回下一项。
如果已经没有项可返回,则会引发 StopIteration 异常。
六,序列类型
有三种基本序列类型:list, tuple 和 range 对象。
通用操作:
| s 的第 i 项,起始为 0 | (3) |
| s 从 i 到 j 的切片 | (3)(4) |
| s 从 i 到 j 步长为 k 的切片 | (3)(5) |
tuple 和 list 的比较是通过比较对应元素的字典顺序。
请注意序列 lists 中的项并不会被拷贝;它们会被多次引用。 这一点经常会令 Python 编程新手感到困扰;例如:
>>> lists = [[]] * 3 >>> lists [[], [], []] >>> lists[0].append(3) >>> lists [[3], [3], [3]]
原因在于用 *
对列表执行重复操作并不会创建副本,而只是创建现有对象的引用。你可以用以下方式创建以不同列表为元素的列表:
>>> lists = [[] for i in range(3)] >>> lists[0].append(3) >>> lists[1].append(5) >>> lists[2].append(7) >>> lists [[3], [5], [7]]
不可变序列类型普遍实现而可变序列类型未实现的唯一操作就是对 hash() 内置函数的支持。
列表
可以用多种方式构建列表:
-
使用一对方括号来表示空列表:
[]
-
使用方括号,其中的项以逗号分隔:
[a]
,[a, b, c]
-
使用列表推导式:
[x for x in iterable]
-
使用类型的构造器:
list()
或list(iterable)
sort
(*, key=None, reverse=False) 此方法会对列表进行原地排序,只使用 <
来进行各项间比较。
key 指定带有一个参数的函数,用于从每个列表元素中提取 “ 比较键 ” 。
元组
元组是不可变序列
可以用多种方式构建元组:
-
使用一对圆括号来表示空元组:
()
-
使用一个后缀的逗号来表示单元组:
a,
或(a,)
-
使用以逗号分隔的多个项:
a, b, c
or(a, b, c)
-
使用内置的 tuple():
tuple()
或tuple(iterable)
range 对象
range 类型表示不可变的数字序列,通常用于在 for 循环中循环指定的次数。
class range
(stop)
class range
(start = 0, stop, step = 1)
range 类型相比常规 list 或 tuple 的优势在于一个 range 对象总是占用固定数量的(较小)内存,不论其所表示的范围有多大(因为它只保存了 start
, stop
和 step
值,并会根据需要计算具体单项或子范围的值)。
使用 ==
和 !=
检测 range 对象是否相等是将其作为序列来比较。
七,文本序列类型
在 Python 中处理文本数据是使用 str 对象,也称为 字符串。 字符串是由 Unicode 码位构成的不可变 序列。
-
单引号:
'允许包含有 "双" 引号'
-
双引号:
"允许嵌入 '单' 引号"
-
三重引号:
'''三重单引号'''
,"""三重双引号"""
使用三重引号的字符串可以跨越多行 —— 其中所有的空白字符都将包含在该字符串字面值中。
作为单一表达式组成部分,之间只由空格分隔的多个字符串字面值会被隐式地转换为单个字符串字面值。 也就是说,("spam " "eggs") == "spam eggs"
。
str.
format
(*args, **kwargs)
执行字符串格式化操作(printf)。 调用此方法的字符串可以包含字符串字面值或者以花括号 {}
括起来的替换域。 每个替换域可以包含一个位置参数的数字索引,或者一个关键字参数的名称。 返回的字符串副本中每个替换域都会被替换为对应参数的字符串值。
>>> "The sum of 1 + 2 is {0}".format(1+2) 'The sum of 1 + 2 is 3'
str.
split
(sep=None, maxsplit=-1)
返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串。
str.
splitlines
(keepends=False)
返回由原字符串中各行组成的列表,在行边界的位置拆分。结果列表中不包含行边界,除非给出了 keepends 且为真值。
八,二进制序列类型memoryview
由单个字节构成的不可变序列,bytes
bytearraybytes 对象的可变对应物,bytearray
内存视图, memoryview
九,集合类型
与其他多项集一样,集合也支持 in, len, for
。
set 类型是可变的 --- 其内容可以使用 add()
和 remove()
这样的方法来改变。 由于是可变类型,它没有哈希值,且不能被用作字典的键或其他集合的元素。
frozenset 类型是不可变并且为 hashable --- 其内容在被创建后不能再改变;因此它可以被用作字典的键或其他集合的元素。
集合可用多种方式来创建:
-
使用花括号内以逗号分隔元素的方式:
{'jack', 'sjoerd'}
-
使用集合推导式:
{c for c in 'abracadabra' if c not in 'abc'}
-
使用类型构造器:
set()
,set('foobar')
,set(['a', 'b', 'foo'])
& | 求交集 |
| | 求并集 |
- | 求差 |
^ | 对称差 |
remove
(elem)
从集合中移除元素 elem。 如果 elem 不存在于集合中则会引发 KeyError。
discard
(elem)
如果元素 elem 存在于集合中则将其移除。
十,映射类型
dict 字典
字典可用多种方式来创建:
-
使用花括号内以逗号分隔
键: 值
对的方式:{'jack': 4098, 'sjoerd': 4127}
or{4098: 'jack', 4127: 'sjoerd'}
-
使用字典推导式:
{x: x ** 2 for x in range(10)}
-
使用类型构造器:
dict()
,dict([('foo', 100), ('bar', 200)])
,dict(foo=100, bar=200)