一、变量和数据类型
1.二进制与字符编码
注:不管中文、英文,计算机当中都叫字符,一个字符对应一个整数
2.标识符和保留字
1.)保留字
3.变量定义与使用
1.)变量是内存中一个带标签的盒子
2.)变量的组成
3.)变量多次赋值后,变量名会指向新的空间
4.)常见数据类型
(1)整数类型
(2)浮点类型
(3)布尔类型
(4)字符串类型
5.)数据类型转换
例如:
6.)注释
(1)中文编码声明格式注释:
#coding:gbk 修改编码格式
二、函数与运算符
4.输入函数input()和运算符
1.)input()函数的使用
2.)运算符的使用
(1.)幂运算符(**)
eg:print(2**3) #表示2的3次方
(2.)算术运算符
eg:print(-9//4) // =-3 一正一负的整数公式,向下取整
print(9%-4) // = -3 公式: 余数=被除数-除数*商
(3.)赋值运算符
a.链式赋值
(4.)比较运算符
比较运算符的结果为:bool类型
== 比较的是值,比较对象的标识是is
(5.)布尔运算符
(6.)位运算符
(7.)运算符的优先级
三、结构和函数
5.选择结构和对象布尔值
1.)if嵌套语句
if 条件表达式1:
if 内层条件表达式:
内存条件执行体1
else:
内存条件执行体2
else:
条件执行体
2.)if多分支结构
if 条件表达式1:
条件执行体1
elif 条件表达式2:
条件执行体2
elif 条件表达式N:
条件执行体N
[else:]
条件执行体N+1
3.)条件表达式
x if 判断条件 else y
运算规则:如果判断条件的布尔值为True,
条件表达式的返回值为x,
否则条件表达式的返回值为False
4.)pass语句
只是一个占位符
注:与哪些语句一起使用:
- if语句的条件执行体
- for-in语句的循环体
- 定义函数时的函数体
6.range()函数和循环结构
1.)range函数
2.)循环结构
while循环:
while 条件表达式:
条件执行体(循环体)
for-in循环:
for 自定义的变量 in 可迭代对象:
循环体
遍历对象必须为:可迭代对象,eg:字符串、序列、range()函数等
循环体内不需要访问自定义变量,可以将自定义变量替代为下划线
区别:
- If是判断一次,条件为True执行一行
- while是判断N+1次,条件为True执行N次
3.)else语句
例如:
注1:不可变序列与可变序列
- 不变可变序:字符串、元组
不变可变序列:没有增、删,改的操作 - 可变序列:列表、字典
可变序列:可以对序列执行增、删、改操作,对象地址不发生更改
四、列表
7.列表(类数组)-----可变序列
方法 | 列表的创建 |
---|---|
中括号 | lst=[‘大圣’,‘娟子姐’] |
内置函数list() | |
字典生成式 |
方法 | 增加操作 |
---|---|
append() | 在列表的末尾添加一个元素 |
extend() | 在列表的末尾至少添加一个元素 |
insert() | 在列表的任意位置添加一个元素 |
切片 | 在列表的任意位置添加至少一个元素 |
方法 | 删除操作 |
---|---|
remove() | 一次删除一个元素 |
重复元素只删除第一个; | |
元素不存在,抛出ValueError; | |
pop() | 删除一个指定索引位置上的元素; |
指定索引不存在,抛出IndexError; | |
不指定索引,删除列表中的最后一个元素; | |
clear() | 清空列表 |
切片 | 一次至少删除一个元素,将产生一个新的列表对象 |
del | 删除列表对象 |
方法 | 排序操作 |
---|---|
sort() | 排序在原列表基础上执行。默认按照从小到大的顺序进行排序,可以指定 reverse=True,进行降序 排序,eg:lst.sort(reverse=True) |
内置函数sorted() | 会产生新的列表对象,可以指定reverse=True,进行降序排序,原列表不发生改变。eg:new_lst=sorted(lst,reverse=True) |
方法 | 列表生成式 |
---|---|
[ i*i for i in range(1,10) ] | 列表生成式中通常包含自定义变量,eg:i |
- 列表存储多个对象的引用
(1.)创建方式:
(2.)列表的特点:
(3.)查询操作
切片操作:
列表名[start : stop : step]
判断是否存在:
(4.)删除操作
切片操作:不产生新的对象,只删除原对象内容
(5.)修改操作
- 为指定索引的元素赋予一个新值:
- 为指定的切片赋予一个新值
(6.)列表生成式
语法:
使用列表生成式,要求列表当中的元素都有一定的规则
五、字典
8.字典dict(Java中的map)-----可变序列
方法 | 字典创建 |
---|---|
花括号{} | scores={ ‘张三’ : 100 , ‘李四’ : 90 , ‘王五’ : 110 } |
内置函数dict() | dict( name=‘jack’ , age=20 ) |
字典生成式 |
方法 | 获取字典元素 |
---|---|
[] | 如果字典中不存在指定的key,抛出keyError异常,eg:scores[‘张三’] |
get() | 如果字典中不存在指定的key,并不会抛出keyError异常而是返回None,可通过参数设置默认的value,以便指定的key不存在时返回,eg:scores.get(‘张三’) |
方法 | key的判断 |
---|---|
in | 指定的key在字典中存在返回True,eg:‘张三’ in scores |
not in | 指定的key在字典中不存在返回True,eg:‘wangwu’ not in scores |
方法 | 元素的删除 |
---|---|
del scores[‘张三’] | 删除指定的键值对 |
clear() | 清空字典的元素 |
方法 | 元素的新增 |
---|---|
scores[‘jack’]=90 | 同时也可以修改 |
方法 | 获取字典视图 |
---|---|
key() | 获取字典中所有的key |
values() | 获取字典中所有的value |
items() | 获取字典中所有的key,value对 |
方法 | 字典生成式 |
---|---|
内置函数zip() | 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表 |
(1.)字典
以键值对的方式存储数据,字典是一个无序的序列
(2.)字典的原理
存数据时,采用哈希函数。要求放在字典中的key必须是不可变序列(eg:字符串,整数序列都是不可变,不可以执行增删改操作;可变序列:字典和列表,可增删改)
(3.)字典的特点
- 字典中的所有元素都是 key-value对,key不允许重复(如果出现则进行覆盖), value可以重复
- 字典中的元素是无序的,则不可指定位置进行插入
- 字典中的key必须是不可变对象
- 字典也可以根据需要动态地伸缩
- 字典会浪费较大的内存,是一种使用空间换时间的数据结构
(4.)字典生成式
语法:
//zip()函数,以少的那个为基准
items=['Fruits','Books','Others']
prices=[96,78,85]
lst=zip(items,prices)
print(list(lst))
字典生成式:
六、元组
9.元组-----不可变序列
方法 | 元组的创建 |
---|---|
小括号,可省略 | t=( ‘python’ , ‘hello’ , 90 ) |
内置函数tuple() | t=tuple( ( ‘python’ , ‘hello’ , 90 ) ) |
t=( 90, ) | 只包含一个元组的元素需要使用逗号和小括号(不能省),如果不加逗号,则认为数据时本身的数据类型 |
没有元组生成式 | 不可变序列 |
(1.)元组
注:为什么要将元组设计成不可变序列?
在多任务环境下,同时操作对象时不需要加锁,因此在程序中尽量使用不可变序列
(2.)元组的特点
元组中存储的是对象的引用:
- a)如果元组中对象本身不可变对象,则不能再引用其它对象
- b)如果元组中的对象是可变对象,则可变对象的引用不允许改变,但数据可以改变
注:不可以修改元组当中的元素引用,但可修改元组中元素的添加内容
七、集合
10.集合-----可变序列
- 集合是没有value的字典,底层结构采用哈希表,type:set
- 集合是和字典相同的底层数据结构,集合中的元素不能重复
方法 | 集合的创建 |
---|---|
{} | s={ ‘python’, ‘hello’, 90 } |
内置函数set() | set( [3,4,53,56] ) |
set()方法,不能直接{},否则出现type为dict,不是set | 空集合 |
集合生成式 | { i*i for i in range(1,10) } |
方法 | 集合的判断 |
---|---|
in | |
not in |
方法 | 集合的删除 |
---|---|
remove() | 一次删除一个指定元素,如果指定的元素不存在抛出KeyError |
discard() | 一次删除一个指定元素,如果指定的元素不存在不抛异常 |
pop(),没有参数不能指定参数 | 一次只删除一个任意元素 |
clear() | 清空集合 |
方法 | 集合的新增 |
---|---|
add() | 一次添加一个元素 |
update() | 至少添加一个元素 |
方法 | 集合之间的关系判断 |
---|---|
== 、!= | 判断两集合是否相等 |
issubset() | 一个集合是否为另一个集合的子集 |
issuperset() | 一个集合是否为另一个集合的超集 |
isdisjoint() | 两集合是否没有交集 |
方法 | 集合的数学操作 |
---|---|
intersection() 等价 & | 交集操作 |
&(python中为求交集) | 两集合是否有交集操作 |
union() 等价 竖线符号 | 并集操作 |
竖线符号(python中为求并集) | 两集合是否有交集操作 |
difference() 等价 - | 差集操作 |
-减号 | 两集合是否有差集操作 |
symmetric_difference() 等价 ^ | 对称差集操作 |
^(shift+6) | 两集合是否有对称差集操作 |
注2:列表、字典、元组、集合总结
八、字符串
11.字符串-----不可变序列
方法 | 查询 |
---|---|
index() | 查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出ValueError |
rindex() | 查找子串substr最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError |
find() | 查找子串substr第一次出现的位置,如果查找的子串不存在时,则返回-1 |
rfind() | 查找子串substr最后一次出现的位置,如果查找的子串不存在时,则返回-1 |
方法 | 大小写转换 |
---|---|
upper() | 把字符串中的所有字符都转成大写字母 |
lower() | 把字符串中的所有字符都转成小写字母 |
swapcase() | 把字符串中所有大写字母转成小写字母,把所有小写字母都转成大写字母 |
capitalize() | 把第一个字符转成大写,把其余字符转换成小写 |
title() | 把每个单词的第一个字符转换为大写,把每个单词的剩余字符转换为小写 |
方法 | 内容对齐 |
---|---|
center() | 居中对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格 ,如果设置宽度小于实际宽度,则返回原字符串 |
ljust() | 左对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格如果设置宽度小于实际宽度,则返回原字符串 |
rjust() | 右对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格如果设置宽度小于实际宽度,则返回原字符串 |
zfill() | 右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果指定的宽度小于等于字符串的长度,返回字符串本身 |
方法 | 字符串劈分 |
---|---|
split() | 从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表 |
以通过参数sep指定劈分字符进行劈分 | |
通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分 | |
rsplit() | 从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表 |
以通过参数sep指定劈分字符进行劈分 | |
通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分 |
方法 | 判断字符串操作 |
---|---|
![]() |
方法 | 字符串其他操作 |
---|---|
![]() |
(1.)字符串驻留机制
- 仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,
- Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量。
(2.)驻留机制的几种情况(交互模式下): - 字符串的长度为0或1时
- 符合标识符的字符串,(不符合标识符的字符串比较时,内容相同,但两块内存空间)
- 字符串只在编译时进行驻留,而非运行时
- [-5,256]之间的整数数字
注:a.) sys中的intern方法强制2个字符串指向同一个对象
b.) PyCharm对字符串进行了优化处理
c.) 字符串拼接时建议使用 str类型的join()方法,而非+ ,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比"+"效率高
(3.)比较操作
- 比较规则:
首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较 - 比较原理:
两上字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord()可以 得到指定字符的ordinal value。与内置函数ord对应的是内置函数chr(),调用内置函数chr时指定ordinal value可以得到其对应的字符
(4.)格式化字符串
占位符 | 格式化三种方式 |
---|---|
% | |
{ } | {0},{1}表示索引位置,使用format()方法 |
f-string | |
![]() | |
宽度和精度表示: | |
![]() | |
占位符方式:![]() | |
(5.)字符串的编码和解码 | |
a.)为什么需要字符串的编码转换![]() | |
b.)编码与解码的方式 |
- 编码:将字符串转换为二进制数据(bytes) ,采用string中的encode()方法,不同的编码格式决定它所占用的字节数
- 解码:将bytes类型的数据转换成字符串类型,采用byte的decode()方法。编码和解码采用的格式必须相同。
九、函数
12.函数应用
1.函数的创建:
def 函数名( [输入参数] ) :
函数体
[return xxx]
2.函数的调用:
函数名( [ 实际参数 ] )
(1.)参数传递
- 位置实参:
根据形参对应的位置进行实参传递
- 关键字实参:
根据形参名称进行实参传递
(2.)函数调用的参数传递内存分析图
(3.)函数返回值
- 函数返回多个值时,结果为元组
(4.)函数的参数定义
以及调用函数时如何传入可变参数和关键字参数的语法:
1.可变参数既可以直接传入:func(1, 2, 3),
又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));
2.关键字参数既可以直接传入:func(a=1, b=2),
又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。
- 默认值参数:(默认值参数必须指向不变对象)
函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参 - 可变参数:(仅仅在参数前面加一个 * 号,,参数numbers接收到的是一个tuple)
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
- 个数可变的位置参数-----只能有一个
定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
使用*定义个数可变的位置形参
结果为一个元组 - 个数可变的关键字形参------只能有一个
定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
使用定义个数可变的关键字形参**
结果为一个字典
注:在函数定义过程中,即有个数可变的关键字形参,也有个数可变的位置形参,要求:个数可变的位置形参,放在个数可变的关键字形参之前。
(5.)变量的作用域
- 局部变量
在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就会就成全局变量 - 全局变量
函数体外定义的变量,可作用于函数内外
(6.)递归函数
- 递归的调用过程
每递归调用一次函数,都会在栈内存分配一个栈帧,
每执行完一次函数,都会释放相应的空间
注:重复的过程使用列表
13.异常
(1.)异常处理机制
- try…except结构:
捕获异常的顺序按照先子类后父亲类的顺序,为了避免遗漏可能出现的异常,可以在最后增加BaseException
- try…except…else结构:
如果try块中没有抛出异常,则执行else块,如果try中抛出异常,则执行except块 - try…except…else…finally结构
finally块无论是否发生异常都会被执行,能常用来释放try块中申请的资源
(2.)常见的异常类型 - Python中变量是没有数据类型的
(3.)traceback模块 - 使用traceback模块打印异常信息
十、类和对象
14.类和对象
(1.)类的创建
class 类名:
类的内容
类的组成:类属性、实例方法(传的是实例的对象,self—默认参数)、静态方法@staticmethod、类方法(传的是cls,调用的时候不需要传入cls)
模板:
(2.)对象的创建
实例名 = 类名()
注1:类属性、类方法、静态方法
- 类属性:类中方法外的变量称为类属性,被该类的所有对象所共享
- 类方法:使用@classmethod修饰的方法,使用类名直接访问的方法
- 静态方法:使用@staticmethod修饰的方法,没有任何默认参数,使用类名直接访问的方法
(3.)
15.封装、继承、多态
(1.)封装
- 在Python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部被访问,前边使用两个“_”
(2.)继承
class 子类类名( 父类1 , 父类2 .....) :
pass
- 如果一个类没有继承任何类,则默认继承object
- Python支持多继承
- 定义子类时,必须在其构造函数中调用父类的构造函数
a.)方法的重写:
- 如果子类对继承自父类的某个属性 或方法不满意,可以在子类中对其 (方法体)进行重新编写
- 子类重写后的方法中可以通过super().xxx() 调用父类中被重写的 方法
b.)Obobject类:
- object类是所有类的父类,因此所有类都有object类的属性和方法。
- 内置函数**dir()**可以查看指定对象所有属性
- Object有一个__str__()方法,用于返 回一个对于“对象的描述-----对象的内存地址”,对应于内 置函数str()经常用于print()方法,帮 我们查看对象的信息,所以我们经常会对__str__()进行重写
c.)多重继承:
- 一个子类可以有多个“直接父类”,这样,就具备了“多个父类”的特点
- 通过类的特殊属性__mro__ 可以查看类的组织结构
(3.)多态
注:静态语言与动态语言(Python)
a.)静态语言实现多态的三个必要条件:
- 继承
- 方法重写
- 父类引用指向子类对象
b.)动态语言的多态:不需要关心对象是什么类型,只关心对象的行为。
(4.)特殊的方法和属性
(5.)深拷贝和浅拷贝
a.)浅拷贝:
- Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象。copy.copy()方法
b.)深拷贝
- 使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
16.模块和包
(1.)模块-----modules
- 在Python中一个扩展名为.py的文件就是一个模块
a.)自定义模块的导入:
法1: import 模块名称 [as 别名] #导入模块中的所有
法2: from 模块名称 import 函数/变量/类 #导入模块中的指定内容
b.)第三方模块:
安装: pip install 模块名
使用: import 模块名
c.)常用的内置模块:
d.)以主程序形式运行:
if __name__ = '__main__' :
pass
- 在每个模块的定义中都包括一个记录模块名称的变量__name__,程序可以检查该变量,以确定他们在哪个模块中执行。如果一个模块不是被导入到其它程序中执行,那么它可能在解释器的顶级模块中执行。顶级模块的__name__变量的值为__main__
(2.)包package
a.)包与目录(directory)的区别
- 包含__init__.py文件的目录称为包
- 目录里通常不包含__init__.py文件
b.)包的导入
import 包名.模块名
17.文件读写
(1.)常见的字符编码格式
- Python的解释器使用的是Unicode(内存)
- .py文件在磁盘上使用UTF-8存储(外存)
2.)文件的读写原理—IO操作
3.)文件的读写操作
- 语法规则:
- 内置函数open()方法创建文件对象
4.)常用的文件打开模式
按文件中数据的组织形式,文件分为以下两大类:
- 文本文件 :存储的是普通“字符”文本,默认为unicode字符集,可以使用记本事程序打开
- 二进制文件:把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开 ,举例:mp3音频文件,jpg图片 .doc文档等
5.)文件对象常用方法
6.)with语句(上下文管理器)
- with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的
7.)目录操作
- os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
- os模块与os.path模块用于对目录或文件进行操作
- OS模块操作目录相关函数:
- OS.path模块操作目录相关函数: