参考教材:python3.6从入门到精通-王英英编着-清华大学出版社
python特点:缩入分层
所有代码块语句必须包含相同的缩进空白数量和相同的缩进方法(wab键,两个或四个空间)
- 换行符:\n
- 超过一行程序代码:
- 每行结尾加反斜杠\
- 用小括号()中括号[]大括号{}包含的句子,不用反斜杠就可以直接分成数行
- 将多行表达为一行行尾加分号;
- 单行注释:以#开用
- 多行注释:用三个单引号或三个双引号
value表示用户要输出的信息,省略号表示有多个信息要输出。
sep默认设置多个输出信息之间的分隔符作为空间。
end是一个print()信息输出后添加的所有符号默认值为换行符。
用于识别变量、函数、类、模块和对象的名称。(A-Z,a-z,0-9,和下划线_)
- 第一个字符必须是字幕或下划线,变量名称之间不能有空格
- 标识符分为大小写。
2.简单数据类型
可以使用real和imag属性取数复数的实数和虚数部分。
注意数字操作:
数值的除法总是返回浮点数,以获得整数使用(//)操作符。
将整形手术转化为浮点型,混合计算整数和浮点数。
python将字符串视为一系列字符组合。
创建字符串时,应包含单引号、双引号或三引号。引号的开头和结尾应一致。
由于单引号和双引号不能跨行,字符串长度跨行时使用三引号。
- 转换为整形
- 转换为浮点型
- 转换为字符串类型
2.6python结构数据类型
Set(集合)是无序无重复元素的集合。主要功能是自动清除重复元素。创建集合时,用大括号{}包含元素。
- 元素由键值(key)和数值(value)组成,中间用冒号(:)隔开。
- 键值必须是字符串、数字或元组,这些对象是不可变的。
- 数值可以是任何类型的数据。字典的元素没有顺序排列。
2.7运算符和优先级
加减乘除取余
**乘方
//取整除
== != > < >= <=
一个运算符号加等号:例c=+a等价于c=c+a。
and or not
& |
按位算,相同取1 |
(12&6)=4,二进制为:0000 0100 |
| |
按位算,只要对应的二进制有一个为1,结果就是1 |
|
^ |
按位异或,两个对应的二进制相异时,结果为1,否则为0 |
|
~ |
按位取反,把每个数据的二级制取反 |
|
<< |
左移动,把’<<’左边的运算数的各个二进位全部左移若干位,高位丢弃,低位补0 |
|
>> |
右移动,把’<<’右边的运算数的各个二进位全部右移若干位。低位丢弃,高位补0 |
x in y 表示若x在y序列中则返回True ; x not in y表示若x不在y序列中则返回True。
is判断两个标识符是不是引用自同一个对象;is not 判断两个标识符是不是引用自不同对象。
列表、元组和字典的基本操作
3.1列表的基本操作
- 列表中元素可以是不同的类型
- 列表中元素可以是另一个列表
- 访问列表从0开始
- 列表可以嵌套,嵌套的列表用另一个中括号[ ]索引
- 获取某个元素的返回值index(c)方法。(c是元素内容)
- 改变列表对象的元素值,
- 在列表中插入新元素aa[3:]=[“元素内容”,····]表示从左侧数第四个位置开始添加新元素。
- 删除列表中的元素,使用del语句
+用于组合列表,*用于重复列表
列表的函数len(),max(),min(),list()
len()返回列表的长度 max()返回列表元素中的最大值。 min()返回列表元素中的最小值
列表的方法
- append(object)方法在列表对象的解为,加上新对象object。
- clear()函数用于清空列表,类似于del a[:]
- copy()函数用于复制列表。
- count(value)方法针对列表对象中的相同元素值value计算其数目。
- extend(list)方法将参数list列表对象中的元素加到此列表中,成为此列表的新元素。
- index(value)方法将列表对象中元素值为value的索引值返回。
- insert(index,object)方法将在列表对象中索引值为index的元素之前插入新元素object。
- pop([index])方法将列表对象中索引值为index的元素删除。如果没有指定index的值,就将最后一个元素删除。
- remove(value)方法将列表对象中元素值为value的删除。
- reverse()方法将列表对象中的元素颠倒排列。
- sort()方法将列表对象中的元素依照打校顺序排列。
3.2元组的基本操作(元组的对象不能修改)
需要在元素后加上逗号(,)否则python会认为此元素是设置给变量的值创建一个只有一个元素的元组, 元组的对象值不能修改。 删除元组内的对象 元组对象支持使用索引值的方式来返回元素值获取元组对象的元素值: 虽然元组值不可以修改,但是可以组合。组合元组: :使用del语句删除整个元组
返回元组的长度len()函数: 返回元组的最大值max()函数: 返回元组的最小值min()函数: 返回元组中所有元素的和tuple()函数:
3.3字典的基本操作
使用键值作为索引(需保证键值存在)获取字典中的元素值:
修改字典中的元素值 使用del语句删除字典中的元素: 定义字典键值时需要注意的问题
- 不允许同一个键值多次出现。
- 不能使用列表作为键值
- 字典的内置函数
- len(dict):计算字典元素的个数,即键值的总数
- str(dict):将字典的元素转化为可打印的字符串形式。
- type(variable)返回输入的变量类型,变量是字典,就返回字典类型。
- 字典的内置方法
- clear()清除字典中的所有元素。
- copy()复制字典
- get(k[,d]):k是字典的索引值,d是索引值的默认值,若k存在,就返回其值,否则返回d。
- keys():使用字典中的键值创建一个列表对象。
- popitem():删除字典中的最后一个元素
- setdefault(k[,d]):k是字典的键值,d是键值的默认值。若k存在,返回其值,否则返回d。
- update(E):E是字典对象,由字典对象E来更新此字典。
- values():使用字典中键值的数值创建一个列表对象。
操作字符串
4.1字符串的常用操作
- 使用方括号来截取字符串
- 若索引值是复数,则从后向前数
- 使用冒号(:) a[x:y]
- 若省略开始索引值,分割字符串就由第一个字符道结尾索引值
- 若省略结尾索引值,分割字符串就由开始索引值道最后一个字符串。
- 换行字符(\n)
- 双引号(\”)
- 各进制的ASCII码
- 加入反斜杠字符,在字符串的引号前加上r或R
4.2使用字符串运算符
加号+,连接两个字符串
乘号*,可以将字符串的内容复制数次
逻辑运算符大于(>)等于(==)小于(<)比较两个字符串的大小
in 和not in测试某个字符是否存在于字符串内。
4.3格式化字符串
字符串格式化使用字符串操作符百分号(%)来实现。在百分号的左侧放置一个字符串,右侧放置希望被格式的值。
%c |
格式化字符串及其ASCII码 |
%s |
格式化字符串 |
%d |
格式化整数 |
%u |
格式化无符号整型 |
%o |
格式化无符号八进制数 |
%x |
格式化无符号十六进制数 |
%f |
格式化浮点数字,可指定小数点后的精度(要格式浮点数,则可以提供u送需要的精度,即一个句点加上需要保留的小数点位数%.2f)(默认为6为小数) |
%e |
用科学计数法格式化浮点数 |
%p |
用十六进制数格式化变量的地址 |
4.4内置的字符串方法
使用方法:str.count(sub,start=0,end=len(string))
str是字符串,sub是要搜索的字符串,start为字符串开始搜索的位置,默认为第一个字符。end为字符串解说搜索的地址,默认为字符串的最后一个位置。
语法格式:str.find(str,beg=0,end=len(string))
str为索引字符串,beg为开始索引,默认为0。end为结束索引,默认为字符串的长度
第五章 程序的控制结构
5.1概述
顺序结构
选择结构
循环结构
5.2基本处理流程
5.3多样的赋值语句
python中变量不需要声明,但是每个变量在使用前都需要赋值。
5.4顺序结构
5.5布尔表达式
将其他形式转为布尔型
5.6选择结构与语句
if 表达式1: 每个条件后都要使用冒号
语句1 使用缩进划分语句块,相同缩进数的语句在一起组成一个语句块
elif表达式 2: 没有switch。。。case语句
语句2
.......
用and和or
5.7循环控制语句
while 判断条件:
语句 注意冒号和缩进
for 变量 in 列表:
语句
else :
语句
break——跳出循环
使用continue语句,python将跳过当前循环块中的剩余语句,继续进行下一轮循环
pass是主语句,主要为了保持程序结构的完整性。
pass不做任何事情,一般用于占位语句。
- 使用anger会生成数列
- 可以指定区间值
- 可以指定增量
- 利用range和len遍历
第六章 函数
6.1函数优势
函数指的是一组语句的集合,通过函数名封装起来,
6.2调用内置函数
- abs(x)返回x的绝对值
- chr(i)i是ASCII码0~255,chr(i)返回i的单字符字符串
······
6.3定义函数
函数定义方法使用def关键字
语法格式:
def 函数名称(参数1,参数2···):
“文件字符串”————可以省略,用来作为描述此函数的字符串
<语句>
6.4函数的参数
python的参数传递都是使用传址调用的方式。将该参数的内存地址传过去,若参数在函数内被更改,则会影响到原有的参数。
参数的数据类型剋是模块、类、实例或者其他函数,用户不必在参数内设置参数的数据类型。
要求用户必须以正确的顺序传入函数。调用时的数量必须和声明时的一样,设置函数的参数时,需依照他们的位置排列顺序。
用户可以直接设置参数的名称及其默认值,这种类型的参数属于关键字参数。
在设置函数的参数时,可以不依照他们的位置排列顺序,python解释器能够用参数名匹配参数值。
调用函数时,若没有传递参数,会使用默认参数值。
如果用户在声明参数时不能确定需要使用多少个参数,就是用可变参数。
基本语法:
def functionname([formal_args,]*var_args_tuplr):
“函数_文档字符串”
fuction_suite
return[expression]
加了星号*的变量名会存放所有未命名的变量参数。如果在函数调用时灭有指定参数,他就是一个空元组。用户也可以不向函数传递未命名的变量。
**arg代表一个字典对象
6.5有返回值的函数和无返回值的函数
不带参数值的return语句返回none
函数的返回值可以是一个表达式
返回值可以是多个 return x,y
6.6形参和实参
形式参数:函数定义时出现的参数
实际参数:函数调用时给出的参数
发生函数调用时,实参的值会传递给形参
6.7变量的作用域
这里的x是一个全局变量
6.8返回函数
函数不仅可以作为其他函数的参数,还可以作为其他函数的返回结果。
如果在一个内部函数里对外部作用域(不是全局作用域)的变量进行引用,内部函数就成为闭包。
6.9递归函数
如果一个函数在调用时直接或间接地调用了自身,就称为函数的递归调用,该函数为递归函数。
使用递归函数需要防止栈溢出。在计算机中,函数调用是通过栈这种数据结构实现的。进入一个函数调用,就加一层栈帧,当函数返回,就减一层栈帧。栈的大小不是无限的,会产生栈溢出。
解决栈溢出的方法是通过
6.10匿名函数
所谓匿名,即不再使用def语句这样的标准形式定义一个函数。python用lambda创建一个匿名函数。
冒号前面是参数(可以有多个)用逗号隔开冒号右边的返回值
6.11偏函数
通过设置参数的默认值,可以降低函数调用的难度。
functools.partial就是帮助用户创建偏函数的
6.12函数的内置属性和命名空间
6.12输入和输出函数
实现不换行输出,变量末尾加上end=“”
类与对象
面向对象的基本概念,面向对象的三个重要特征(封装性、继承性、多态性)声明创建类和对象的方法
7.1理解面向对象程序设计
对象是面向对象技术的核心。
对象是类的实例化,对象分为静态特征和动态特征两种。静态特征指对象的外观、性质、属性等。动态特征指对象具有的功能行为等。
人们将对象的静态特征抽象为属性,用数据来描述,在python中称之为变量。
将对象的动态特征抽象为行为,用一组代码来表示,完成对数据的操作,在python中称之为方法
一个对象由一组属性和一系列对属性进行操作的方法构成。
在python中,包含内置对象和自定义对象。
面向对象方法(object-oriented method)是一种把面向对象的思想应用于软件开发过程中指导开发活动的系统方法。
对象是由数据和容许的操作组成的封装体,与客观实体有着直接对应的关系。
一个对象类定义了具有相似性质的一组对象,继承性是对具有层次关系的类的属性和操作进行共享的一种方式。
封装性:数据仅能通过一组接口函数来存取,经过封装的数据能够确保信息的隐秘性。
继承性:通过继承的特性,衍生类继承了其基础类的成员变量与类方法。衍生类也叫做次类或子类,基础类叫做父类。
多态性:多态允许一个函数有多种不同的接口。依照调用函数时使用的参数,类指导使用哪一种接口。python使用动态类型与后期绑定实现多态功能。
将具有相同属性及相同行为的一组对象称为类。类是由使用封装的数据及操作这些数据的接口函数组成的一群对象的集合。创建对象时所使用的模板。
7.2类的定义
python使用关键字class来定义类。
语法格式:
class <Classname>:
‘类的帮助信息’
class_suite #类体
7.3类的构造方法和内置属性
7.4类实例
类实例是一个python对象,它是使用类所创建的对象。
只需要指定变量与类名称即可。
例如: f是一个类实例变量,注意类名称之后须加上小括号。
init要两个下划线
这个类的构造方法中,设置name,city与price的默认值都是none
:类实例内的属性是以字典对象的方式存储的。_dict_属性为该字典对象的值。obj._ _dict_ _ _ _class_ _属性返回创建此类实例所用的类名称。obj._ _class_ _:
7.5类的内置方法(开头结尾都是双下划线字符)
7.6重载运算符
重载运算符 |
函数 |
说明 |
_add_(a,b) |
add(a,b) |
返回a+b,a与b是数字 |
_sub_(a,b) |
sub(a,b) |
返回a-b |
_mul_(a,b) |
mul(a,b) |
返回a*b |
_mod_(a,b) |
mod(a,b) |
返回a%b |
_neg_(a) |
neg(a) |
返回-a |
_pos_(a) |
pos(a) |
返回+a |
_abs_(a) |
abs(a) |
返回a的绝对值 |
_inv_(a) |
inv(a) |
返回a的二进制码的相反是。如果原来位是1,那么其结果为0 |
_invert_(a) |
invert(a) |
与inv(a)相同 |
_lshift_(a,b) |
lshift(a,b) |
返回a左移b位的值 |
_rshift_(a,b) |
rshift(a,b) |
返回a右移b位的值 |
7.7类的继承
所谓类的继承,就是新类继承旧类的属性与方法,这种行为成为派生子类。
继承的新类成为派生类,被继承的旧类成为基类。
当用户创建派生类后,就可以在派生类内新增或改写基类的任何方法。
一个衍生类可以同时继承自多个基类,多个基类之间用逗号(,)隔开。
基类
创建Student类的派生类
派生类的构造方法必须调用基础类的构造方法,并使用完整的基类名称。
Student.__init__(self,name,sex,phone)中的self参数,用来告诉基类现在调用的是哪一个派生类。
当用户在类内编写函数时,要记得类函数名称空间的搜索顺序是:类的实例➡类➡基类。
下面定义三个类:ABC。B继承自A,C继承自B。ABC三个类都有一个相同名称的函数—printName()
类的多继承
python同样有限地支持多继承形式
7.8类的多态
类的多态指的是:类可以有多个名称相同,参数类型却不同的函数。
C++中将多态成为方法重载,允许类内有多个名称相同,参数却不同的函数存在。python却不允许这么做,如果用户在python的类内声明多个名称相同,参数却不同的函数,那么python会使用类内最后一个声明的函数。
上面示例中,调用myClass类中的handle函数时,python会使用有三个参数的函数handle(self,x,y,z)。因此当只提供一个参数时会报错。
解决方法如下,利用handle()函数的参数数目,来决定调用类中的哪一个函数
7.9类的封装
所谓类的封装,就是指类将其属性(变量与方法)封装在该类中,只有该类中的成员才可以使用该类中的其他成员。这种被封装的变量与方法,成为该类的私有变量与私有方法。
如果属性名称的第一个字符是单下划线,那么该属性视为类的内部变量,外面的变量不可以引用该属性。
如果属性名称的前两个字符都是单下划线,那么在编译时属性名称attributeName会被改成_className_attributeName,className是该类的名称。由于属性名称之前加上了类的名称,因此与类中原有的属性名称有差异。
7.10python的垃圾回收机制
python使用引用计数这一简单技术来跟踪和回收垃圾。在python内部有一个跟踪变量,记录着所用使用中的对象各有多少引用,称为一个引用计数器。
当对象被创建时,就同时创建一个引用计数,当这个对象不再被需要,其引用技术变为0时,就被垃圾回收。解释器在适当的时机将垃圾对象占用的内存回收。
7.11面向对象中常用的技术术语及其含义
- 类:用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或实例变量用于处理类及其实例对象的相关数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,那么可以对其进行改写,这个过程叫方法的覆盖,也称为方法的重写。
- 实例变量:定义在方法中的变量只作用于当前实例的类。
- 继承:即一个派生类继承基类的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
程序调试和异常处理
8.1什么是异常
bug
8.2常见的错误和异常
- 缺少冒号引起错误
- 赋值运算符=与比较运算符==
- 代码结构的缩进错误
- 修改元组和字符串的值是错误
- 连接字符串和非字符串
- 字符串首尾忘记加冒号
- 变量或函数名拼写错误
- 引用超过列表的最大索引值
- 使用关键字作为变量名
- 变量没有初始值时使用增值操作符
- 误用自增++和自减--操作符
- 忘记为方法的第一个参数添加self参数
8.3熟悉内置异常
8.4使用try···except语句处理异常
语法格式:
try:
<语句>
except [ < 异常的名称 > [ , <异常类的实例变量名称>] ]
<异常的处理语句>
[else:
<没有异常产生时的处理语句 > ]
中括号内的语句 [ ] 表示是可以省略的。使用try····except语句的原理如下:
- 执行try子句,在关键字try和关键字except之间的语句。
- 如果没有异常发生,就忽略except语句,try子句执行后结束。
- 如果执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果二厂的类型和except之后的名称相符,那么对应的except子句将被执行。
- 如果一个异常没有与任何的except匹配,那么这个异常将会传递到上层的try中。
8.5全捕捉
下面使用一个expect语句处理所有异常
8.6异常中的else
下面使用else语句处理没有异常时的情况。注意:使用else语句时一定要有except语句。
没有异常时会执行else语句
8.7异常中的pass
用户可以在except语句内使用pass语句来忽略所发生的异常。
可见sm的值时可转换的元素100,200的和。上述代码中的int()函数将字符串转换为整数。当int()函数无法将字符串转换为整数时,就会输出ValueError异常,在except语句中使用pass语句可以忽略所发生的ValueError异常。
8.8异常类的实例
每当有一个异常发生,该异常类就会创建一个实例。每一个异常类实例都有一个args属性。srgs属性是一个元组格式,这个元组格式可能只包含错误信息的字符串(1-tuple),也可能包含连个以上的元素。
在except语句的右方加一个inst变量,它是一个异常类实例。当IndexError异常发生时,inst实例就会被创建。inst实例的args属性值是一个元组,输出该元组的第一个字符串就是IndexError的错误信息:list index out of range。
异常类实例的args属性可能包含两个以上的元素。
下面的示例会输出File Not FoundError的异常,args属性的tuple格式是“错误号码,错误信息字符串,[文件名称]”,文件名称有可能不出现。
下面的示例会输出SyntaxError的异常,args属性的元组格式是“错误信息字符串,(文件名称,行号,行内偏移值,文字)”
使用下面的方式,可以将python解释器提供的错误信息字符串输出。
8.9清楚异常
try...finally语句可以当作清除异常使用,不管try语句内是否运行失败,finally语句一定会被运行。注意:except和finally语句不能放在一起使用。
8.10抛出异常
当遇到异常情况,用户可通过抛出异常做相应地处理.
python使用raise语句抛出一个指定的异常。
用户可以通过输入SystemExit异常强制结束python解释器的运行。
break语句可以离开最内层的循环,raise语句可以离开嵌套循环。
8.11自定义异常
8.12程序调试
语法:
assert < 测试码 > [ , 参数 ]
测试码是一段返回True或False的程序代码。若测试码返回True,则继续运行后面的程序代码;若测试码返回False,assert语句则会输出一个AssertionError异常,并输出assert语句的 [ 参数 ] 作为错误信息字符串。
python解释器有一个内置变量__debug__,在正常情况下值为True
下面的示例检测函数的参数类型是否是字符串,如果函数的参数类型不是字符串,就输出一个AssertionError异常。
模块与类库
当一个程序比较简单时,将程序代码写入一个文件即可。随着项目复杂度的增加,需要将代码写入不同的文件中,这里不同的文件即不同的模块。
利用模块方式组织代码便于管理和维护项目代码。
9.1什么是模块?
标签: 1004tk2系列圆形连接器