Python基础语法

笔记来源

北理——Python语言程序设计

本文内部图片大多来自课程课件,侵权请告知1979409875@qq.com

编译和解释

编译

将源代码一次性转换成目标代码的过程

这是图片

解释

将源代码逐条转换成目标代码同时逐条执行的过程(类似同声传译)

这是图片

程序的编写方法and思想

IPO

I:Input 程序的输入(文件,网络,控制台,交互界面,内部参数)

P: Proce 对于输入数据的处理,即算法,是一个程序的灵魂所在

O: Output 结果的输出(控制台,图形,网络,文件,内部参数)

IPO思想是编写程序的基本思想,根据用户的输入和所需的输出,进行主体程序的设计和编写,是最简单粗暴的思路。

代码复用

将代码看作一种可以重复使用,互相共享的“资源”。

代码抽象化:使用函数,对象等方法对代码赋予更高级别的定义

模块化设计

通过函数或对象封装将程序划分为模块及模块间的表达,然后通过各个模块之间的相互配合完成主任务

程序部分间的关系分为紧耦合和松耦合两种,模块内部应紧耦合,模块之间应松耦合

python开发环境

python基本开发环境IDLE

python官方提供,适用于小规模程序开发

优点:轻量级,使用灵活;功能丰富,拥有众多标准库以及第三方库可供使用。

下载地址

python高级开发环境VSCode

配置该环境时要先布局IDLE,后下载VSCode下载地址

python的计算生态

标准库+第三方库

标准库:随解释器直接安装到操作系统中的功能模块

第三方库:需要经过安装才能使用的功能模块

两种编程方式

交互式:对每个输入语句立即运行结果

文件式:代码在py文件中编写完成后一次性进行运行,是编程的主要方式

程序的格式框架

缩进:一行代码开始前的空白部分,用于指出程序的层次结构;是语法的一部分,缩进错误程序也会报错;一个程序中的缩进一般一致,统一为1个Tab或4个空格

注释:不被程序执行的辅助性文字,用于提高代码的可读性;若单行则以#开头,若多行则以’‘‘开头和结尾

命名与保留字

变量:程序中用于保存和表示数据的占位符号

命名:用=将变量和标识符关联起来的过程,命名要遵循许多规则,如:可为大小写字母,数字,下划线和中文字符或其组合;大小写敏感;首字符不能为数字;不与保留字相同

保留字:被编程语言内部定义并保留使用的标识符。python中有35个保留字,它们分别为以下图片中所示

python中的保留字

库引用

使用import保留字完成引用

基本用法:import<库名>

<库名>.<函数名>(<函数参数>)

拓展用法

1.from <库名> import <函数名>

2.from <库名> import*

<函数名>(<函数参数>)

此种方法会出现函数重名的问题

3.import <库名> as <库别名>

<库别名>.<函数名>(<函数参数>)

此种方法适用于外部库的原库名较为繁琐的情况,可以达到提高编程效率的效果

数字类型

整数类型

可正可负,无取值范围的限制

拥有多种进制;其中二进制以0b或0B开头,八进制以0o或0O开头,十六进制以0x或0X开头

int(x) 可将x转化为整数类型,同时直接舍弃小数部分

浮点数类型

它与数学中实数的概念相同

浮点数的取值范围与小数精度都存在限制。取值范围数量级约为±10的307次方,而精度数量级为10的-16次方。

float(x) 可将x转化为浮点数类型

由于浮点数类型以53位二进制表示小数部分,故两个浮点数运算过程中存在不确定尾数,导致结果与真实值不同,可以用round()函数进行四舍五入

浮点数类型可以采用科学计数法来表示,使用e或E来作为幂的符号,以10为基数

1
<a>e<b> #表示 a*10的b次方

复数类型

与数学中复数的概念一致

eg. z = 1.23e-4 + 5.6e + 89j

complex(x) 可将x转化为复数,增加虚数部分

1
2
z.real() #获得实部
z.imag() #获得虚部

数值运算

数值运算操作符

