本笔记主要参考北理工嵩天老师的python基础课视频。我将其整理为三大部分,本文为第一部分内容:
(1)python基础语法
(2)python计算生态
(3)相关应用实例
目录
- 1.python基础语法
- 1.1程序设计的基本方法
- 1.1.1Python程序语法元素分析
- 1.1.2深入理解python语言
- 1.1.3python程序设计思维
- 1.2基本数据类型
- 1.2.1整数类型
- 1.2.2浮点数
- 1.2.3复数类型
- 1.2.4数据类型操作
- 1.2.5字符串
- 1.3程序的控制结构
- 1.3.1程序的分支结构
- 1.3.1.1 单分支结构
- 1.3.1.2 二分支结构
- 1.3.1.3 多分支结构
- 1.3.1.4 程序的异常处理
- 1.3.2程序的循环结构
- 1.3.2.1 遍历循环
- 1.3.2.2 无限循环
- 1.3.2.3 循环控制保留字
- 1.3.2.4 循环的高级用法
- 1.4函数和代码
- 1.4.1函数的定义与使用函数是一段代码的表示,是具有一定功能的、可重复使用的语句组,是一种功能的抽象。
- 1.4.2代码复用与函数递归
- 1.5组合数据类型
- 1.5.1集合类型及其操作
- 1.5.2序列类型及其操作
- 1.5.2.1 序列类型
- 1.5.2.2 列表类型
- 1.5.2.3 元组类型
- 1.5.3字典类型及操作
- 1.6 文件和数据格式化
- 1.6.1文件的使用
- 1.6.1.1 文件展现形态
- 1.6.1.2 文件的打开及关闭
- 1.6.1.3 文件内容的读取
- 1.6.1.4 文件内容的写入
- 1.6.2一维数据的格式化和处理
- 1.6.3二维数据的格式化和处理
1.python基础语法
1.1程序设计的基本方法
源代码:采用某种编程语言编写的计算机程序,人类可读。
目标代码:计算机可以直接执行,人类不可读。
编译compilation:将源代码一次性转换成目标代码的过程。
静态语言:使用编译执行的语言。C/C++,Java等。
解释interpretation:将源代码逐条转换成目标代码同时逐条运行的过程。
脚本语言:使用解释执行的编程语言。python,JavaScript,PHP等。
Python的两种编程方式:
交互式:对每个输入语句及时运行结果。
文件式:批量执行一组语句并运行结果,编程的主要方式。
1.1.1Python程序语法元素分析
缩进:程序内一致即可,一般用4个空格或1个Tab。
变量:程序中用于保存和表示数据的占位符号。命名规则:大小写字母、数字、下划线和汉字及组合。命名大小写敏感,首字符不能是数字,保留字不能用(33个保留字)。
保留字(关键字):被编程语言内部定义并保留使用的标识符。大小写敏感。
1.1.2深入理解python语言
计算机技术的演进过程:
1946-1981:计算机系统结构时代,计算能力问题
1981-2008:网络和视窗时代,人与计算机交互能力
2008-2016:复杂系统时代,数据问题
2017- :人工智能时代,人类的问题
不同编程语言对比:
HTML/CSS/JS:不可替代的前端技术,全栈能力。
其他语言:R/Go/Matlab等,特定领域。编程语言种类的发展:
Python语言是唯一的超级语言。
1.1.3python程序设计思维
从IPO开始:
确定IPO:(input、process、output)明确计算部分及功能边界。
编写程序:将计算求解的设计变成现实。
调试程序:确保程序按照正常逻辑能够正确运行。
模块化设计:
通过函数或对象封装将程序划分为模块及模块间的表达。
具体包括:主程序、子程序和子程序间的关系。
分而治之:分而治之、分层抽象、体系化的设计思想。
模块内部紧耦合、模块间松耦合。
应用开发的四个步骤:
产品定义:对应用需求充分理解和明确定义。
系统架构:以系统方式思考产品技术的实现。
设计与实现:结合架构完成关键设计及系统实现。
用户体验:从用户角度思考应用的效果。
1.2基本数据类型
1.2.1整数类型
没有取值范围限制。
Pow(x,y):计算xy,想算多大算多大。
四种进制表示形式:
十进制:99,-217
二进制:以0b或者0B开头:0b010,-0B10
八进制:以0o或0O开头:00123,-00456
十六进制:以0x或0X开头:0x9a2,-0X89
1.2.2浮点数
取值范围和小数精度存在的限制可以忽略不计。
浮点数的尾数存在不确定尾数(一般发生在10-16左右),不是bug。
round(x,d):对x四舍五入,d是小数截取位数。浮点数间的运算及比较用round()函数辅助。
浮点数可以采用科学计数法表示:字母e(E)代表以10为基数的幂的符号。
< a > e < b > 代表a*10b。
1.2.3复数类型
z = 1.23e-4 + 5.6e+89 j
实部:z.real 虚部:z.imag
1.2.4数据类型操作
类型间的混合运算,生成结果为“最宽”类型。(整数 → 浮点数 → 复数)
数值运算操作符:
+,-,*,/,//:加,减,乘,除,整数除
+x:x本身 -y:y的负值
x%y:余数,模运算。
x**y:幂运算,x的y次幂。
增强操作符:x op= y,即x = x op y
数值运算函数:有印象即可,用到时候再熟练。
1.2.5字符串
由0个或多个字符组成的有序字符序列。由一对单引号或一对双引号表示。使用[]获取字符串中的一个或多个字符。
字符串的表示:字符串有2类共4种表示方法。
由一对单引号或双引号表示,仅表示单行字符串。
由一对三单引号或三双引号表示,可表示多行字符串。
字符串的序号:正向递增序号,反向递减序号。
字符串的索引:返回字符串中的单个字符。<字符串> [M]。
字符串的切片:返回字符串中一段字符子串。
<字符串>[M:N]。M缺失表示至开头,N缺失表示至结尾。(不包含<字符串> [N]。)
<字符串>[M:N:K]。根据步长K对字符串切片。
转义符 \ :表达特定字符的本意;或者形成一些组合,表示一些不可打印的含义。(“\b"回退,”\n"换行(光标移动到下行首),"\r"回车(光标移动到本行首))
字符串操作符:
字符串处理函数:
字符串类型的格式化:.format(),对字符串进行格式表达。
<模板字符串>.format(<逗号分隔的参数>)输入函数input():<变量> = input(<提示信息字符串>)。
输出函数print():print(<拟输出的字符串>)。
print()函数的格式化:可以用{}表示槽,后续变量可以填充到槽中。
注:槽:一种用于字符串的占位信息符,只在字符串中有用。
槽内部对格式化的配置方法:{<参数序号> : <格式控制标记>}
1.3程序的控制结构
1.3.1程序的分支结构
分支语句:由判断条件决定程序运行方向的语句。使用保留字if elif else构成条件判断的分支结构。每个保留字所在行最后存在一个冒号。冒号及后续缩进用来表示后续语句与条件的所属关系。
1.3.1.1 单分支结构
if <条件>:
<语句块>
1.3.1.2 二分支结构
if <条件>:
<语句块1>
else:
<语句块2>
紧凑形式:<表达式1> if <条件> else <表达式2>
1.3.1.3 多分支结构
if <条件>:
<语句块1>
elif <条件>:
<语句块2>
…
else:
<语句块n>
注:应当注意多条件之间的包含关系,注意变量取值范围的覆盖关系。
1.3.1.4 程序的异常处理
try:
<语句块1>
except:
<语句块2>
进一步了解异常类型:
try:
<语句块1>
except<异常类型>:
<语句块2>
异常处理的高级使用:
try:
<语句块1>
except:
<语句块2>
else:
<语句块3> #不发生异常时执行
finally:
<语句块4> #一定执行
1.3.2程序的循环结构
range()函数:
range(N)产生0到N-1的整数序列。
range(M,N)产生M到N-1的整数序列,共N-M个数字
1.3.2.1 遍历循环
for <循环变量> in <遍历结构>:
<语句块>
每次循环,所获得元素放入循环变量,并执行一次语句块。
计数循环(N次)
for <循环变量> in range(N):
<语句块>
for <循环变量> in range(M,N,K):
<语句块>
字符串遍历循环
for c in s :
<语句块>
s是字符数串,遍历字符串每个字符,产生循环。
列表遍历循环
for item in ls :
<语句块>
ls是一个列表,遍历其每个元素,产生循环。
文件遍历循环
for line in fi :
<语句块>
fi是一个文件标识符,遍历其每行,产生循环。
1.3.2.2 无限循环
由条件控制的循环运动方式
while <条件>:
<语句块>
反复执行语句块,直到条件不满足为止。
1.3.2.3 循环控制保留字
break和continue
break跳出并结束当前整个循环,执行循环后的语句。
continue结束当次循环,继续执行后续次数循环。
breaki和 continue可以与for和 while循环搭配使用。
1.3.2.4 循环的高级用法
for <循环变量> in <遍历结构>:
<语句块1>
else :
<语句块2>
while <条件>:
<语句块1>
else:
<语句块2>
当循环被break语句退出时,不执行else语句块。
这里else的用法与异常处理中else用法相似。
1.4函数和代码
1.4.1函数的定义与使用函数是一段代码的表示,是具有一定功能的、可重复使用的语句组,是一种功能的抽象。
两个作用:降低编程难度,代码复用。
def <函数名>(<参数(0个或者多个)>) :
<函数体>
return <返回值>
函数的参数传递:
无论函数有没有参数,都要保留括号。
可选参数:函数定义时可以为某些参数指定默认值,构成可选参数。
可选参数一定要在必选参数(非可选参数)后面。
def <函数名> (<非可选参数>,<可选参数>):
<函数体>
return <返回值>
可变参数的传递:函数定义时可以设计可变数量参数,既不确定参数总数量。
def <函数名> (<参数>,*b):
<函数体>
return <返回值>
函数调用时,参数可以按照位置或名称方式传递:
函数可以有return也可以没有,return可以返回0个或多个返回值。
函数局部变量和程序全局变量:
规则1:局部变量和全局变量是不同变量。
局部变量是函数内部的占位符,与全局变量可能重名但不同。
函数运算结束后,局部变量被释放。
可以使用global保留字在函数内部使用全局变量。
规则2:局部变量为组合数据类型且未创建,等同于全局变量。
组合数据类型在python中是由指针来体现的。
lambda函数:使用lambda保留字定义,函数名是返回结果。用于定义简单的、能够在一行内表示的函数。
谨慎使用lambda函数:lambda函数主要用作一些特定函数或方法的参数。
<函数名> = lambda<参数> : <表达式>
1.4.2代码复用与函数递归
把代码当作资源进行抽象:
代码资源化:程序代码是一种用来表达计算的“资源”。
代码抽象化:使用函数等方法对代码赋予更高级别的定义。
代码复用:同一份代码在需要时可以被重复使用。
函数和对象是代码复用的两种主要形式:
函数:将代码命名,在代码层面建立了初步抽象。
对象:通过属性和方法< a >.< b >和< a >.< b >(),在函数之上再次组织进行抽象。
模块化设计:分而治之
通过函数或对象封装将程序划分为模块及模块间的表达。
具体包括:主程序、子程序和子程序间的关系
分而治之:是一种分而治之、分层抽象、体系化设计的思想
模块内部尽可能紧耦合、模块之间尽可能松耦合。
函数递归:函数定义中调用函数自身的方式,类似于数学归纳法。
链条:计算过程存在递归链条。
基例:存在一个人或者多个不需要再次递归的基例。
1.5组合数据类型
1.5.1集合类型及其操作
集合是多个元素的无序组合:
集合元素之间无序,每个元素唯一,不存在相同元素。
集合元素不可更改,不能是可变数据类型。
集合用{}表示,元素间用逗号分隔。
建立集合类型用{}或者set()。
建立空集合类型,必须用set()。
集合间操作:
增强操作符:
S|=T:更新集合S,包括在集合S和T中的所有元素。
S-=T:更新集合S,包括在集合S但不在T中的元素。
S&=T:更新集合S,包括同时在集合S和T中的元素。
S^=T:更新集合S,包括集合S和T中的非相同元素。
集合处理方法:
S.add(x):如果x不在集合S中,将x增加到S。
S.discard(x):移除S中元素x,如果x不在集合S中,不报错。
S.remove(x):移除S中元素x,如果x不在集合S中,产生KeyError异常。
S.clear(x):移除S中所有元素。
S.pop():随机返回S的一个元素,并更新S,若S为空产生KeyError异常。
S.copy():返回集合S一个副本。
len(S):返回集合S元素个数。
x in S:判断x在集合S中,返回Tue,否则返回False。
x not in S:判断x不在集合S中,返回Tue,否则返回False。
set(x):将其他类型变量x转换成为集合类型。集合类型应用场景:
1.5.2序列类型及其操作
序列是一个基类类型:
1.5.2.1 序列类型
序列:具有先后关系的一组元素,是一组一维元素向量,元素类型可以不同。
序列序号的定义:
序列的通用操作符:x in s:如果x是序列s的元素,返回True,否则返回False。
x not in s:如果x是序列s的元素,返回False,否则返回True。
s+t:连接两个序列s和t。
sn或ns:将序列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的最大元素,s中元素需要可比较。
s.index(x)或s.index(x,i,j):返回序列s从i开始到j位置中第一次出现元素x的位置。
s.count(x):返回序列s中出现x的总次数。
1.5.2.2 列表类型
由0个或多个数据组成的有序序列。列表中各元素类型可以不同。
使用方括号[]或list()创建,元素间用逗号分隔,创建后可以随便修改。
定义的时候,如果使用了[]和list()则是真正创建了列表。如果只使用了赋值,则相当于赋予了一个新名字。
列表类型操作函数及方法:
ls[i]=x:替换列表ls第i元素为x。
ls[i:j:k]=lt:用列表lt替换切片后所对应元素子列表。
del ls[i]:删除列表ls中第i元素。
del ls[i:j:k]:删除列表ls中第i到第j以k为步长的元素。
ls+=lt:更新列表ls,将lt元素增加到列表ls中。
ls*=n:更新列表s,其元素重复n次。
ls.append(x):在ls最后增加一个元素x。
ls.clear():删除列表ls中所有元素。
ls.copy():生成一个新列表,赋值ls中所有元素。
ls.insert(i,x):在列表ls第i位置增加元素x。
ls.pop(i):将列表ls中第i位置元素取出并删除该元素。
ls.remove(x):将列表ls中出现的第一个元素x删除。
ls.reverse():将列表ls中的元素反转。
举例:
1.5.2.3 元组类型
使用小括号()或tuple()创建(可以使用或者不使用小括号),元素间用逗号分隔。创建后不能修改,因此没有特殊操作。
注:使用creature[::-1]是生成新的元组,并不改变原有元组。列表与元组:
列表更加灵活,最常用。元组元素不改变,可用于数据保护。
1.5.3字典类型及操作
映射:映射是一种键(索引)和值(数据)的对应。
键值对:键是数据索引的拓展。
字典是键值对的集合,键值对之间无序。采用大括号{}和dict()创建,键值对用冒号表示:{<键1>:<值1>,<键2>:<值2>,…,<键n>:<值n>}。
字典变量通过键获得值,[]用来向字典变量中索引或增加元素:
<字典变量> = {<键1>:<值1>,…,<键n>:<值n>}
<值> = <字典变量>[<键>]
<字典变量>[<键>] = <值>
生成空的字典:使用大括号{}。
注:集合类型也可以由大括号{}表示。但是生成空的集合类型不能使用大括号{}方式,因为大括号{}是默认生成字典类型的。因为字典类型比集合类型常用。
返回的键信息和值信息不能当做列表类型操作,但是可以用for in 进行遍历。
字典类型函数及方法:
del d[k]:删除字典d中k对应数据值。
k in d:判断键k是否在字典d中,如果在返回True,否则返回False。
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中元素个数。
举例:
1.6 文件和数据格式化
1.6.1文件的使用
文件是数据的抽象和集合。是数据存储的一种形式,是存储在辅助存储器上的数据序列。
1.6.1.1 文件展现形态
文本文件和二进制文件。
本质上,所有文件都是二进制形式存储。由单一特定编码组成的文件,如UTF-8编码。适用于例如:.txt文件、.py文件等。
形式上,所有文件采用两种方式展示。直接由比特0和1组成,没有统一字符编码。适用于例如:.png文件、.avi文件等。
1.6.1.2 文件的打开及关闭
打开-操作-关闭:
打开:
打开模式:
文件名:
左边两个:绝对路径。 右边两个:相对路径
如果程序存储在D盘的根目录下,可以用右上方式。
如果程序与文件存储在相同目录里,可以直接使用文件名称f.txt。关闭:
1.6.1.3 文件内容的读取
< f >.read(size=-1):读入全部内容,如果给出参数,读入前size长度。
< f >.readline(size=-1):读入一行内容,如果给出参数,读入该行前size长度。
< f >.readlines(hint=-1):读入文件所有行,以每行为元素形成列表。如给出参数,读入前hint行。
文件的全文本操作:
文件的逐行操作:
1.6.1.4 文件内容的写入
< f >.write(s):向文件写入一个字符串或字节流。
< f >.writelines(lines):将一个元素全为字符串的列表写入交件。
< f >.seek(offset):改变当前文件操作指针位置的操作。0-文件开头;1-当前位置;2-文件结尾。
举例:
问题:信息写入文件后,当前文件处理的指针在最后面。此时如果调用for in 遍历打印输出的时候,即从当前位置向文件结尾处打印出文件每一行。已经写过的信息在指针的上方,因此没有输出。
1.6.2一维数据的格式化和处理
数据组织的维度:
一个数据表达一个含义,一组数据表达一个或多个含义
一维数据:由对等关系的有序或无序数据构成,采用线性方式组织。对应列表、数组和集合等概念。
二维数据:由多个一维数据构成,是一维数据的组合形式。(表格是典型的二维数据。)
多维数据:由一维或二维数据在新维度上扩展而成。(如:不同时期的二维数据表。)
高维数据:仅利用最基本的二元关系展示数据间的复杂结构。
数据操作周期:存储-表示-操作
一维数据的表示:
有序:列表。 无序:集合。
一维数据的存储:
方式一:空格分隔。使用一个或多个空格分隔并进行存储,不换行。缺点:数据中不能有空格。
方式二:逗号分隔。不换行。缺点:数据中不能有逗号。
方式三:其他符号或符号组合分隔。缺点:通用性差。
一维数据的处理:
一维数据的读入处理:
一维数据的写入处理:
1.6.3二维数据的格式化和处理
二维数据的表示:
二维数据的处理:
另:CSV数据存储格式(Comma-Separated Values)
国际通用的一二位数据存储格式,一般.csv扩展名。每行一个一维数据,用逗号分隔,无空行。如果某个元素缺失,逗号仍要保留。一般索引习惯:ls[row][column],先行后列。即外层列表每个元素是一行,按行存。
ls是包含二维数据的二维列表信息。wordcloud应用实例