Python 关键知识1
总结自:www.sigai.cn 的『AI领域的Python核心编程』。下文我们仅仅讨论 Python3。
Python 关键知识
-
学习 Python 的正确姿势:不是非常系统的全面学习,也不是直接用一个个的小项目去动手练习。从学习目的出发,找到一个最小的学习范围,并把这个范围系统性的学习到非常扎实的程度,其余的知识,看到了或者需要用了,交给 Google 来碎片化的补充学习即可。
-
Python 是一门解释型语言(先翻译,在执行)。(计算机执行的是机器代码。人类写出来的代码需要被翻译成机器代码。)Python 的翻译基于虚拟机:先编译,后解释(PyCodeObject 与 pyc 文件)。
1 输入与输出
-
print()
:输出 -
input()
:通过外设输入
2 基本数据类型
- 整数:与数学上的写法完全一样,可以处理任意大小的整数
- 浮点数:由于内部存储方式的不同,整数计算永远精确,浮点数则不是
-
字符串:
""
、''
中的任意文本 -
布尔值:
True
或False
;可进行and
、or
、not
运算 -
空值:
None
3 常量
在 Python 中通常用全部大写的变量名表示常量。如 PI = 3.141592653589793
。
4 基本运算
+
(加法)、-
(减法)、*
(乘法)、/
(除法)%
(求余)与数学完全一致。不过,/
的结果一律是浮点数。考虑到浮点数并不是那么精确,所以只要涉及到浮点数的这些运算的输出一律是浮点数。
//
(向下取整)对应于数学中数轴往左取的整数。
在 Python 中,你可以通过内置函数 round()
来实现四舍五入,而 int()
仅仅是截断整数部分。
5 变量
- 由于 Python 是动态类型语言,所以变量可以是任意数据类型
- 使用变量之前必须先赋值
- 变量无类型,对象有类型
- 对象是内存中存储数据的实体,变量则是指向对象的指针
- 变量指向一个对象,而对象有可变与不可变之分
下面列出一些 Python 的基本数据类型:
可变类型 | 不可变类型 |
---|---|
list , bytearray , dict
|
str , tuple , frozenset , bytes , 整数, 浮点数, 布尔值, None
|
在 Python 中,我们可以通过 id
函数查看对象所在内存地址。下面我们看几个例子来深入理解变量。
a = 'Tom'
id(a)
2156557306376
a1 = 'tom'
id(a1)
2156557306264
由于 str
是不可变对象,所以 a
与 a1
的 id
不同。
a2 = a
a = 'T'
id(a2), id(a)
(2156557306376, 2156518162648)
a2
与 a
(改变前)引用同一个对象,a
(改变后)则 a
的引用对象发生改变,而 a2
并没有改变。下面我们看看 list
:
b = ['a1', 'a2']
id(b)
2156557293448
b.append('a3')
id(b)
2156557293448
对可变类型对象的赋值,传递的是引用,类似于 C 语言的指针。
c = b
b, c
(['a1', 'a2', 'a3'], ['a1', 'a2', 'a3'])
id(b) == id(c)
True
b[0] = 45
c, b
([45, 'a2', 'a3'], [45, 'a2', 'a3'])
如果不想传递引用,需要使用 copy
的方式:
b.append([2, 3])
d = b[:]
id(b) == id(d)
False
b, d
([45, 'a2', 'a3', [2, 3]], [45, 'a2', 'a3', [2, 3]])
不过,这种方式仅仅是浅层 copy:
b.pop(0)
b, d
(['a2', 'a3', [2, 3]], [45, 'a2', 'a3', [2, 3]])
b[-1][0] = 0
b, d
(['a2', 'a3', [0, 3]], [45, 'a2', 'a3', [0, 3]])
如果你想要完全复制,则需要:
import copy
e = copy.deepcopy(b)
b[-1][0] = 111
b, e
(['a2', 'a3', [111, 3]], ['a2', 'a3', [0, 3]])
6 序列
在 Python 中,有序列(有序):list
& tuple
, set
& frozenset
, 字符串。
序列通用方法有:
- 浅层 copy:切片、
+
、*
- 长度:
len
注意:切片中的负步长的负号仅仅指的是往左方向进行切片。
下面我们看看它们除了这些通用方法,还有什么特殊方法:
6.1 list
L = ['a12', 'a2', 'a31']
sorted(L) # 复制并排序
['a12', 'a2', 'a31']
L.sort() # 排序
L
['a12', 'a2', 'a31']
L.append(67) # 添加元素
L
['a12', 'a2', 'a31', 67]
L.pop() # 移除并返回最后一个元素
67
L
['a12', 'a2', 'a31']
L = [2] * 4 + [5] * 6 + [4, 5, 7, 9]
L.count(5) # 统计元素出现的个数
7
6.2 字符串
字符串一般可以划分为:str
, bytes
, 转义字符, raw string, bytearray
。具体内容可参考:字符串。
- ASCII 编码省空间,但容易出现乱码
- Unicode 通用了各种语言的编码,但可能存在大量空间冗余
- UTF-8:可变长的 Unicode 编码,ASCII 可被认为是 UTF-8 的一部分
字符编码常见工作模式
- 内存中:Unicode
- 存储时:UTF-8
- 传输时:UTF-8
内存中默认的字符串是 str
类型,以 Unicode 编码存储或传输时用字节为单位的 bytes
类型:
-
encode
:转换为bytes
-
decode
:转换为str
s = ''.join(L) # 拼接
s
'a12a2a31'
s1 = s.replace('a', 'A') # 复制并替换
s
'a12a2a31'
6.3 set
set
是 dict
中 key
的集合。
由于 key
是 hashable,因此 set
中无重复元素。
7 字典
dict
是可变类型对象,形式为:{key: value}
,特点:查找速度极快。
用空间换时间的策略,消耗内存大。
更多详细内容见 容器(列表 & 元组 & 字典 & 集合)
8 条件判断
-
==
,!=
,>
,<
,>=
,<=
:计算用数值,结果用布尔 -
not
:计算用布尔,返回是布尔 -
is
不计算,只判断 - 链式判断大小关系:结果与数学上保持一致
-
and
:从左往右查找0
或False
, 找到则立即返回,未找到则返回最后一个 -
or
:从左往右查找 非0
数字 或True
, 找到则立即返回,未找到则返回最后一个
即 and
与 or
是惰性求值的。
9 循环
-
for
:逐个取出 -
while
:按条件进行循环 -
break
语句:满足条件则跳出循环 -
continue
语句:满足条件则直接进入下个循环
10 包管理工具 pip
-
pip -V
:查看版本 -
pip install --upgrade pip
:安装(升级) -
pip install 包名称 (-U/ --user)
:安装包
还有一个需要注意:sys.path
是 Python 解释器默认搜索路径列表