《简明Python教程》读书笔记
使用《简明Python教程》漠伦翻译版
https://bop.mol.uno/
使用Python3.5.1
关于Python
简单、易于学习、自由且开放(FLOSS)、高级语言、跨平台性、解释性、面向对象、可扩展性、可嵌入性、丰富的库
在程序内部,Python会将源代码转换为称为字节码的中间形式,尔后再转换成你的电脑所使用的语,并运行它
安装
Linux
第一步
通过Python运行程序有两种方法
- 使用交互式解释器提示符
>>>
- 直接运行一个源代码
python test.py
Python区分大小写
获取帮助
最好使用引号,不使用引号有时会出错,比如help(return)
按q
退出
基础
- 注释:使用
#
- 字面常量
- 数字:整数
1
、浮点数3.23``52.3E-4
- 字符串:字符串是不可变的
- 单引号:所有引号中的空格、制表符保留原样(不是转义
\t
) - 双引号:和单引号括起的字符串一样
- 三引号:”””或’’’,多行字符串
- 单引号:所有引号中的空格、制表符保留原样(不是转义
- Python从0开始计数
字符串
字符串格式化
不需要转换格式,数字可以不写
|
|
print
会以\n
结尾,通过end
可以指定结尾方式
print()
用,
连接字符串,且会自动加上空格
字符串连接
不如格式化美观,容易出错,而且需要转换类型
转义字符
\'
:单引号\n
:换行\t
:制表符- 在一个字符串中,一个放置在末尾的反斜杠表示字符串将在下一行继续,但不会换行
原始字符串r
或R
,在处理正则表达式时应全程使用原始字符串
变量
命名
- 第一个字符必须是字母表中的字母(大写ASCII字符或小写ASCII字符或Unicode字符)或下划线(
_
)。 - 标识符的其它部分可以由字符(大写 ASCII 字符或小写 ASCII 字符或 Unicode字符)、下划线(
_
)、数字(0~9)组成。 - 标识符名称区分大小写
Python将程序中的任何内容统称为对象,包括数字、字符串与函数
逻辑行与物理行
物理行(Physical Line)是你在编写程序时你所看到的内容
逻辑行(Logical Line)是Python所看到的单个语句
显式行连接
隐式行连接
逻辑行以括号开始,它可以是方括号或花括号,但不能是右括号
可以不使用\
缩进
在逻辑行的开头留下空白区(使用空格或制表符)用以确定各逻辑行的缩进级别
放置在一起的语句必须拥有相同的缩进,每一组这样的语句被称为块(block)
运算符与表达式
运算符
+
、-
、*
、/
、**
(乘方)、//
(整除)、%
(取余)<<
(二进制左移) 、>>
(二进制右移)&
(按位与) 、|
(按位或) 、^
(按位异或)、~
(按位取反,x的按位取反结果为-(x+1))- 转换为二进制
<
、>
、<=
、>=
、==
、!=
- 所有的比较运算符返回的结果均为
True
或False
。请注意这些名称之中的大写字母
- 所有的比较运算符返回的结果均为
not
、and
、or
- 短路计算
/
除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数//
永远是整数,即使除不尽
优先级
从最低优先级到最高优先级,同一行的运算符具有相同优先级
控制流
if语句
条件判断从上向下匹配,当满足条件时执行对应的块内语句,后续的elif和else都不再执行
while语句
else语句在循环结束后执行
for语句rang()
将会返回一个数字序列,从第一个数字开始,至第二个数字结束。range(1,5)
将输出序列[1,2,3,4]
range(1,5,2)
将会输出[1,3]
不会包括第二个数字在内range()
每次只会生成一个数字,list(range(5))
返回完整的数字列表
|
|
else语句在循环结束后执行
break语句
如果中断了一个for或while循环,任何相应循环中的else块都将不会被执行
|
|
continue语句
|
|
函数
|
|
|
|
在定义函数时给定的名称称作“形参”(Parameters)
在调用函数时你所提供给函数的值称作“实参”(Arguments)
函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”
hex()
把一个整数转换成十六进制表示的字符串
局部变量
所有变量的作用域是它们被定义的块,从定义它们的名字的定义点开始
结果是
当你在一个函数的定义中声明变量时,它们不会以任何方式与身处函数之外但具有相同名称的变量产生关系
全局变量
|
|
结果为
默认参数值
默认参数值应该是常数
关键字参数
|
|
结果如下:
可变参数
当我们声明一个诸如*param
的星号参数时,从此处开始直到结束的所有位置参数都将被收集并汇集成一个称为“param”的元组(Tuple)
类似地,当我们声明一个诸如**param
的双星号参数时,从此处开始直至结束的所有关键字参数都将被收集并汇集成一个名为param
的字典(Dictionary)
结果如下:
return语句
从函数中返回,中断函数
DocStrings 文档字符串
文档字符串约定的格式:
一串多行字符串,其中第一行以某一大写字母开始,以句号结束。第二行为空行,后跟的第三行开始是任何详细的解释说明
结果如下:
模块
模块用于在别的程序中重用函数
编写模块的方法
- 创建一个包含函数与变量,以.py为后缀的文件
- 使用撰写Python解释器本身的语言来编写模块(C、Java)
模块分为内置模块(如sys)和自行编写的模块,Python解释器从sys.path
所提供的路径中搜索自行编写的模块,所以必须将模块在sys.path
内所列出的目录中,比如当前目录
标准库模块,sys模块包含了与Python解释器及其环境相关的功能,也就是所谓的系统功能
运行的脚本名称在sys.argv
的列表中是第一个,即sys.argv[0]
运行:
结果:
.pyc文件
将Python模块转换成中间形式的文件,以提高效率
按字节码编译的(Byte-Compiled)文件,这一文件以.pyc为其扩展名
通常会创建在与对应的.py
文件所处的目录中
from…import语句
直接将需要的变量导入程序
尽量避免使用from…import语句,而去使用import语句
避免在你的程序中出现名称冲突
模块的name
每个模块都有一个名称,而模块中的语句可以找到它们所处的模块的名称。
可以用于确定模块是独立运行的还是被导入进来运行
每一个Python模块都定义了它的__name__
属性。如果它与__main__
属性相同则代表这一模块是由用户独立运行的
|
|
|
|
编写自己的模块
要将模块放在sys.path
列出的目录下,或者与其它我们即将导入这一模块的程序相同的目录下
|
|
|
|
|
|
mymodule_demo2.py所输出的内容与mymodule_demo.py所输出的内容是一样的
dir函数
返回由对象所定义的名称列表
该函数接受参数。如果参数是模块名称,函数将返回这一指定模块的名称列表。如果没有提供参数,函数将返回当前模块的名称列表。
|
|
包
包是指一个包含模块与一个特殊的__init__.py
文件的文件夹,后者向Python表明这一文件夹是特别的,因为其包含了Python模块
模块是一种可重用的程序。包是用以组织模块的一种层次结构
数据结构
列表List
列表是可变的,有序的
元素的数据类型可以不同
元组Tuple
有序,不可变
字典Dict
无序
使用键-值(key-value)存储,具有极快的查找速度
在其他语言中称为map
|
|
返回None
的时候Python的交互环境不显示结果
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
dict的key必须是不可变对象,使用key的Hash值计算value的存储位置
items()
方法将字典的元素转化为了元组,而key
参数对应的 lambda
表达式的意思则是选取元组中的第二个元素作为比较参数(如果写作 key=lambda item:item[0]
的话则是选取第一个元素作为比较对象,也就是 key
值作为比较对象。lambda x:y
中 x
表示输出参数,y
表示 lambda
函数的返回值),所以采用这种方法可以对字典的 value
进行排序。注意排序后的返回值是一个 list
,而原字典中的名值对被转换为了 list
中的元组。
序列Sequence
序列的三种形态——列表、元组与字符串
资格测试(in、not in)、索引操作、切片
切片操作不包含结束位置
集合Set
无序,不重复
不可以放入可变对象,因为无法保证不重复
不可变对象
str
是不变对象,而list
是可变对象
|
|
replace
方法创建了一个新字符串’Abc’并返回
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的
引用
|
|
字符串
|
|
解决问题
单独开一章
面向对象编程
类与对象是面向对象编程的两个主要方面。一个类(Class)能够创建一种新的类型(Type),其中对象(Object)就是类的实例(Instance)
字段(Field)
方法(Method)
字段与方法通称类的属性(Attribute)
实例变量(Instance Variables)
类变量(Class Variables)
|
|
init方法
__init__
方法会在类的对象被实例化(Instantiated)时立即运行,用于初始化
类变量和对象变量
|
|
population
是类变量,Robot.population
或self.__class__.population
,共享数据name
是对象变量,self.name
how_many
是类方法
Robot.__doc__
访问类的文档字符串Robot.say_hi.__doc__
访问方法的文档字符串
__privatevar
私有变量
继承
|
|
SchoolMember.__init__(self,name,age)
调用父类的构造方法SchoolMember.tell(self)
调用父类的方法
多重继承
输入与输出
|
|
|
|
阅读模式(’r’)
写入模式(’w’)
追加模式(’a’)
文本模式(’t’)
二进制模式(’b’)
在默认情况下,open() 会将文件视作文本(text)文件,并以阅读(read)模式打开它。
readline会读取换行符
Pickle
将任何纯 Python 对象存储到一个文件中,并在稍后将其取回。这叫作持久化(Persistently)存储对象
|
|
Unicode
|
|
使用 io.open 并提供了“编码(Encoding)”与“解码(Decoding)”参数来告诉 Python 我们正在使用 Unicode。
异常
错误处理器:抛出错误,打印出检测到的错误发生的位置
EOFError,文件结尾错误(End of File)
处理异常
|
|
|
|
else 子句将在没有发生异常的时候执行
抛出异常
raise 语句可以引发一次异常,具体方法是提供错误名或异常名以及要抛出(Thrown)异常的对象。
Try…Finally
无论是否会发生异常必然执行,finally
with语句
使用with open语句会自动关闭文件
标准库
sys模块
日志模块logging
|
|
更多
Lambda
|
|
列表推导
|
|