Python核心编程学习笔记
Python核心编程
第二版学习笔记
快速入门
Python是一门解释性语言,作为对比JavaScript也是解释性语言。学习的前提需要到官网(https://www.python.org) 下载并安装最新版本。Python源文件一般用.py作为扩展名。
1 | #script.py |
将示例文件另存为:script.py, 在Windows命令行中执行python script.py, 可以看到如下信息。
1 | Hello World! |
Python基础
语句和语法
- 井号(#)之后的字符为Python的注释;
- 换行(\n)是标准的行分隔符,一般一行一条语句;
- 反斜杠()表示继续上一行,一行过长的语句使用反斜杠(\)可以分解成多行;
- 分号(;)将两个语句连接在一起,如果需要将两条语句放到同一行中,需要使用分号隔开;
- 冒号(:)将代码块的头和体分开,像if、while、def、class复合语句,首行以关键字开始,以冒号(:)结束,该行之后的一行或多行构成代码组,首行和代码组合起来称为一个子句;
- 语句(代码块)用缩进的方式体现,不同的缩进深度分割不同的代码块,缩进相同的一组语句构成一个代码块,建议每个缩进使用4个空格表示;
- Python文件以模块的形式进行组织。
变量赋值
等号是主要的赋值操作符。
增量操作符和C语言类似。
Python使用下划线作为变量前缀和后缀时为特殊变量。
Python支持多元赋值,示例如下:1
x, y, z = 1, 2, 'Hello World!'
标识符
标识符定义规则:第一个字符必须是字母或下划线,剩下的字符可以说字符、数字和下划线。标识符大小写敏感。
1 | #不要使用dict、list、file、bool、str、input、len等内置类型作为变量名。 |
Python对象
基本数据类型
- 数字
- Integer 整型
- Boolean 布尔型
- Long integer 长整型
- Floating point real number 浮点型
- Complex number 复数类型
- String 字符串
- List 列表
- Tuple 元组
- Dictionary 字典
所有类型对象的类型都是type,这个概念有点类似于C#中所有类型都是由object派生出的一样。
Python中的特殊类型是None, 表示Null对象或NoneType. None类型类似于C#中的void, 值类似于null. None的布尔值总是为False.
操作符
对象值可以使用:>、<、==、>=、<=、!=等操作符进行比较。
对象引用方式根据赋值方式,有所不同。1
2
3
4
5
6
7#示例
#a1和a1引用的相同对象
a1 = a2 = 123
#b1和b2引用的不同对象
b1=123
b2=123
使用is、is not可以比较是否引用的同一对象。1
2
3
4
5#结果:True
a1 is a1
#结果:False
b1 is b2
布尔类型操作符:not、and、or.
内置函数
函数 | 功能 |
---|---|
cmp(obj1,obj2) | 比较obj1和obj2,根据比较结果返回整型值 |
repr(obj) | 返回一个对象的字符表示,类似C#中ToString方法 |
str(obj) | 返回可读性好的对象字符串,类似C#中ToString带格式的方法 |
type(obj) | 获取对象的类型,返回相应的type对象 |
类型分类
数据类型 | 存储类型 | 更新模型 | 访问模型 |
---|---|---|---|
数字 | 标量 | 不可更改 | 直接访问 |
字符串 | 标量 | 不可更改 | 顺序访问 |
列表 | 容器 | 可更改 | 顺序访问 |
元组 | 容器 | 不可更改 | 顺序访问 |
字典 | 容器 | 可更改 | 映射访问 |
标量:一个保存单个字面对象的类型,类似于C#中的值类型和字符串。
容器:可存储多个对象(对象可以有不同的类型)的类型,类似C#集合。
可变类型:允许值被更新,每次修改后新值替换旧值。类似C#引用类型。
不可变类型:不允许值被更改,每次修改后使用新的值替代;旧值被丢弃,等待垃圾回收器处理回收对象。类似C#值类型。
直接访问:对数值直接进行访问,类似C#中栈。
顺序访问:可对容器按索引进行访问元素,类似C#中索引。
映射访问:元素无序存放,通过唯一Key访问,类似C#中哈希。
数字
Python的整型包含:布尔型、标准整型、长整型。布尔型只有两个取值:True和False, 对应整型的1和0. 标准整型和C# Int32和Int64表示范围相同,在32位机器上范围为Int32, 64位则为Int64. 长整型的范围超过Int64, 具体范围与(虚拟)内存大小有关,长整型一般在数值后面加一个大写的L. Python会自动转换整型和长整型。
复数由实数部分和虚数部分构成,虚数语法:real+imagj. 实数和虚数部分都是浮点类型,虚数部分后缀必须为j或J.
两个连续的星号(**)表示幂运算.1
3 ** 2 #结果为:9
整除操作符://, 也称“地板除”,除法不管操作数为何种数值类型,总是舍去小数部分,返回数字序列总别真正商小的最接近的数字。1
2
31//2 #结果为:0
1.0//2.0 #结果为:0.0
-1//2 #结果为:-1
数值工厂函数
函数 | 操作 |
---|---|
bool(obj) | 返回obj对象的布尔值 |
int(x [,base]) | 将x转换为一个整型 |
long(x [,base] ) | 将x转换为一个长整型 |
float(x) | 将x转换到一个浮点型 |
complex(real [,imag]) or complex(str) | 创建一个复数 |
仅适用于整型的内置函数
函数 | 操作 |
---|---|
hex(num) | 将数字转换成十六进制数并以字符串形式返回 |
oct(num) | 将数字转换成八进制数并以字符串形式返回 |
chr(num) | 将ASCII值的数字转换成ASCII字符,范围:0<=num<=255 |
ord(chr) | 传入长度为1的字符串,返回相应的ASCII整数值或Unicode整数值 |
unichr(num) | 将一个整数转换为Unicode字符 |
序列:字符串、列表和元组
序列
序列元素顺序
1 | 0 1 2 N-2 N-1 |
序列类型操作符
序列操作符 | 作用 |
---|---|
seq[index] | 获取下标为index的与元素 |
seq[index1:index2] | 获取下标从index1到index2之间的元素 |
seq * expr | 序列重复expr次 |
seq1 + seq2 | 连接序列seq1和seq2 |
obj in seq | 判断元素obj是否包含在seq中 |
obj not in seq | 判断元素obj是否不包含在seq中 |
切片操作符:[]、[:]、[::]
1 | #切片示例 |
字符串
Python中使用单引号或双引号创建字符串,使用del语句删除字符串。
字符串进行比较操作时,按照ASCII值的大小进行比较。
字符串格式化操作符:%.
字符串格式化符号
格式化符 号 | 转换方式 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | %f和%e的简写 |
%G | %F 和 %E 的简写 |
%p | 用十六进制数格式化变量的地址 |
格式化操作符辅助指令
符号 | 作用 |
---|---|
* | 定义宽度或者小数点精度 |
- | 用做左对齐 |
+ | 在正数前面显示加号( + ) |
在正数前面显示空格 | |
# | 在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) |
0 | 显示的数字前面填充’0’而不是默认的空格 |
% | ‘%%’输出一个单一的’%’ |
(var) | 映射变量(字典参数) |
m.n. | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
1 | #格式示例 |
字符串格式化的高级用法是使用字符串模板,引入Template模块对象,调用substitute()和safe_substitute()方法进行格式化。
1 | from string import Template |
注意:字符串中的模板必须与变量一一对应,否则会出现KeyError异常。而使用safe_substitute()在缺少key时可以将字符串原封不动的打印出来。
Unicode字符串在字符串前加大写U或小写u. 加前缀u表示告诉Python后面的字符串要编码成Unicode字符串。
1 | print(u'\u8881') #袁 |
在控制台界面中可以使用input(raw_input()为python2中的函数python3中不存在)函数进行输入字符串,类似于C#中的Console.ReadLine().
使用反斜杠()加一个单一字符可以表示一个特殊字符。
三引号语法允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。语法类似C# @””.
1 | #示例 |
列表
列表使用方括号([])进行定义。
1 | aList = [123, 'Hello', 'abc', 123.456, ['abcd', 100]] |
元组
元组的功能和列表类似,元组使用圆括号进行定义。元组属于不可变类型,类似于C#中只读集合。元组中的元素不可跟新和删除,只能删除整个元组。
1 | aTuple = (123, 'Hello', 'abc', 123.456, ['abcd', 100]) |
字典和集合类型
字典
字典是Python语言中唯一的映射类型,可以简单理解为Hash集合。字典初始化有两种方式:{}和dict()函数。字典和JavaScript中的对象类似,都是使用大括号({})将key和value值进行包裹。
1 | #字典示例 |
不允许一个键对应多个值,当键冲突时,取最后(最近)的赋值。键必须是可哈希的,一般使用数字、字符串作为字典键。键必须是可哈希的原因是:解释器调用哈希函数,根据键中的值来计算存储位置,如果键是可变对象,它的值可能发生变化,导致哈希函数无法映射到原有的地址,无法获取数据。
字典获取特定元素时,若key不存在则会抛出:”name ‘dict’ is not defined“异常。使用setdefault()方法可以避免key不存在的问题。
1 | print(dict2.setdefault('name', 'yuan')) #wenwen |
集合
集合元素是一组无序排列的可哈希的值。集合有两种类型:可变集合(set)和不可变集合(frozenset)。可变集合不能作为字典的键,也不能作为其他集合的元素。创建集合只能使用集合的工厂方法set()和frozenset().
集合类型操作符包括(所有集合类型):联合(|)、交集(&)、差补/相对补集(-)、对称差分(^)。
1 | s = set('abcdefgh') |
仅适用于可变集合的操作符:|=、&=、-=、^=,功能和示例代码类似,不再做演示。
条件和循环
if语句语法
1 | if expression: |
Python支持elif关键字,用于表示else-if.
1 | if expression1: |
条件表达式(三元操作符)语法:X if C else Y
1 | #C、C++、C#、Java 三元操作符示例 |
while语句语法
1 | while expression: |
for语句类似于C#中foreach,语法如下:
1 | for iter_var in iterable: |
使用enumerate()函数可获取索引和项。
1 | #enumerate()函数示例 |
range()函数语法:range(start, end, step=1), range()会返回一个包含所有k的列表,start <= k < end, 从start到end, k每次递增step. step不可为0.
1 | aList = range(3, 19, 5) |
Python中break和continue语句用法和其他语言类似。
Python提供pass语句,它不做任何事情,用于开发调试。
1 | #pass语句示例 |
Python支持迭代器,为类序列对象提供一个类序列的接口,类似C#中IEnumerator.
1 | #iter()函数示例 |