1 Python 绪论
1.1 简介
Python 是一种解释型语言,不需要编译和链接,可以节省大量开发时间。它的解释器实现了交互式操作,轻而易举地就能试用各种语言功能,编写临时程序,或在自底向上的程序开发中测试新功能。
Python 解释器易于扩展,使用 C 或 C++(或其它 C 能调用的语言)即可为 Python 扩展新功能和数据类型,不论是让核心程序以最高速度运行,还是把 Python 程序链接到只提供预编译程序的库。只要下点功夫,就能把 Python 解释器和用 C 开发的应用链接在一起,用它来扩展和控制该应用。Python 也可以用作定制软件中的扩展程序语言。
Python 内置了大量标准模块,作为开发程序的基础。
Python 语言的命名源自 BBC 的 “Monty Python 飞行马戏团”,与爬行动物无关(Python 原义为“蟒蛇”)。
1.2 Python 解释器
在 Windows 系统中,可以从 Microsoft Store 搜索安装 Python(或者命令行界面中输入python
,则会跳转到 Python 获取界面)。
1.3 基础
1.3.1 变量
等号(=
)用于给变量赋值。
1.3.2 注释
Python 注释以#
开头,直到该物理行结束。注释可以在行开头,或空白符与代码之后。注释用于阐明代码,Python 不解释注释。
2 数据类型
2.1 绪论
2.1.1 类型概述
2.1.1.1 基本类型
Python 有 6 个标准的数据类型,3 个不可变的是数字、字符串(str
)、元组(tuple
),3 个可变的是列表(list
)、集合(set
)、字典(dict
)。
Python 解释器中主要的内置标准类型有:数字、序列、映射、集合、类、实例和异常。
映射对象会将可哈希值映射到任意对象。映射属于可变对象。目前仅有一种标准映射类型:字典。
2.1.2 数字和字符的转换
ord(c: str) -> int
内置函数。对表示单个 Unicode 字符的字符串,返回代表它 Unicode 码点的整数。例如:
>>> ord('a') 97 >>> ord('A') 65
它是内置函数
chr()
的逆函数。
chr(i: int) -> str
内置函数。返回 Unicode 码位为整数
i
的字符串格式。例如>>> chr(97) 'a' >>> chr(65) 'A'
实参的合法范围是 0 - 1114111。如果
i
超过这个范围,会触发ValueError
异常。
它是内置函数ord()
的逆函数。
2.1.3 表达式求值
eval(expression: str) -> int
内置函数。表达式解析参数
expression
并作为 Python 表达式进行求值(从技术上说是一个条件列表)。其中expression
必须是一个合法的表达式。例如:>>> eval('400+5') 405 >>> eval('400 + 5 * (1 + 1)') 410
2.2 数字类型
2.2.1 数字类型的定义
整数的类型是int
,浮点数的类型是float
。
2.2.1.1 整数类型
class int(number: int | float = 0, /) -> int
class int(string: str, /, base: int = 10) -> int
内置函数。返回从数字或字符串中构造的整数对象,或在没有传递参数的情况下返回 0。例如:
>>> int() 0 >>> int(123.45) 123 >>> int('123') 123
如果输入的参数对象(例如输入参数对象
x
)定义了__int__()
,则表达式int(x)
返回的是x.__int__()
;如果该对象定义了__index__()
,则返回的是x.__index__()
;如果该对象定义了__trunc__()
,则返回的是x.__trunc__()
。
如果输入参数不是一个数字,或者给定了base
,则它必须是在基数base
下可以表示整数的字符串、bytes、bytearray 实例。此外,在字符串前面可以加+
或-
(中间不能有空格和下划线)作为数字的正负号,正负号和数字之间可以有前导零,且符号和数字可以被空格包围,在数字之间可以穿插单下划线。例如:>>> int('123.45') # 该字符串不能表示一个整数 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: '123.45' >>> int(' -12_345\n') -12345
一个以
base
为基数的整数字符串包含多个数位,每个数位代表从 0 到base
- 1 范围内的值。0 - 9 的值可以用任何 Unicode 十进制数码来表示,10 - 35 的值可以用 a - z(或 A - Z)来表示。允许的基数为 0 和 2 - 36。对于基数 2、8、16 来说,字符串前面还可以加上可选的0b
/0B
、0o
/0O
、0x
/0X
前缀,就像代码中的整数字面值那样。例如:>>> int('FACE', base=16) 64206 >>> int('01110011', base=2) 115
对于基数 0 来说,字符串会以与代码中的整数字面值类似的方式来解读,即实际的基数将由前缀确定为 2、8、10 或 16。例如:
>>> int('0xface', base=0) 64206 >>> int('1110011', base=0) 1110011
基数 0 还会禁用前导的零,例如:
>>> int('010', base=0) # 无效,基数 0 会禁用前导 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 0: '010'
bin(x: int) -> str
内置函数。将一个整数转换为带前缀
0b
的二进制数的字符串。如果x
不是一个int
类型对象,则它必须定义返回一个整数的__index__()
。例如:>>> bin(3) '0b11' >>> bin(-3) '-0b11' >>> bin(-3.4) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'float' object cannot be interpreted as an integer >>> bin('3') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object cannot be interpreted as an integer
2.2.1.2 浮点数
class float(number: int | float = 0.0, /) -> float
class float(string: str, /) -> float
内置函数。返回一个从数字或字符串中构造的浮点数。如果参数是字符串,则它应该是一个包含十进制数字的字符串,数字之间可以有下划线,但是符号和数字之间不行。并且字符前可以有表示正负号的
+
或-
(符号和数字之间不能有空格或下划线),符号和数字前后可以有空格。例如:>>> float() 0.0 >>> float('+1.2_3') 1.23 >> float(' -12345\n ') -12345.0 >>> float('1e-003') 0.001 >> float('1E6') 1000000.0
字符串参数也可以表示非数字
NaN
,或正负无穷大,其中不区分大小写。例如;>>> float('nan') nan >> float('NAn') nan >>> float('-inf') -inf >> float('-INFinity') -inf
如果输入的参数超出了浮点数的表示范围,则会引发一个
OverflowError
。
对于一个普通的 Python 对象,float(x)
的输入参数会委托给x.__float__()
。如果未定义__float__()
,则将回退至__index__()
。
2.2.2 数字类型的运算
数字类型的运算符有:加(+
)、减(-
)、乘(*
)、除(/
)、整除(//
)、取余(%
)、乘方(**
)。其中除法运算(/
)的结果总是返回浮点数。
2.3 序列类型
2.3.1 排序
sorted(iterable, /, *, key=None, reverse: bool = False) -> list
内置函数。根据
iterable
中的项返回一个新的已排序的列表。具有两个可选参数,它们都必须指定为关键字参数。key
指定带有单个参数的函数,用于从iterable
的每个元素中提取用于比较的键(例如key=str.lower
)。默认值为None
(即直接比较元素)。reverse
如果设为 True,则每个列表元素将按反向顺序比较进行排序。
sorted()
确保是稳定的。如果一个排序确保不会改变比较结果相等的元素的相对顺序就称其为稳定的 — 这有利于进行多重排序(例如先按部门、再按薪级排序)。
2.4 列表
2.4.1 列表的定义
列表(list
)是用方括号标注、逗号分隔的一组值,并且列表是一种复合数据类型,可以将不同类型的值组合在一起。例如:
>>> l = [1, 1.2, '1.3']
>>> l
[1, 1.2, '1.3']
列表类的定义如下:
class list
class list(iterable)
内置函数。创建一个新的列表。
2.5 字典
2.5.1 字典的定义
class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)
内置函数。创建一个新的字典,基于可选的位置参数和可能为空的关键字参数集来初始化。
字典的键几乎可以为任何值。不是可哈希的值,即包含列表、字典或其它可变类型(按值比较而非按对象标识比较)的值不可被用作键。比较结果相等的值可被互换使用以索引同一个字典条目。
2.5.2 字典的视图对象
由dict.keys()
、dict.values()
、dict.items()
所返回的对象是视图对象。该对象提供字典条目的一个动态视图,这意味着当字典改变时,视图也会相应改变。
字典的视图可以被迭代以产生与其对应的数据。
dict.items()
返回由字典项((键,值)对)组成的一个新视图。
2.5.3 字典的方法
2.5.3.1 字典项的操作
dict.get(key, default=None)
如果
key
存在于字典中则返回key
对应的值,否则返回default
。因此,该方法绝不会引发KeyError
。
2.6 集合类型
集合对象是由具有唯一性的可哈希对象所组成的无序多项集。常见的用途包括成员检测、从序列中去除重复项、数学中的集合类计算,例如交集、并集、差集等等。
2.6.1 集合的定义
目前有两种内置集合类型:set
和frozenset
。set
类型是可变的。由于是可变类型,它没有哈希值,且不能被用作字典的键或其它集合的元素。frozenset
类型是不可变并且为可哈希的。其内容在被创建后不能再改变,因此它可以被用作字典的键或其它集合的元素。
两个类的构造器具有相同的作用方式:
class set([iterable])
class frozenset([iterable])
内置函数。创建一个新的
set
或frozenset
对象,其元素来自于iterable
。集合的元素必须为可哈希的。要表示由集合对象构成的集合,所有的内层集合必须为frozenset
对象。如果未指定iterable
,则将返回一个新的空集合。
集合可用多种方式来创建。第一种是使用花括号及以逗号分隔元素的方式创建非空的set
对象,例如:
>>> s = {'jack', 'sjoerd'}
>>> s
{'jack', 'sjoerd'}
第二种方式是使用集合推导式创建set
对象,例如:
>>> s = {c for c in 'abracadabra' if c not in 'abc'}
>>> s
{'r', 'd'}
第三种方式是使用类构造器,例如:
>>> s = set()
>>> s
set()
>>> s = set('foobar')
>>> s
{'f', 'o', 'a', 'b', 'r'}
>>> f = frozenset()
>>> f
frozenset()
>>> f = frozenset('foobar')
>>> f
frozenset({'f', 'o', 'a', 'b', 'r'})
2.6.2 集合上的运算
len(s)
内置函数。返回集合
s
中的元素数量(即s
的基数)。
x in s
x not in s
检测
x
是否是s
中的成员。
2.6.3 集合上的操作(仅可变的set
集合支持)
set.add(elem)
将元素
elem
添加到集合中。