1
2
3
4
5
6
7
8
9
x + y 
x - y
x * y
x / y #x与y的商,结果是浮点数
x // y #x与y的整数商,结果是整数
+ x #表示x本身
- x #表示x的相反数
x % y #表示x除以y后的余数
x ** y #表示幂运算,与pow()函数效果相似

二元操作增强赋值操作符

操作符

数值运算函数

1
2
3
4
5
6
pow(x, y[, z]) #计算x的y次方,而后再将结果与z取余,参数z可省略
round(x, d) #将x四舍五入至小数点后d位,d可省略,其默认值为0
abs(x) #取x的绝对值
divmod(x, y) #同时输出 x//y 与 x%y 的结果
max(......) #返回括号中数值的最大值
min(......) #返回括号中数值的最小值

数字类型关系

不同数字类型间可以进行混合运算,生成“最宽”的类型

整数 < 浮点数 < 复数

字符串类型

由0个或多个字符组成的有序字符序列,在最外围被一对单引号或双引号包裹

由一对单引号或双引号只可表示单行字符串,而由一对三单引号或三双引号可以表示多行字符串

字符串中每一个元素的位置有两种序号表示,分别为正向递增序列(从左侧起由0开始定位)和反向递减序列(从右侧起由-1开始定位)

字符串的使用

索引:返回字符串中单个字符 <字符串>[M]

切片:返回字符串中一段字符子串 <字符串>[M:N:K](其中K表示步长,K值为-1时表示对字符串进行逆序输出)

转义符(\)

转义符的使用可以使特定字符失去原来的特殊功能,而表达其字符的本意

转义符还可以与一些字母进行搭配使用,从而表达一些不可打印的含义,如:"\b"表示回退,"\n"表示换行,即光标移动到下行首,"\r"表示回车,即光标移动到本行首

字符串操作符

字符串操作

字符串处理函数

1
2
3
4
5
6
len(x) #返回字符串x的长度
str(x) #将任意类型的x转换为字符串形式
hex(x) #表示整数x的十六进制小写形式字符串
oct(x) #表示整数x的八进制小写形式字符串
chr(x) #返回Unicode编码x所对应的字符
ord(x) #返回字符x所对应的Unicode编码

字符串处理方法

1 2 3

字符串类型的格式化

字符串格式化用到.format()方法

<模板字符串>.format(<逗号分隔的参数>)

格式化1 格式化2 格式化3

组合数据类型

集合类型

集合定义

集合是多个元素的无序组合

与数学中的集合概念一致,集合中的元素存在无序性,互异性,确定性

因为要保证集合中的每个元素都唯一确定,故集合中的元素不可更改

集合用大括号{}来表示,集合内的元素用逗号来分隔

建立集合类型可用{}或set()函数,但建立空集合时,必须使用set()函数

集合操作符

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 6个操作符
S | T #集合S与集合T取并集
S & T #集合S与集合T取交集
S - T #集合S去掉与集合T所拥有的相同元素后形成的集合
S ^ T #集合S与集合T的并集减去交集后的集合
S < T / S > T #用于判断S和T的子集或包含关系,返回值为True或False
# 4个增强操作符
S |= T
S -= T
S &= T
S ^= T

集合的处理方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
S.add(x) #若x不在S中,将x增加到S中
S.discard(x) #移除S中元素x,若x not in S,不报错
S.remove(x) #移除S中元素x,若x not in S,产生KeyError异常
S.clear() #移除S中所有元素
S.pop() #随机取出S中的一个元素,若S为空则产生KeyError异常
S.copy() #产生集合S的一个副本
len(S) #返回S的元素个数
x in S #判断S中元素x是否存在
x not in S #判断x是否不存在于S中
set(x) #将其他类型变量x转变为集合类型

集合类型应用

包含关系的比较,数据去重(由于集合中的元素具有互异性)

序列类型

序列定义

序列类型是具有先后关系的一组元素,元素间由序号引导,通过下标访问特定的元素

序列类型中的下标有两种,分别为正向递增序号(从0开始)和反向递减序号(从-1开始)

序列中的元素类型可以不相同,如字符串类型和整数类型可以同时存在于一个序列中

