Python概述
Python的特点:1简单 2易学 3免费开源 4高层语言 5可移植性 6解释性
7面向对象 8可扩展性 9可嵌入性 10丰富的库
执行脚本文件
运行python程序的两种方式:交互式、文件式
Python行和缩进
- 一般情况下逻辑行行首不应该出现空白
- If语句的缩进方法
- While循环的缩进方法
标识符
1标识符由字母、下划线和数字组成,且数字不能开头
2 python区分大小写
3 python标识符不能用关键字
关键字
关键字是已经使用的,不允许重复定义的标识符,python3中共有35个关键字
数据类型
数字类型:整形、浮点型、布尔类型、复数类型
组合类型:字符串、列表、元组、字典
整形(int):1 2 3 -234 false true
浮点型(float):3.1415926 4.2E-10
复数类型(complex):3.12+1.2.3j
布尔类型(bool):true false
字符串(str):是由单引号、双引号、三引号包裹、有序的字符集合
列表(list):是由多个元素的集合,它可以保存任意数量、任意类型的元素,且可以被修改。[1,2,’hello’]
元组(tuple):与列表作用相似,但不能被修改(1,2,’hello’)
集合(set):与列表,元组类似。不同的是集合中的元素无序且唯一
{1,3,’apple’,’read’}
字典:字典中的元素是“键(key):值(value)”形式的键值对,键不能重复。{“name”:”zhangxin”,”age”:18}
变量的输入和输出
print(*objects,sep=’ ’,end=’\n’,file=sys.stdout)
objects:表示输出的对象。输出多个对象之间需要用分隔符分隔
sep:用于设定分隔符,默认使用空格作为分隔。
end:用于设定输出以什么结尾,默认值为换行符\n。
file:表示数据输出的文件对象
数字类型
整数类型(int):表示整数,常用的计数方式有4种
二进制(以“0B”或“0b”开头) 0b101
八进制(以数字“0o”或“0O”开头) 0o5
十进制 1414
十六进制(以“0x”或“0X”开头) 0x131231
转换进制的函数:
bin(x) 将x转换成二进制数据
oct(x) 转换成八进制
int(x) 转换成十进制
hex(x) 转换成十六进制
浮点型(float)3.14 0.777较大的可以用科学计数法
-3.14e2 #-314
3.14e-3 #0.00314
Python浮点型取值范围-1.8e308-1.8e308,超过就是无穷大(inf)或无穷小(-inf)
复数类型
Complex_noe=1+2j(实部为1,虚部为2)
布尔类型
True对应1
False对应整数0
数据符合以下任意条件,其布尔值均为false
1值为none或false的常量
2任何数字类型的0:0、0.0、0j
空组合数据类型:“”、()、[ ]、set()、{ }
数字类型转换
int(x[,base]) 将x转换为一个整数数据
float(x) 转换为浮点型数据
complex 转换为复数类型
运算符
算数运算符、赋值运算符、比较运算符、逻辑运算符、成员运算符
算术运算符
在混合运算时,Python会强制将数值的类型进行临时类型转换
- 整型与浮点型进行混合运算时,将整型转化为浮点型。
- 其他类型与复数运算时,将其他类型转换为复数类型。
赋值运算符
赋值运算符允许同时为多个变量赋值
x = y = z = 1 # 变量x、y、z均赋值为1
逻辑运算符
Or and not
成员运算符
in:如果指定元素在序列中返回True,否则返回False。
not in:如果指定元素不在序列中返回True,否则返回False
位运算符
用于二进制位进行逻辑运算,操作数必须为整数
按位与(&)二进制位均为1,结果就为1
按位或(|)二进制位中有一个1就为1
按位异或(^)有一个为1,另一个为0时结果为1
按位取反(~)0取1,1取0
三、流程控制
If语句
If-else
If-elif-else
If嵌套
while语句
While 条件表达式:
代码块
For 临时变量 in 目标对象:
代码块
循环嵌套
跳转语句
Break语句用于结束循环
Continue语句用于满足条件的情况下跳出本次循环
四、字符串
字符串:是一种用来表示文本的数据类型,它是由符合或者数值组成的一个连续序列。
Python支持单引号、双引号、三引号。单引号,双引号定义单行字符串。三引号定义多行字符串。
转义字符:
\b退格
\n换行
\v纵向制表
\t横向制表
\r回车
格式化字符串
使用format()方法格式化字符串
使用f-string格式化字符串
字符串的查找与替换
find()
替换
Replace()
字符串的分隔和拼接
分割
拼接
join()
删除字符串的指定字符
Strip()
Lstrip()
Rstrip()
大小写转换
字符串对齐
五、组合数据类型
Python中常用的序列类型有字符串、列表、元组
集合:确定性、互异性、无序性
映射类型:字典(dict)
列表
[ ] lost() 创建
Isinstance()可以判断是否为可迭代对象,返回ture表示为可迭代对象
列表元素、索引、切片 访问。或在循环中依次访问
添加列表元素
Append()、extend()、insert()
元素排列
Sort()、reverse()、sorted()
删除列表元素
Del语句、remove()、pop()、clear()
列表推导式
是符合语法规则的 复合表达式。根据已有的列表构建 满足特定需求的列表
[exp for x in list]
元组()
当使用圆括号“()”创建元组时,如果元组中只包含一个元素,那么需要在该元素的后面添加逗号,从而保证Python解释器能够识别其为元组类型。
元组支持 索引、切片 方式访问元组的元素
元组支持索引和切片
集合set()本身是可变类型,但里面的元素是不可变类型
{ }不能创空集合(不包含元素的{ }创建的是字典变量,空集合只能用set()函数创建
集合中的元素可以动态增加或删除
集合推导式外侧为大括号“{ }”
{exp for x in set if cond}
字典
字典的表现形式为一组包含在大括号“{}”中的键值对,每个键值对为一个字典元素,每个元素通过逗号“,”分隔,每对键值通过“:”分隔,除了使用“{}”创建字典还可以使用内置函数dict创建字典。
字典的值可通过“键”或内置方法get()访问
字典的访问、
键、值和元素(键值对)、key()、values()、items()
元素的添加和修改
指定键赋值或update()添加或修改元素
修改元素的操作和添加相同
字典元素的删除
字典推导式
组合数据类型与运算
+、*、in、 not in、
字符串、列表和元组使用 “+”运算符,会对数据进行拼接
使用“*“,会对数据进行整数倍拼接
“in” “not in”运算符称为成员运算符,用于判断某个元素是否属于某个变量
六、函数
函数是组织好的、实现单一功能或相关联功能的代码段。我们可以将函数视为一段有名字的代码,这类代码可以在需要的地方以“函数名()”的形式调用。
函数式编程的优点
- 将程序模块化,既减少了冗余代码,又让程序结构更为清晰
- 提高开发人员的编程效率
- 方便后期的维护与扩展
End=:末尾不换行加空格
定义函数
使用关键字def来定义函数
调用函数
函数在定义完成后不会立刻执行,直到被程序调用时才会执行。
函数的嵌套定义
函数在定义时可以在其内部嵌套定义另外一个函数,此时嵌套的函数称为外层函数,被嵌套的函数称为内层函数。
函数参数的传递
我们通常将定义函数时设置的参数称为形式参数(简称为形参),将调用函数时传入的参数称为实际参数(简称为实参)。函数的参数传递是指将实际参数传递给形式参数的过程。
函数参数的传递可以分为位置参数传递、关键字参数传递、默认参数传递、参数的打包与解包以及混合传递。
位置参数的传递
函数在被调用时会将实参按照相应的位置依次传递给形参,也就是说将第一个实参传递给第一个形参,将第二个实参传递给第二个形参,以此类推。
关键字参数的传递
关键字参数的传递是通过“形参=实参”的格式将实参与形参相关联,将实参按照相应的关键字传递给形参。
使用符号“/”来限定部分形参只接收采用位置传递方式的实参。
函数在定义时可以指定形参的默认值,如此在被调用时可以选择是否给带有默认值的形参传值,若没有给带有默认值的形参传值,则直接使用该形参的默认值。
参数的打包与解包
如果函数在定义时无法确定需要接收多少个数据,那么可以在定义函数时为形参添加“*”或“**”:
“*” —— 接收以元组形式打包的多个值
“**”—— 接收以字典形式打包的多个值
打包———“*”
打包————“**”
- 虽然函数中添加“*”或“**”的形参可以是符合命名规范的任意名称,但这里建议使用*args和**kwargs。
- 若函数没有接收到任何数据,参数*args和**kwargs为空,即它们为空元组或空字典。
解包
实参是元组 → 可以使用“*”拆分成多个值 → 按位置参数传给形参
实参是字典 → 可以使用“**” 拆分成多个键值对 → 按关键字参数传给形参
混合传递
前面介绍的参数传递的方式在定义函数或调用函数时可以混合使用,但是需要遵循一定的规则,具体规则如下。
在定义函数时
带有默认值的参数必须位于普通参数之后。
带有“*”标识的参数必须位于带有默认值的参数之后。
带有“**”标识的参数必须位于带有“*”标识的参数之后。
函数的返回值
函数中的return语句会在函数结束时将数据返回给程序,同时让程序回到函数被调用的位置继续执行。
如果函数使用return语句返回了多个值,那么这些值将被保存到元组中。
、
变量作用率
变量并非在程序的任意位置都可以被访问,其访问权限取决于变量定义的位置,其所处的有效范围称为变量的作用域。
局部变量和全局变量
根据作用域的不同,变量可以划分为局部变量和全局变量。
局部变量:
- 函数内部定义的变量,只能在函数内部被使用
- 函数执行结束之后局部变量会被释放,此时无法再进行访问。
不同函数内部可以包含同名的局部变量,这些局部变量的关系类似于不同目录下同名文件的关系,它们相互独立,互不影响。
全局变量:
全局变量可以在整个程序的范围内起作用,它不会受到函数范围的影响。
全局变量在函数内部只能被访问,而无法直接修改。
这是因为函数内部的变量number视为局部变量,而在执行“number+=1”这行代码之前并未声明过局部变量number。
函数内部只能访问全局变量,而无法直接修改全局变量
LEGB是程序中搜索变量时所遵循的原则,该原则中的每个字母指代一种作用域,
Python在搜索变量时会按照“L-E-G-B ”这个顺序依次在这四种区域中搜索变量:若搜索到变量则终止搜索,使用搜索到的变量;若搜索完L、E、G、B这四种区域仍无法找到变量,程序将抛出异常。
global和nonlocal关键字
函数内部无法直接修改全局变量或在嵌套函数的外层函数声明的变量,但可以使用global或nonlocal关键字修饰变量以间接修改以上变量。
使用global关键字可以将局部变量声明为全局变量,其使用方法如下:
global 变量
使用nonlocal关键字可以在局部作用域中修改嵌套作用域中定义的变量,其使用方法如下:
nonlocal 变量
递归函数
函数在定义时可以直接或间接地调用其他函数。若函数内部调用了自身,则这个函数被称为递归函数。
递归函数在定义时需要满足两个基本条件:一个是递归公式,另一个是边界条件。其中:
- 递归公式是求解原问题或相似的子问题的结构;
- 边界条件是最小化的子问题,也是递归终止的条件。
递归函数的执行可以分为以下两个阶段:
1.递推:递归本次的执行都基于上一次的运算结果。
2.回溯:遇到终止条件时,则沿着递推往回一级一级地把值返回来。
匿名函数:
匿名函数是一类无需定义标识符的函数,它与普通函数一样可以在程序的任何位置使用。Python中使用lambda关键字定义匿名函数,它的语法格式如下:
lambda <形式参数列表> :<表达式>
匿名函数与普通函数的主要区别如下:
- 普通函数在定义时有名称,而匿名函数没有名称;
- 普通函数的函数体中包含有多条语句,而匿名函数的函数体只能是一个表达式;
- 普通函数可以实现比较复杂的功能,而匿名函数可实现的功能比较简单;
- 普通函数能被其他程序使用,而匿名函数不能被其他程序使用。
定义好的匿名函数不能直接使用,最好使用一个变量保存它,以便后期可以随时使用这个函数。
七、文件与数据格式化
文件概述
文件标识
- 文件标识的意义:找到计算机中唯一确定的文件。
- 文件标识的组成:文件路径、文件名主干、文件扩展名。
文件类型
根据数据的逻辑存储结构,人们将计算机中的文件分为文本文件和二进制文件。
- 文本文件:专门存储文本字符数据。
- 二进制文件:不能直接使用文字处理程序正常读写,必须先了解其结构和序列化规则,再设计正确的反序列化规则,才能正确获取文件信息。
- 二进制文件和文本文件这两种类型的划分基于数据逻辑存储结构而非物理存储结构,计算机中的数据在物理层面都以二进制形式存储。
标准文件
Python的sys模块中定义了3个标准文件,分别为:
- stdin(标准输入文件)。标准输入文件对应输入设备,如键盘。
- stdout(标准输出文件)。
- stderr(标准错误文件)。标准输出文件和标准错误文件对应输出设备,如显示器。
在解释器中导入sys模块后,便可对标准文件进行操作。
文件的基本操作
文件的打开、关闭与读写是文件的基础操作,任何更复杂的文件操作都离不开这些操作。
文件的打开
关闭文件
Python可通过close()方法关闭文件,也可以使用with语句实现文件的自动关闭。
- close方法
close()方法是文件对象的内置方法
- with
为什么要及时关闭文件
1计算机中可打开的文件数量是有限
2打开的文件占用系统资源
3若程序因异常关闭,可能产生数据丢失
文件读写
read()、readline()、readlines()方法和写文件的write()、writelines()方法
读取文件read()
Readline()
readlines()方法可以一次读取文件中的所有数据,若读取成功,该方法会返回一个列表,文件中的每一行对应列表中的一个元素。
readlines(hint=-1)
- 参数hint的单位为字节,它用于控制要读取的行数
- 如果行中数据的总大小超出了hint字节,readlines()不会再读取更多的行。
read()(参数缺省时)和readlines()方法都可一次读取文件中的全部数据
但因为计算机的内存是有限的,若文件较大,read()和readlines()的一次读取便会耗尽系统内存,所以这两种操作都不够安全。
为了保证读取安全,通常多次调用read()方法,每次读取size字节的数据。
写文件
write(data)
以上格式中的参数data表示要写入文件的数据,若数据写入成功,write()方法会返回本次写入文件的数据的字节数。
writelines(lines)
- 以上格式中的参数lines表示要写入文件中的数据,该参数可以是一个字符串或者字符串列表。
- 若写入文件的数据在文件中需要换行,需要显式指定换行符。
不同编码方式下字符与字节的对应关系不同
文件读写定位
read()方法第1次读取了2个字符,第2次从第3个字符“e”开始读取了剩余字符。
- 在文件的一次打开与关闭之间进行的读写操作是连续的,程序总是从上次读写的位置继续向下进行读写操作。
- 每个文件对象都有一个称为“文件读写位置”的属性,该属性会记录当前读写的位置。
- 文件读写位置默认为0,即在文件首部。
tell()。获取文件当前的读写位置。
seek()。控制文件的读写位置。
Tell()
Seek()
该方法可控制文件的读写位置,实现文件的随机读写。
若打开的是文本文件,那么seek()方法只允许相对于文件开头移动文件位置,若在参数from值为1、2的情况下对文本文件进行位移操作,将会产生错误。
若要相对当前读写位置或文件末尾进行位移操作,需以二进制形式打开文件。
文件与目录管理
os模块中定义了与文件操作相关的函数,利用这些函数可以实现删除文件、文件重命名、创建/删除目录、获取当前目录、更改默认目录与获取目录列表等操作。
基于维度的数据分类
数据可分为一维数据、二维数据和多维数据。
一二维数据的存储与读写
数据存储
一维数据呈线性排列,一般用特殊字符分隔,例如:
- 使用空格分隔:成都 杭州 重庆 武汉 苏州 西安 天津
- 使用逗号分隔:成都,杭州,重庆,武汉,苏州,西安,天津
- 使用&分隔:成都&杭州&重庆&武汉&苏州&西安&天津
一维数据的存储需要注意以下几点:
- 同一文件或同组文件一般使用同一分隔符分隔。
- 分隔数据的分隔符不应出现在数据中。
- 分隔符为英文半角符号,一般不使用中文符号作为分隔符。
- 二维数据可视为多条一维数据的集合,当二维数据只有一个元素时,这个二维数据就是一维数据。
- CSV(Commae-Separeted Values,逗号分隔值)是国际上通用的一二维数据存储格式。
CSV格式规范:
- 以纯文本形式存储表格数据
- 文件的每一行对应表格中的一条数据记录
- 每条记录由一个或多个字段组成
字段之间使用逗号(英文、半角)分隔
数据存储
数据读写
- Windows平台中CSV文件的后缀名为.csv,可通过Office Excel或记事本打开
- Python在程序中读取.csv文件后会以二维列表形式存储其中内容
多维数据的格式化
为了直观地表示多维数据,也为了便于组织和操作,三维及以上的多维数据统一采用键值对的形式进行格式化。
网络平台上传递的数据大多是高维数据,JSON是网络中常见的高维数据格式。
- 数据存储在键值对(key:value)中,例如“姓名”: “张华”。
- 数据的字段由逗号分隔,例如“姓名”: “张华”, “语文”: “116”。
- 一个花括号保存一个JSON对象,例如{“姓名”: “张华”, “语文”: “116”}。
- 一个方括号保存一个数组,例如[{“姓名”: “张华”, “语文”: “116”}]。
JSON模块——json
利用json模块的dumps()函数和loads()函数可以实现Python对象和JSON数据之间的转换
Python对象与JSON数据转化时的类型对照表
dumps()函数
loads()函数