1.变量命名规则
由数字、字母、下划线组成
不能数字开头
不能使用内置关键字
严格区分大小写
2 .等同于FALSE的值
• None;
• False;
• 任何为0的数字类型,如0、0.0、0j;
• 任何空序列,如’’’’、()、[];
• 空字典,如{};
用户定义的类实例,如类中定义了__bool__()或者__len__()方法,并且该方法返回0或者布尔值False
3.字符串的访问
从字符串中获取一段子字符串的话,可以使用变量 [头下标 : 尾下标],就可以截取相应的字符串,其中下标是从 0 开始算起,可以是正数或负数,下标可以为空表示取到头或尾。
当使用以冒号分隔的字符串,python返回一个新的对象
从左到右,左闭右开!
4.格式化输出
print(‘我的名字是%s,我的学号是:%s,我今年%s岁。’ %(name, sno, age))
5. 列表 元组 集合 字典
类型名称 list tuple set dict
例子: [12,“cat”,True,“dog”,2.3] (12,“cat”,True,“dog”,2.3) {12,“cat”,True,“dog”,2.3)} {3:“apple”,6:“banana”,2:“peach”}
定界符 方括号[] 圆括号() 大括号{} 大括号{}
元素分隔符 逗号 逗号 逗号 逗号
是否有序 是 是 否 否
是否支持下标 是 是 否 否
索引和字符串 相同 相同 没有索引 没有索引
元素是否可重复 是 是 否 否
是否可变 是 否 是 是
[1, 2, 4] > [1, 2, 3]
6.逻辑运算符
or 当用or运算符连接两个操作数时,若左操作数的布尔值为True,则返回左操作数,否则返回右操作数或其计算结果(若为表达式)
2+3 or None 结果为 5
0 or 3+5 结果为8
and 当用and运算符连接两个操作数时,若左操作数的布尔值为False,则返回左操作数或其计算结果(若为表达式),否则返回右操作数的执行结果
3-3 and 5 结果为0
3-4 and 5 结果为5
7.身份运算符
当两个对象值相同时,只有其为数值型或字符串型,a is b才为True,当a和b是tuple,list,dict或set型时,a is b为False 。
֍ == 比较操作符:用来比较两个对象值是否相等。
֍ is 同一性运算符:比较两个对象的id值是否相等,即是否是同一对象,是否指向同一个内存地址。
8.for循环
range(5)、range(0,5)表示列表[0,1,2,3,4],左开右闭
9.format格式化输出
#1. 通过位置参数
str1 = ‘{0}的学号是{1},{0}的年龄是{2}。’
print(str1.format(‘李四’, 1002, 22))
#2. 通过关键字参数名称
str2 = ‘{name}的学号是{sno},{name}的年龄是{age}。’
print(str2.format(name = ‘张三’, sno = 1001, age = 20))
#format方法返回的是格式化的字符串副本,并不会改变原字符串内容。
print(str1) #{0}的学号是{1},{0}的年龄是{2}。
print(str2) #{name}的学号是{sno},{name}的年龄是{age}。
10.类与对象
对象也可以调用类属性
私有成员在类的外部不能直接访问,一般是在类的内部进行访问和操作,或者在类的外部通过调用对象的公有成员方法来访问
在实例方法中访问实例成员时需要以self为前缀
在外部通过类名调用属于对象的公有方法,需要显式为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的成员。如:
#类实例化对象p
p = Person (‘路人甲’, 16)
#方式1
p.show()
#方式2
Person.show§
11.函数参数传递
֍ 参数传递是根据传入参数的类型来选择的,
֍ 传值的参数类型:数字,字符串,元组(immutable); 变量的值在参与函数运算前后没有发生变化。
֍ 传址的参数类型:列表,字典(mutable)。 在作为实参参与函数运算之后,自身的值发生了变化
12. global关键字(全局变量)
nonlocal关键字(在被嵌套的函数中修改外部函数变量的值)
def count():
a = 60
def count2():
nonlocal a
b=65
a = a + b
return a
return count2()
֍ 注意:当函数无参数时返回内层函数需要带括号。
֍ 在count2()中,用nonlocal关键字声明局部变量a,这样a就可被count2()函数使用,又定义了一个局部变量b, b为软件工程2班的学生人数,计算表达式a + b 的值,并赋值给a,返回运算后a的值给内层函数count2(),
13.闭包
闭包的主要作用在于可以封存函数执行的上下文环境。
例如,通过两次调用outer函数形成了两个闭包,这两个闭包具有相互独立的上下文环境(一个闭包中x=5、y=10,另一个闭包中x=50、y=10),且每个闭包可多次调用。
def outer(x): #定义函数outer
y=10 #定义局部变量y并赋为10
def inner(z): #在outer函数中定义 #嵌套函数inner
nonlocal x,y #nonlocal声明
return x+y+z #返回x+y+z的结果
return inner #返回嵌套函数inner的引用
f=outer(5) #将返回的inner函数赋给f
g=outer(50) #将返回的inner函数赋给g
print(‘f(20)的值为:’, f(20))
print(‘g(20)的值为:’, g(20))
print(‘f(30)的值为:’, f(30))
print(‘g(30)的值为:’, g(30))
f(20)的值为: 35
g(20)的值为: 80
f(30)的值为: 45
g(30)的值为: 90
14.可变类型与不可变类型
可变类型:可以对该类型对象中保存的元素值做修改。列表、字典都属于可变类型
不可变类型:该类型的对象所保存的元素值不允许修改,只能通过给对象整体赋值来修改对象所保存的值,本质上就是创建了一个新的不可变类型的对象,而不是修改了原对象的值。数字、字符串和元组都属于不可变类型。
可迭代类型有:字符串,列表,元组,集合和字典,可以使用isinstance()函数来判断一个对象是否是可迭代对象
15.列表比较
1)如果比较的元素是同类型的,则比较其值
(2)如果比较的元素不是同类型的,要视情况而定
① 如果都是数值类型,则执行数值的强制类型转换,然后比较
②如果有一方的元素是数字,则另一方大(“数字最小”)
③ 否则按照类型名字的字母顺序进行比较
(3)如果有一个列表首先到达末尾,则另一方值大
(4)如果两个列表的元素和个数都相等,则两个列表相等,返回0
16.sort和sorted区别
sort的方法和标准类型内置函数sorted不同,sorted函数不会改变原来列表的内容,而是返回一个新的列表对象,list.sort方法会改变原列表内容。
stuList = [[‘张轩’,19,92],[‘李岚’,18,91],[‘王晨’,19,90],[‘周明’,20,93]]
stuList.sort(key=lambda x :x[2],reverse=True)
17.深浅拷贝
list.copy()
浅拷贝会为新对象开辟存储空间,但是为对象本省开辟空间,对象中的元素仍和原对象属于同一个引用。
浅拷贝后如果改变原对象中的不可变类型元素,本质上是产生了一个新的不可变元素,拷贝对象中的元素仍指向原来的不可变元素,所以没有发生改变。如果改变原对象中的可变类型元素,由于可变元素在拷贝对象中没有开辟新的存储空间,原对象和拷贝对象中的可变元素是一个对象,所以拷贝对象也会改变。。
copy.deepcopy()
深拷贝不仅使原对象和生成对象对应不同的内存空间,而且使得两个对象中
的元素对应不同的内存空间,从而使得两个对象完全独立。
18.元组创建
tup1 = (‘Taobao’, ‘Jingdong’, 1, 2)
tup2 = “a”, “b”, “c”, “d” # 非空元素的括号可以省略
print(tup1) #输出结果为:(‘Taobao’, ‘Jingdong’, 1, 2)
print(tup2) #输出结果为:(‘a’, ‘b’, ‘c’, ‘d’)
tup3 = () #创建空的元组
元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。例如:
tup4 = (50) print(type(tup4)) #输出结果为:<class ‘int’>
tup5=(50,) print(type(tup5)) #输出结果为:<class ‘tuple’>
19.集合和字典的创建
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
20.哈希
一个对象能被称为可哈希的 ,它必须有个哈希值,这个值在整个生命周期都不会变化,而且必须可以进行相等比较。对于 Python 的内建类型来说,不可变类型都是 可哈希的, 如字符串,可变类型:列表、字典、集合,他们在改变值的同时却没有改变id,无法由地址定位值的唯一性,因而无法哈希。
21.文件操作open的访问模式
f = open("./files/dt.csv", “w”)
参数 模式
r 只读模式,默认模式,如果文件不存在则抛出异常。
w 写模式,如果文件不存在则创建,如果文件已存在,则先清空文件内容。
x 创建写模式,如果文件不存在则创建,如果文件已存在则抛出异常。
a 追加写模式,如果文件不存在则创建,如果已存在,文件指针在文件尾部,不覆盖文中内容,写入的内容在文件尾部。
b 二进制格式
t 文本文件格式,默认格式
-
可以和r/w/x/a一同使用,在原功能基础上增加同时读写功能
22.文件操作中的with语句
• 在文件操作中使用with语句能保证with语句执行完毕后关闭打开的文件。
• with open( ) as <文件对象>:
• 如 with open("./files/dt.csv", “w”) as f:
•
23.文件读取与写入
fileobject.write(string);方法将字符串写入一个打开的文件。返回值为写入字符的长度,需要人为在字符串末尾添加换行符。
fileobject.writelines(stringlist);把字符串元素组成的列表写入文本文件,每个列表项不添加换行符
String = fileobject.read([size]);size——从文件中读取的字节数,如果未指定则读取文件的全部信息。返回值为从文件中读取的字符串。
String = fileObject.readline([size]);用于从文件中读取整行,包括”\n”字符。size – 从文件中读取的字节数,如果参数为正整数,则返回指定大小的字符串数据
fileObject.readlines();用于读取文件中所有行,直到结束符 EOF,并返回列表,包括所有行的信息。该列表可以由Python 的“for… in …”结构进行处理
24.文件定位
֍ f.tell():返回一个整数,表示当前文件指针的位置(就是到文件头的字节数)。
f.seek(偏移量,[起始位置]):用来移动文件指针
偏移量: 单位为字节,可正可负。 起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾
25.scv文件的读写
(1)写
- 获取CSV写操作对象
csvWriter = csv.writer(csvfile,[dialect =‘excel’,** fmtparams])
返回一个编写器对象。 - CSV写操作方法
writer.writerow() #写入一行数据,即将一个可迭代对象写入文件
writer.writerows() #写入多行数据到CSV文件
如:
import csv
with open("./files/dt.csv",“w”,newline="") as file:
# 获取CSV文件操作对象
csvWrite = csv.writer(file)
# 进行写操作
lsHeader =[“姓名”,“年龄”,“成绩”]
csvWrite.writerow(lsHeader)
csvWrite.writerows(ls2)
(2)读
- 获取CSV读操作对象
csvReader = csv.Reader(csvfile,[dialect =‘excel’,** fmtparams])
#返回一个读取器对象,是可迭代的。
如:
import csv
with open("./files/dt.csv",“r”) as file:获取CSV文件操作对象
csvReader = csv.reader(file)进行读操作
ls = list(csvReader)
print(ls[1:])
(3)csv字典读写
csvDictWriter = csv.DictWriter(f,fieldnames,restval =’’,extrasaction =‘raise’,dialect =‘excel’,* args,** kwds)
返回一个编写器对象。
csvDictWriter.writerow() #写入一行数据,即将一个可迭代对象写入文件
csvDictWriter.writerows() #写入多行数据到CSV文件
csvDictWriter.writeheader() #写入表格的标题栏数据
csvDictReader =csv.DictReader(f,fieldnames = None,restkey = None,restval = None,dialect =‘excel’,* args,** kwds)
#返回一个读取器对象,是可迭代的。
csvDictReader.fieldnames# 从文件中读取第一条记录,即标题栏信息
26.pickle文件操作
可以将对象以文件的形式存放在磁盘上。只能在Python中使用,序列化后的数据,可读性差,人一般无法识别。
pickle.dump(obj, file[, protocol])
序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
pickle.load(file)
反序列化对象。将文件中的数据解析为一个Python对象
27.异常
BaseException是所有内置异常的基类,但用户定义的类并不直接继承BaseException,所有的异常类都是从Exception继承,且都在exceptions模块中定义。 Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常
28.数据库操作
(cursor方法)
- close():关闭此游标对象
- fetchone():得到结果集的下一行
- fetchall():得到结果集中剩下的所有行
- execute(sql[, args]):执行一个数据库查询或命令
- callproc(func[,args]) 调用一个存储过程
数据库连接
①
使用pymysql连接MySQL数据库student
connect=pymysql.connect(host=‘localhost’,user=‘root’,password=‘123’,db=‘student’,port=3306)
cursor=connect.cursor()
利用读取的fieldnames构造Create tables的sql语句
create_sql = ‘create table if not exists stuTest ’ + ‘(’ + column[0:-1] + ‘)’ + ’ DEFAULT CHARSET=utf8’
执行sql语句创建表格
cursor.execute(create_sql)
connect.commit()提交到数据库执行
connect.rollback()回滚
②
import pymysql
#连接数据库,使用字典进行连接参数的管理
config = {‘host’: ‘localhost’,
‘port’: 3306,
‘user’: ‘root’,
‘passwd’: ‘123’,
‘charset’: ‘utf8mb4’,
‘local_infile’: 1
}
conn = pymysql.connect(**config)
cur = conn.cursor()
29.numpy库的定义
import numpy as np #引入库并以np作为别名
ndarray数组定义方法(索引值从0开始)
‐ array()方法创建:可以用Python中列表、元组等类型合建 arr = np.array([2,3,4])
‐ arange() 方法创建ndarray数组 arr = np.arange(1,100,2)#从1开始,步长为2,不包括100
‐ random创建随机数数组 arr = np.random.randint(1,100,[5,5])
‐ 从CSV文件等读取创建ndarray数组。arr = np.loadtxt(“a.csv”,delimiter=",")
‐
np.linspace() 根据起止数据等间距地填充数据,形成数组
np.concatenate() 将两个或多个数组合并成一个新的数组
(数组类型转换)
np.astype(dtype) , dtype可以是str, int, float
30.numpy常用的计算函数
sum(axis) 根据给定轴axis计算数组相关元素之和
mean(axis) 根据给定轴axis计算数组相关元素的平均值
max(axis) 根据给定轴axis计算数组相关元素的最大值
min(axis) 根据给定轴axis计算数组相关元素的最小值
std(axis) 根据给定轴axis计算数组相关元素的标准差
histogram(arr,bins,range,weights,density) 直方图统计. bins指定统计的区间个数;range表示统计范围的最小值和最大值的元组,weights为数组的每个元素指定了权值;density为True时,返回每个区间的概率密度;为False,返回每个区间中元素的个数。
sum(axis=0) 结果 [24 28 32 36]
sum(axis=1) 结果 [6 22 38 54]
hits,bins=histogram(arr,bins,range,weights,density)
31 Matplotlib
import matplotlib.pyplot as plt # 模块起别名
- 显示图表:plt.show()
- 保存图表:plt.savefig(filename, dpi)
(1) 点线图
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0,11,0.2) # x坐标采样点生成
y = np.sin(x) # 计算对应x的正弦值
plt.plot(x,y, ‘bs–’)
#x横轴数据,y纵轴数据,bp–:b 代表线颜色(蓝),p代表标记字条实心方形标记,-- 代表虚线格式字符串 控制图形格式为蓝色方形的虚线
plt.xlabel(“time”) #设置x坐标轴标签
plt.ylabel(“voltage”) #设置y坐标轴标签
plt.savefig("test",dpi=300) #保存图表
plt.show()
(2) 柱状图
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.serif'] = ['SimHei'] #这两行用来正常显示中文#
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
-
构建数据
x = bins[0:-1] #bins:[ 0 60 70 80 90 100]
y = hist #hist: [ 2 14 27 17 3] -
绘制柱状图
plt.bar(x, y, width=5, color=‘steelblue’) -
设置标题及坐标轴名称
plt.title(“成绩分布图”)
plt.xlabel(“分数段”)
plt.ylabel(“人数”) -
显示图表
plt.show()
-
修改bins值
bins[0]=50 #50代表60分以下成绩,个数与hist数组相同
x = bins[0:-1] -
修改坐标轴刻度值
plt.axis([40,100,0,40]) #设置坐标值范围, x轴范围[40,100],y轴范围[0,40]
plt.xticks(x,[‘60分以下’,‘60-70分’,‘70-80分’,‘80-90分’,‘90-100分’])
设置当前x轴刻度位置的标签与取值 #ticks:设置X轴刻度间隔
#labels: 设置每个间隔的显示标签 -
调整x轴刻度对齐方式
plt.bar(x, y, width=5, color=‘steelblue’, align=‘center’)
-
在任意位置增加文本
plt.text(x横坐标,y纵坐标,显示数据,水平对齐,垂直对齐)
for x,y in zip(x,hist): # 将可迭代对象打包成一个元组
plt.text(x, y+0.05, str(y), ha=‘center’, va= ‘bottom’) -
添加背景网络
plt.grid(True)
(3) 雷达图
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams[‘font.family’] = [‘SimHei’]
plt.rcParams[‘axes.unicode_minus’] = False -
构建数据
angles= np.linspace(0,2*np.pi,6,endpoint=False)
#将整圆2π平均分成6份,参数endpoint必须设置为False
data= tdfl #使用numpy计算出的得分率数组
labels= [‘选择题’,‘填空题’,‘判断题’,‘简答题’,‘程序编写题’,‘程序填空题’] -
绘制极坐标图
plt.polar(angles,data, “bo-”,lw=1) #极坐标绘图, bo-表示格式字符串 -
设置标题及坐标轴名称
plt.title(“得分率雷达图”)
plt.thetagrids(angles * 180/np.pi, labels,y=0.02) #设置极角标签 -
显示图表
plt.show()
-
闭合数据连线:使用concatenate()连接制作闭合数据
angles=np.concatenate((angles,[angles[0]])) #角度数据首尾相接,曲线闭合
data= np.concatenate((data,[data[0]])) #得分率数据首尾相接,曲线闭合 -
填充闭合连线区域
plt.fill(angles,data, “r”,alpha=0.3)
-
修改标题位置
plt.title(“得分率雷达图”,y=1.06,fontsize=15) #调整标题显示位置及文字大小 -
修改极坐标范围
plt.ylim(0,1) #设置极坐标轴范围为0到1 设置当前y轴的取值范围 -
添加数据点数据显示
for x,y in zip(angles,data):
plt.text(x, y+0.09, round(y,2), ha=‘center’, va= ‘bottom’)
(4) 多图绘制
figure为画布:一个图像只能有一个figure对象
subplot为画布上的一个子图:figure对象下创建一个或多个subplot对象(即axes)用于绘制图像
-
figure中创建子绘图区
plt.subplot(nrows, ncols, plot_number):nrows为子图的行数, ncols为子图列数;
plot_number是指子区域中的第几幅图 。
例:subplot (2,2,3): 2*2的矩阵图中的第3幅图,也可写成subplot(223)
子区域1 子区域2
子区域3 子区域4
(当前区域)案例:
-
创建并定位子绘图区
plt.subplot(121) #创建1行2列的子绘图区,并定位第1幅图绘图区
-
绘制成绩分布柱状图
成绩分布柱状图代码 -
定位雷达图的子绘图区
plt.subplot(122) #并定位第2幅图绘图区 -
定位雷达图的子绘图区
得分率雷达图代码 -
显示图
plt.show()
柱状图显示及位置正常,但雷达图显示出现异常,图表显示空间过小,柱状图显示出现挤压。
- 修改定位雷达图子绘图区
plt.subplot(122,polar=True) #添加极坐标标记参数,并设置为True - 修改画布figure的大小
plt.figure(“综合图”,figsize=(15,8))
#设置figure窗口标题为“综合图”,调整大小为15*8英寸
31.数据可视化
数据可视化指的是将测量或计算产生的数字信息以图形图像的形式呈现给研究者,使他们能够更加直观地观察和提取数据表示的信息
Pandas
Import … as pd
(1) Series
pd.Series(data=None, index=None, dtype=None)
• data参数代表接收的数据,该参数可接收一维数组、列表、字典等;
• index参数代表自定义行标签索引,若该参数没有接收到数据,默认使用0~N的整数索引;
• dtype参数代表数据类型。
(2) DataFrame
pd.DataFrame(data=None, index=None, columns=None, dtype=None)
• data参数代表接收的数据,该参数可以是二维数组、字典(包含Series对象)、Series对象或另一个DataFrame对象等;
• index参数代表自定义行标签索引,若该参数没有接收到数据,默认使用0~N的整数索引;
• dtype参数代表数据类型。