序列处理函数和方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#操作符
x in s
x not in s
s + t #连接两个序列s和t
s * n/n * s #将序列s复制n次
s[i] #索引,返回s中的第i个元素
s[i:j]/s[i:j:k] #切片,返回s中第i到j以k为步长的元素子序列
#函数和方法
len(s) #返回s的元素个数
min(s) #返回s中的最小元素,s中的元素需要可比较
max(s)
s.index(x)/s.index(x, i, j) #返回序列s从第i位到第j位中x第一次出现的位置
s.count(x) #返回序列s中x的出现次数

元组类型

元组定义

元组类型是序列类型的一种扩展,和集合类似,一旦创建后就不能被修改

使用小括号() 或 tuple()函数来创建,元素之间要用逗号分隔开来

元组类型的操作与序列类型的操作基本相同

若不希望数据被改变,可将数据转化为元组类型

列表类型

列表定义

列表类型也是序列类型的一种扩展,与元组不同,它创建后可以随意修改

使用方括号[] 或 list()创建,元素间用逗号分隔

列表中的各元素类型可以不同,无长度限制

列表类型的操作函数和方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
ls[i] = x #替换ls中第i位元素为x
ls[i:j:k] = lt #用lt替换ls切片后的子列表
del ls[i] #删除第i位元素
del ls[i:j:k] #删除ls中第i到第j以k为步长的元素
ls += lt #将lt中的元素增加到ls中
ls *= n #将ls中的元素重复n次
ls.append(x) #在ls最后增加元素x
ls.clear() #清空列表ls
ls.copy() #生成与ls相同的一个新列表
ls.insert(i,x) #在ls的第i位增加新元素x
ls.pop(i) #将第i位元素取出并删除
ls.remove(x) #将ls中出现的第一个x删除
ls.reverse() #将ls中的元素反转

字典类型

字典定义

要使用字典类型,首先要理解“映射”

映射是一种键(索引)和值(数据)的对应,就像取快递时,根据快递单号能够找到自己的快递一样

字典类型是“映射”的具体体现,它是键值对的集合,键值对之间没有顺序

采用大括号{} 或 dict()创建,键值对用冒号表示

字典类型的用法

1
2
3
4
<字典变量> = {<键1>:<值1>, ... , <键n>:<值n>}
<> = <字典变量>[<>]
<字典变量>[<>] = <>
#[]用来向字典变量中索引或增加元素

字典处理函数和方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
del d[k] #删除d中键k对应的数据值
k in d #判断k是否在d中
d.keys() #返回字典d中所有键信息
d.values() #返回字典d中所有的值信息
d.items() #返回所有键值对信息
d.get(k, <default>) #若键k存在,则返回对应值,不存在则返回<default>值
d.pop(k, <default>) #若键k存在,则取出对应值(返回加将其从字典中删除),不存在则返回<default>值
d.popitem() #随机取出d中的一个键值对,并以元组形式返回
d.clear() #清空字典
len(d) #返回d中的元素个数

程序的结构

程序的分支结构

if系列语句

if系列语句是用于控制程序分支结构的语句,if语句可以单独使用,构成单分支结构,还可以与else,elif配合使用,构成二分支结构,多分支结构 if

条件判断及组合

条件判断主要用>,<,=等操作符来体现,其中相等用==来表示,不相等用!=来表示

条件组合用and,or,not三个保留字来表示,x and y表示x和y需要同时满足该语句才为真,x or y表示x与y满足一个整条语句就为真,not x表示x为假时该语句才为真

程序的异常处理

用try和except关键字来进行异常处理 异常处理 异常处理 异常处理

程序的循环结构

按照一定次数或条件执行的一组语句

for循环(遍历循环)

由保留字for和in构成,完整遍历所有元素后结束

1
2
for <变量> in <遍历结构>:
    <被循环执行的语句>

遍历结构可以是字符串,列表,文件等等,每次循环都从结构中获取一个元素放入循环的变量当中

for循环常常与range()函数搭配使用

1
2
for <变量> in range(<次数>):
    <被循环执行的语句>

range(M,N,K)产生M~N-1之间,步长为K的整数序列,其中M,K可省略

while循环(无限循环)

