python高级

复习:
	在python中缩进的含义:
		缩进后的代码就是缩进前的最后一行代码的字代码
	变量: 就是一个字母或者单词 ,可以临时存储任意类型的数据
		不能以数字开头,可以以数字结尾
	数据类型:
		整型: int 
		浮点数:float
		布尔值: True False
		字符串:str
		
		列表: list
			特性:可以存储任意类型的数据,可以进行增删改查,通过索引操作
			增:
				append('4')	#在列表的末尾插入一条数据
				insert(indx,valu)	#需要传入插入的位置和插入的数据
				
			删除:
				pop()	#取出元素
				remove('4')	#删除列表中的'4'这个值的元素
				del(list[0])	#删除列表list中的第0号元素
			改:
				list[0] = 'aaa'	#将列表list中的第0号元素的值修改为'aaa'
			查:
				list[0]	#获取列表中的第0号元素
				切片操作:
					b = [1,2,3,4,5]
					print(b[:3])    #从0号元素开始到3号元素停止,不包含索引为3的元素
					print(b[3:])    #从某个索引开始然后取完
					print(b[1:3])   #从索引为1的元素开始到索引为3的元素结束,不包含索引为3的元素
					print(b[0:5:2]) #间隔切片,2为没隔两个元素取一次
		元组:tuple  ()
			特性:不修改,可以通过索引获取数据
				定义元组的时候如果元组的元素只有一个,需要加一个’,‘逗号
				元组可以通过切片获取元素
			tp2 = ((1,2),(3,4)) #二维元组
		字典:dict {}
			特性:数据以键值对的方式存储,可以存储任意类型的数据字典的值),键不能为可变类型,字典可以任意修改内容,无序
			增:
				dict['键'] = '值'
			删:
				del(dc['a'])	#用键删除数据
				dc.pop('键')	#通过键取出字典dc中的值
			改:
				dc['a'] = 111	#通过键直接赋值的方式修改字典中的数据
			查:
				通过键查数据 dc['a']	#获取字典中键为a的值
				获取字典中的所有键:dc.keys()	#获取的键不能直接用,需要先转成列表的格式然后再使用
				获取字典中所有的值:dc.values()	#获取的值不能直接用,需要先转成列表的格式然后再使用
		集合:set {}  
			特性:可以存储任意类型的数据,无序,不可重复,可以更改集合里面的内容
				#由于集合的不可重复特性,经常使用集合来排重
			增:
				add()	#在集合中添加一个元素
				s.update( x )	#在集合中添加元素,元素的值可以是列表,元组,字典等
			删:
				pop()	#从集合中取出一个元素
				s.discard('d')	#删除集合中的指定元素,如果元素不存在也不报错
				s.remove()	#移除指定元素,如果元素不存在会报错
			改:
				改不了
			查:
				只能查整个集合
	if 判断:
		if 条件1:
			达到条件1了之后的操作
		elif 条件2:	#当条件1不满足的时候执行这个条件2
			达到条件2之后的操作
		elif 条件3:		#当条件1和条件2都不满足的时候执行这个条件3
			达到条件3之后的操作
		else:
			以上所有条件都不满足的时候执行
		
	循环:
		for 循环:
			for i in '可迭代对象':
				每次循环需要做的操作
		while循环:
			根据条件来循环,如果条件成立就会一直循环下去
			
			终止循环:
				1.使条件不满足
					在循环的过程中改变某些值使条件不满足
				2.主动终止
					1.直接跳出循环
						break
					2.只停止当前循环
						continue
		while True:
			a+=1
			print('第'+str(a) +'次循环!')
			if a<5:
				continue
			print('continue 之后的动作')
			if a>10:
				break

	字符串格式化:
		#字符串格式  %s
		#整型格式   %d
		#浮点数格式 %f --可以指定小数位 %.nf #浮点数保留n位小数,本身如果不足n位小数就用0代替
		#不区分数据格式的占位符 {}  然后.format(变量) 传值
			a = 5
			b = 6
			c = 14.47
			d = 'aaaa'
			bb = {'a':1,'b':2}
			print('a的值是%d这个数字,b的值是%d,c的值是%.2f'%(a,b,c))
			print('bb的值是{}'.format(bb))
	双for循环应用:
		1.九九乘法表
			for i in range(1,10):
				print('\n') #这个输出是为了换行
				for j in range(1,i+1):
					print('{}*{}={} '.format(j,i,i*j),end='')
		2.冒泡排序
			规则:
				每次拿一个数对比:
					如果后面一个数比当前数小,当前数和后面的数换位
					如果后面的数比当前的数大,当前数不动,大的数继续往后面对比
					 一直将所有的数都对比完
					 已经排好了的数就不再继续对比
					 然后不停的循环这个操作一直到所有的数都从小到大排好顺序
					 
	函数:
		就是一些自定义的代码块,可以根据你的输入产生对应的输出或者是做一些特定的操作
		内置函数:
			1.数据类型:
				int()	#转换成整数
				float()	#转换成浮点数
				complex()	#创建一个复数
				str()	#转换成字符串
				tuple()	#转换成元组
				set()	#转换成集合
				list()	#转换成列表
				dcit()	#转换成字典
			2.进制转换:
				bin()	#转2进制
				oct()	#转8进制
				hex()	#转成16进制
				int(var,n)	#n进制转换成10进制
			3.数学运算:
				sum()	#求和
				min()	#最小值
				max()	#最大值
				pow(a,b)	#求a的b次幂
				abs()	#求绝对值
				divmod()	#返回商和余数
				round(num,n)	#将num四舍五入精确到n位
				len()	#求长度
			4.输入和输出
				print() #打印
				input()	#用户输入内容
				id()	#查询对象的内存地址
					变量 --给数据所在内存地址添加标签
					列表,字典,集合 是可变量,id值不会随着数据的变化而变化
					
				del()	#删除变量
				globals()	#显示系统全局变量
					__变量名__ :系统变量,不用自己去设置 
				reverse()	#用于反转列表中元素
					用法 list(reverse(a))	
					list中有单独的reverse方法
				排序:
				sorted()	#排序 reverse 调整正序还是反序
				list.sort()	#只能用来对列表排序sort() 中可以传reverse参数来决定是升序还是降序排 reverse=True ---降序,默认是升序
				sorted()	#适用于所有数据类型
				降序
				list.sort(reverse=True)
				sorted(reverse=True)
				升序
					默认就是升序
				大小写转换:
					str.upper() #所有字母转大写
					str.lower()	#所有字母转小写
					str.capitalize()	#首字母转大写
					str.title()	#所有单词的首字母转大写
					判断:
						isupper()
						str.islower()
						str.istitle()
				判断是否为数字	str.isdigit()
				isalnum()	#判断字符中是否只包含由数字或者字母 ---通常使用该方法判断字符串中是否含有特殊字符
				判断是否为浮点数 type(浮点数)
				
		自定义函数:
			概念:自己定义一个方法,专门去执行自己想要的动作,或者将某些数据进行处理,可以重复调用,并且可以根据你传入的数据返回对应的结果
			
			创建自定义函数:
				def 函数名():
					需要执行的代码块
			为什么需要自定义函数:
				可以避免重复造轮子,提升工作效率,提升代码效率
				如果有很多地方都需要做重复的动作,那这个时候就可以将这个需要执行的动作使用函数封装起来,需要使用的时候直接调用就行
			局部变量和全局变量:
				全局变量:整个文件中都生效的变量
					
				局部变量:只对某一区域生效的变量
					比如在函数中定义变量就只在当前函数中生效
					局部变量也可以设置成全局变量 ---global 变量名 #通过global 函数可以将局部变量设置为全局变量
					在函数中的局部变量就算设置为全局变量后也不能直接就使用,需要先调用函数才会将该函数中的变量创建
			#例题:
				1.定义一个函数,传入两个参数,返回两个参数的和
				2.定义一个函数,传入姓名,省,市,县/区,组成地址
				3.定义一个函数,传入两个参数,判断两个参数的大小
			
			传参方式:
				1. 实参 ---必须要传的参数
					def add(a,b):	#使用函数add的时候 必须要传参数 a和参数b 不传就会报错
						c = a+b
					使用时,传参和函数内的参数值变量的位置是一一对应
				2. 形参 ---非必传参数 --在定义函数的时候会给参数一个默认值
					def add_1(a=2,b=2):	#使用函数add_1的使用,可以不用传参数,当不传参数的时候就是使用a和b参数的默认值,传参数的时候会将默认值覆盖掉
						c = a+b
				3.关键字传参:
					使用参数的关键字然后赋值
					def add(a,b):
						c = a+b
					传参方式1:
						add(参数1,参数2)	#这种方式传参,参数的顺序是固定,和创建函数时的关键字位置一一对应
					传参方式2:
						add(a=参数1,b=参数2)	#这种方式传参就是关键字传参--这种方式传参 参数的顺序可以更改
				4.不定长传参:
					在创建函数的时候 参数变量名前面加一个*号,则这个传参就可以传任意数量的参数
					def address(*ads):	#使用时,可以更加需要选择传一个还是多个参数
						print(ads)
					以键值对的方式传参:
						在创建函数的时候 参数变量名前面加两个*号,则这个传参就可以以键值对的方式传参,可以传任意数量的参数
							使用方式 :键=值的方式传入
						def address(**ads):	#使用时,可以更加需要选择传一个还是多个参数
							print(ads)
				
			传参的类型:
				所有类型的数据都可以作为参数传递
				可以将值用变量存储起来,然后使用变量名传参
				函数也可以做参数传递
				
			匿名函数:
				lambda x:x+1
				等同于:
				# def a1(x):
					#     b = x+1
					#     return b
			函数的调用:
				正常的调用:函数名() #--只有加了括号 函数才会被调用,否则不会调用
				函数可以调用函数
				函数可以自己调用自己 ---这种函数叫做递归函数	
	#编辑器常识:
		1. 批量注释/取消注释代码  ---ctrl + /
		2. 查看某个方法或者函数的源代码  ---安装ctrl 然后将鼠标移动到 需要查看的方法名称上,然后鼠标左键点击
		3.缩进:
			批量缩进:选中要缩进的代码 然后按tab键
			批量反向缩进:选中要反向缩进的代码 然后同时按shift键 + tab键
	例题:小项目 账号登陆、注册、修改密码系统
		1.用字典保存账号密码
		2.用函数定义各个模块
		3.通过模块调用使用功能
	
	类和面向对象:
		创建一个类:
			class 类名:	#备注:类名的所有单词的首字母需要大写 ---这个规则不是强制
				类中执行的操作
			类中可以有变量和函数:
				类中的变量叫做类的属性	---通过self标记
				类中的函数叫做类的方法	---通过self标记
		实例化对象
			变量 = 类名()	#用变量将类的调用存起来的过程就是类的实例化
		调用类中的方法:
			1.直接调用
				类名().方法名()
			2. 先实例化然后使用实例化的变量名去调用
				tc = Test_Cxy009()  #类的实例化
				tc.a()
				
		类中的 全局变量局部变量:
			在类外面的变量 类中所有地方都可以用 ---整个文件的全局变量
			在类里面,但是在类中的函数外面  ---是类的属性,所有的方法中都可以使用,但是需要加上self.的前缀
			在类的方法中定义的变量:
				直接定义的变量 ---只有当前方法中可用
				定义变量的时候在变量的名字前面加上了self.前缀(代表是类的属性)  ----整个类中的方法都可以使用
		修改类的属性:
			直接调用类的属性然后赋值 ----就可以直接修改类的属性
				修改类的数据只是修改当前实例中的属性,而不会对原来创建的类有任何的改变
					如果同时有多个实例化,他们之间是完全独立互不影响的
			属性可以通过参数的方式传入
				类的方法中可以传参,调用类的方法去传参
					    def a(self,bb):
							self.bb = bb    #将方法中传入的参数转换成类的属性
							print(bb)
							print(self.bb)
				可以直接在实例化的时候传参:
					使用 __init__方法	#每个类中只允许有一个__init__方法,这个方法比较特殊,不需要主动调用,会在类实例化的时候自动执行
											#在这个方法中设置的参数,只能通过实例化的时候在类名(__init__方法的参数)中传递
										
		类的继承与多态:
			class 子类类名(父类名):	---->类的继承 
			特性:子类继承父类后 拥有父类的一切方法和属性
		重写类的方法
			子类中定义一个和父类相同的名字的方法, -----这种操作就叫做重写父类的方法
			子类重写父类的方法后 该重写的方法子在当前子类(或者子类的子类)中生效,不直接改变父类原有的方法
		类的多态:
			一个类可以拥有多个子类,并且多个子类都可以对父类的同一方法进行重写  ----这种特性就叫做类的多态
		
	捕获异常:
		python的异常处理:
			try:
				代码块
			except 错误类型:
				报错后需要做的动作
			else:
				代码块		#当代码没有错误的时候执行的操作
			finally:
				代码块		#不管代码是否报错都执行
		错误类型:
			KeyError	#键错误
			IndexError	#索引错误
			NameError	#变量名称未定义错误
			AttributeError	#属性错误
			Exception	#可以捕获所有类型的错误
							#有两种错误不能捕获
								1.语法错误不能捕获
								2.缩进错误不能捕获
		
	python的库:
		实际也是一些.py文件,python自己没有实现的功能,其他人实现了,然后做成一个模块,其他人可以下载后使用(导入后使用)
		操作数据库
			1.安装第三方库
				pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
		操作excel:
			1.安装 xlrd 操作库
				需要导入第三方库 xlrd
				pip install xlrd==1.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
				#python专有的安装第三方库的方式
				更新 pip 版本:
					python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
				查看当前已经安装了的第三方库:
					pip list 
			2. 使用 
				导入 xlrd 
				import xlrd
			3. 详细用法:
				1. 打开要操作的excel文件 
					path = r'./test009.xlsx'
					e = xlrd.open_workbook(path)
				2. 选定需要操作的表格
					获取当前excel文件中所有表格的名字:
						st = e.sheet_names()	#获取所有表格的名字
					st_name = e.sheet_by_name('test001')  #通过表格名字的方式选定表格
					st_name = e.sheet_by_index(0)   #通过索引的方式选定表格
				3. 进行列操作
					ncol = st_name.ncols    #获取当前表格的有效列数
					col_data = st_name.col_values(1)    #返回第n列的所有内容(以0为第一列)
				4.进行行操作
					nrow = st_name.nrows   #获取当前表格的有效行数
					row_data1 = st_name.row_values(3)   #获取第n行的内容
				5.单元格操作
					data1 = st_name.cell_value(2,1)	#获取行索引为2,列索引为1的单元格信息
			
			
		文件操作:
			file = open(path,','mode',encodein='utf-8')	#path文件路径,mode打开文件方式,encodein文件编码格式
			
			文件打开模式:
				“r”打开阅读(默认)
				“w”打开进行写入,首先截断文件
				“x”创建一个新文件并打开它进行写入
				“a”打开进行写入,如果文件存在,则附加到文件末尾
				“b”二进制模式
					二进制模式不能直接使用,需要配合其他方式使用
				“t”文本模式(默认)
			读取文件内容:
				file.read()
			写入文件内容:
				file.write('要写入的内容')
			每次打开文件后需要关闭:
			 file.close()
		自动关闭文件(with方法会在合适的时候自动关闭文件,不需要每次手动关闭)	 
			with open(path,'w') as file:	
		
		json模块
		os模块
		正则表达式模块