由while关键字构成的循环,每次执行循环的时候都会判断条件是否成立,条件不成立时循环立刻结束

1
2
while <条件>:
    <语句块>

循环控制保留字

break保留字表示跳出并结束当前整个循环,执行循环后的语句(tip:break保留字仅会跳出当前层循环,多层循环时不会直接结束整个多重循环)

continue保留字表示结束当次循环,继续进行下一个循环

循环的高级用法

循环可以与else关键字结合使用,当循环没有被break语句退出时,执行else语句块,可以将其看作“正常”完成循环的奖励 循环与else

函数

定义:一段具有特定功能的,可以复用的语句组

作用:降低编程难度和积累复用代码,提高工作效率

1
2
3
def <函数名>(<参数(0个或多个)>): #可以没有参数,但一定要保留括号
    <函数主体>
    return <返回值> #可以不提供返回值

函数只有通过调用以后才会运行,不调用时程序执行时不会运行函数部分

关于参数

可选参数传递:函数定义时可以为某些参数指定默认值,构成可选参数,一般置于非可选参数的后面

可变参数传递:

1
2
3
def <函数名>(<参数>, *b): #*b为可变参数,即不确定参数的总数量
    <函数体>
    return <返回值>

参数传递可按照位置或名称两种方式传递

变量

规则1

程序中的变量分为两种,一种为局部变量,即在函数内部进行定义的变量;另一种是全局变量,即在主程序中定义的变量

局部变量在函数执行结束后便被释放,而全局变量在程序执行过程中

规则2

若想在函数内部使用全局变量,需要使用global保留字对变量进行声明

规则3

局部变量为组合数据类型且在函数中未真实创建时,视为全局变量

方法

“方法”特指"<a>.<b>()“风格中的函数”<b>()"

方法本身也是函数的一种,但其特殊地与<a>相关

lambda函数

lambda函数是一种匿名函数,即该函数无函数名,使用lambda保留字定义,函数名是返回的结果

该函数大多用于定义简单的,能够在一行内表示的函数 lambda lambda

该函数应谨慎使用,它主要被用作一些特定函数或方法的参数

函数递归

函数定义中调用函数自身的方式

函数递归主要有两个关键特征:链条和基例

链条就是计算过程中两个元素之间存在的关系,类似的例子就像等差数列相邻项的公差;基例就是递归函数中不需要再次递归的部分,运算过程中的其他部分是基于它(们)与链条推导出来的

函数递归的实现要依靠分支语句的帮助

基本实例:斐波那契序列,汉诺塔

文件操作

文件的类型

文件是数据的抽象和集合,一共有两种展现形态,分别为文本文件和二进制文件

本质上两种文件都是采用二进制形式储存,只是展示形式不同而已

文本文件是由单一特定编码(如UTF-8)组成的文件,由于存在编码,故可视作存储着的长字符串,适用于txt,py等

二进制文件直接由比特0和1组成,没有统一字符编码,适用于png,avi等

文件的打开和关闭

文件的打开

<变量名> = open(<文件名(包括文件路径和名称)>, <打开模式>)

文件路径是文件在计算机中储存的位置,包括相对路径和绝对路径

打开模式

关闭文件用到<变量名>.close()函数

文件内容的读取

1
2
3
<f>.read(size = -1) #读入全部内容,若给出参数则读入前size长度
<f>.readline(size = -1) #读入一行内容,若给出参数则该行读入前size长度
<f>.readlines(hint = -1) #读入文件所有行,以每行为元素形成列表,若给出参数则读入前hint行

文件内容的写入

1
2
3
<f>.write(s) #向文件写入一个字符串或字节流
<f>.writelines(lines) #将一个元素全为字符串的列表写入文件
<f>.seek(offset) #改变当前文件操作的指针的位置,offset值不同表示的位置也不一样,0-文件开头,1-当前位置,2-文件结尾

CSV数据储存格式

这是国际通用的一二维数据储存格式,一般以.csv为扩展名

每行一个一维数据,采用(英文半角)逗号分隔,无空行。如果某个元素缺失,逗号仍然要保留

Excel和一般的编辑软件都可以读入或另存为csv文件

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计