python笔记

python

翻译的方式有两种:

​ 编译:在程序运行之前进行翻译,翻译后会生成一个新的文件,后续每次运行都是执行这个翻译后的文件,因此执行效率要高一些 —— Java

​ 解释:在程序运行时翻译,每个语句都要执行的时候才会翻译,每次运行都需要翻译一次,因此执行效率相对来说要低一些 —— python

​ 解释型语言通常适用于:1.对运行速度要求不高(脚本,接口辅助开发等) 2.对跨平台(对操作系统需要兼容)有要求的场景

标准库:keyword 标准库

​ random标准库

​ random.randint — 随机整数

​ time 标准库

​ time.sleep — 延时函数

​ re标准库

第三方库:

pycharm使用:新建项目时,添加项目解释器

数据类型转换规则
    1)使用str()函数转为字符串,所有的数据类型都可以转成字符串
    2)使用int()/float()转为数值型,
        字符串里面的值如果是数字,就可以转为数值
        布尔值可以直接转为数值     True——1   False——0
    3)使用bool()转换为布尔值
    	所有的0和空转换为布尔值,结果都是False
    	其他非0和非空转为布尔值为Ture
    注意:所有的数据类型转换,都是产生了一个新的值,没有改变原来的值

输入和输出:
    1.输入:将数据打印到标准输出设备上(屏幕),使用print()函数
        1)每个print()函数都会自动换行
        2)多行语句要对齐
        3)如果想要打印空行,直接使用print()里面不写内容
        4)一个print()函数可以打印多个内容,多个内容用逗号隔开
    2.输入:从标准设备中读取数据,使用input()函数
        1)会一直等待用户输入
        2)以回车结束
        3)使用一个变量来接收输入的值
        4)所有输入的内容都会返回字符串
        5input()函数里面可以加参数,用来提示

标识符:用于变量,函数,类,模块等名字
规则:
    1)只能有字母、数字、下划线组成,并且不能以数字开头
    2)下划线开头的都是有特殊意义的,所以尽量不要以下划线开头
    3)严格区分大小写
    4)不能和内置函数,关键字,库名重复
        print(dir(__builtins__)) —— 查看python有哪些内置函数
        关键字:None,false,
            import keyword —— 导入keyword标准库
            print(keyword.kwlist) —— 查看python里面的关键字
规范:
    1)见名知意
    2)驼峰命名法:
        1>.大驼峰:每一个单词的首字母都大写 如:MyName  (类名使用)2>.小驼峰:第一个单词首字母小写,后面单词的首字母都大写。如:myName (变量遵守)
    3)下划线分割法:把所有的单词都用下划线来分隔。 如:my_name
    变量:等号左边的是变量,可以保存任何内容
    对象:等号右边的是对象,拥有一个实际的值

字符串格式化方式:
    1)使用%格式化
        使用一段字符串作为模板,模板中有格式符,格式符的作用是为真实值预留位置
        语法:模板%值
        格式占位符:
            %s —— 对字符串占位
                %6s —— 指定宽度6
            %f —— 对浮点占位
                保留小数点后两位 %.2f
                %6.2f —— 浮点数指定整体宽度为6,并保留小数点后2%06.2f —— 浮点数指定整体宽度为6,并保留小数点后2位,不足的位数用0不齐
            %d —— 对整数占位
                %6d —— 指定宽度位6
                %06d —— 指定宽度位6,不足以0补齐
        注意:传入真实值的时候,要按照预留的顺序输入
    2)使用f来进行格式化
        语法:f'字符串模板{}'  # 关键点
            f'字符串模板{age:>6}' —— 指定宽度为6,右对齐
            f'字符串模板{小数:.2f}' —— 保留2位小数
            f'字符串模板{小数:06.2f}' —— 保留两位小数,指定宽度60补齐
    3)字符串里面的特殊字符
        \n —— 换行符
        \t —— 制表符 tab键
        \\n —— \n 前面再加 \ ,代表转义符,会把有特殊意义的字符转成没有特殊意义的  —— r'字符串\n'
        print('我说,\'你好\'') —— 输出”我说,你好“

运算符:
    1)算数运算符
        % —— 取余     // —— 取整除后的商    ** —— 幂运算符
    2)比较运算符   返回的结果是布尔值,成立为Ture,不成立为False
        == —— 两个等号是比较,一个等号是赋值
    3)赋值运算符
        =   +=
    4)逻辑运算符
        andornot 非
        优先级:not > and > or
    5)成员运算符     返回结果是布尔值   判断字符串
        in 判断包含返回Ture,不包含返回False
        not in 不包含返回Ture,包含返回False
            print(a in b) —— b是否 包含a

        用列表来判断数字包含关系;
            f = 1; g = [1, 2, 3]
            print(f in g)
    6)身份运算符     返回结果是布尔值    对象
        is 判断是否指向同一对象
        is not
        id()函数可以打印出对象在内存空间的地址

    优先级:幂运算符 > 算数运算符 > 比较运算符 > 赋值运算符 > 身份运算符 > 成员运算符 > 逻辑运算符

程序设计三种基本结构:
    1.顺序结构:程序从上往下依次执行
    2.选择结构:根据条件成立与否来决定执行的代码块
    3.循环结构: 

选择结构:
    语法:
        if 条件:(True)
            执行里面的代码
        else:
            执行里面的代码
	语法2if 条件:
			执行里面的代码
		elif 条件:
			执行里面的代码
		else
			执行里面的代码
	if...if ——每一个if判断都会执行
	
			b = ' '
			if b:
				print('b为真')
			--会打印b为真
循环
1.while循环:当条件成立时,一直执行某段代码,直到该条件不成立
	语法:		初始值
			  while 条件:
			  	循环体
			  	初始值变化
			  
2.for循环
	语法:for i in range(1,11)
		for...in...  i是变量用来接收range()函数里面的值
		range()代表整数序列-前闭后开
		每次循环自动去range()里面从左到右依次取值,赋给变量i
		range是整数序列,不能用于字符串

for循环更改适用于固定循环次数,或者遍历一个序列
while循环更使用于一些逻辑条件判断
如果for循环能够实现,就不用while循环

	打印55*
	for i in range(1,6):
		for j in range(1,6):
			if i == 5:
				print('*', end = '\n')
			print('*', end = '\t')
		
for ... eles ... —— 如果for都执行完了,就会执行else,但是如果for循环里面有一次执行到break,就跳出循环

len(password) in range(6, 11): # 判断password的长度在6-10

数据结构:用来存储一组相关数据的容器
python的数据结构:
	1.列表	2.元组	3.字典	4.集合

列表(list):
	1.列表使用一对[]定义,里面可以存储任意类型的数据,多个值用逗号隔开;
	2.列表是有序的数据结构,可以通过索引取值,索引从左到右,从0开始
	3.列表是可变的
列表常用函数:
	1.len() —— 返回列表的长度
	2.append() —— 往列表的末尾追加一个值
	3.insert() —— 往列表指定的索引位置插入一个值
	4.remove() —— 删除列表中第一次出现指定的值
	5.pop() —— 默认删除最后一个,也可以指定索引进行删除
	6.sort() —— 升序排序;如果想要降序-sort(reverse=True)
	7.index() —— 返回指定值的索引
	8.count() —— 返回指定值出现的次数

元组(tuple):
	1.元组使用一对()定义,可以保存任意类型的数据
	2.元组是有序的数据结构
	3.元组是不可变
	4.如果要定义只有一个值的元组,需要在这个值后面加逗号 如;c = (3,)
		因为元组不可变的特点,通常使用元组来定义常量,如:数据库地址,账号密码等

字典(dict):
	1.字典使用一对{}定义,里面的数据使用键值对来保存,键值对用冒号分隔,冒号左边是键,右边是值
	2.一个字典里面,键是不能重复的,但是值是可以重复的
	3.键一般是字符串或数值,值可以是任意类型
	4.字典是无序的数据结构
	5.字典是可变的
字典的有点:
	1.数据对应关系清晰,因为里面的数据都是键值对
	2.查找方便,不需要通过循环,可以直接用键来取值
	3.因为字典无序,所以可以随意增加,不会影响之前的代码
字典的常用方法:
	1.增加和修改都是通过键=值,如:dict1['gae'] = 20;如果键存在,则为修改,如果键不存在,则为添加
	2.pop() —— 删除指定键值对
	3.查询:keys() —— 遍历键;直接遍历 for i in dict: —— 默认取键
			values() —— 遍历值
			items() —— 遍历键和值,需要用两个变量来接收
			get() —— 通过键来查询,如果查询不存在的键会返回None

集合(set)1.集合使用一对{}定义,但是集合不是键值对
	2.集合不可重复,会自动去重
	3.集合是无序的数据结构
	4.集合是可变的,但只能增加和删除,不能修改

	b = {} —— 空字典		c = set() —— 空集合
	#列表去重#
	a = [1, 2, 3, 5, 2, 6, 3]
	print(list(set(a)))

			
字符串 —— str
	1.字符串使用引号定义的
	2.字符串是有序的
	3.字符串不可变的,所有对字符串的修改,都不是改变字符串原来的值,而是产生一个新的值
字符串和列表之间的转换
	str.split():默认按照空白字符进行切割,转换成一个列表
	str.split('\n'):以换行符切割,
	str.split('m'):以m切割,如果m在开头或者结尾,都会产生一个空格符
		如果以不在字符串中的元素来切割,就会把整个字符串打印在列表中
	
	print(' '.join(list1)):使用空格把列表拼接成字符串
	
	str.strip():去掉字符串前后的空白字符(空格,\n,\t)
		lstrip():去掉走边的		rstrip():去掉右边的
	str.strip('*#'):去掉指定字符,*#是没有顺序的,是两个字符
	
	str.count('zhou'):统计‘zhou’在字符串中出现的次数,默认从索引0开始,统计到结束位置,索引的位置前闭后开
	str.fand('zhou'):找到第一次出现'zhou'的索引,先满足'zhou',在返回第一个字符出现的索引,可以添加开始和结束的索引
	str.index():与fand方法一样
		index没有找到会报错,fand没有找打输出-1
	str.startswith('my'):判断字符串是否以'my'开头,返回Ture/Fals
		str.startswith('my', 12):从索引12 的位置判断,是否是12开始
		str.endswith('zhou'):判断是否以'zhou'结尾
	str.replace('zhou', 'zhang'):将所有'zhou'替换成'zhang'
		str.replace('zhou', 'zhang', 1):替换一次
	str.isdigit():如果str字符串是纯数字,返回Ture/False
	str.isalpha():如果str字符串是纯字母,返回Ture/False;汉字也会被判断为字母
	str.encode()/str.decode():编码和解码
	
	
序列:有序的都是序列,列表,元组,字符串
	序列两个主要特征:
		1.索引操作符:可以通过索引从序列中抓取一个特定值
			索引从左往右,从0开始,从右往左,从-1开始
		2.切片操作符:可以通过索引从序列中抓取一部分值
			切片操作符也是用一对[],括号有一对数字,并用冒号隔开;第一个数字代表切片开始的位置,第二个数字代表切片结束的位置,并且是前闭后开
			print(c[:]):默认切出所有 print(c[::]);c为字符串
			print(c[::2]):以步长为2来取,默认步长是1
			print(c[::-1]):表示倒着取值
		
		判断用户输入的是否为回文数
			number = input('输入数字')
			if number == number(::-1):
				print(f'{number}是一个回文数')


列表生成式/列表推导式
	生成式:new = [i*0.9 for i in before]
	适用场景:从源列表一次取值,做同样的处理,在添加到新的列表中
	
函数:是一段可重用的程序语句,实现某一个具体的功能
	def 函数名():
		函数体
	函数名() # 调用函数
	def只是定义函数,不是调用
	
	def drinks(no): # 如果在定义函数的时候,有未知数参与,形式参数用来占位;多个形参用逗号隔开
	
函数里面的参数:
	1.形参:在定义函数的时候,如果有未知数据的参与,就可以在函数后面的括号里设置形参
	2.实参:如果定义函数的时候,设置了形参,在调用函数的时候就必须要传入对应的实参
	3.默认参数:给形参赋默认值,就叫默认参数/缺省参数 def info(xx, xx, ss = 'asd');
		如果传入实参,就以实参为准;
		如果形参设置了默认参数,后面的形参都要设置默认值
	4.关键字参数:在传递实参的时候,指定形参的名字  info(tag = '这碗大')
		关注键字可以颠倒形参的顺序
	了解:不定长参数: def f1(*args): # *args 不定长参数
			args是元组
			
变量:
	1.全局变量:定义在函数外边,作用于去全局(函数内部和外部都可以使用)
	2.局部变量:定义在函数里面,只作用于函数内部
		局部变量的优先级高于全局变量,当局部和全局变量重名,以局部为准;
		global关键字可以提升局部变量的作用域,可以把局部变量升级为全局变量;
		
函数的return
	1.跳出函数,只要执行到return,函数后面的代码就不会被执行
	2.给函数设置一个返回值,所有的函数都默认返回None;返回值可以供后续使用
		return 'basketball'
	函数中使用return,调用函数,是看不到返回值地方;返回值必须打印才能看到;多个返回值可以使用多个变量来接收
	
定义函数三部曲:
	1.确认函数的名字(见名知意)
	2.确认函数有没有形参(考虑函数是否有未知数据的参与,有,就设置成形参)
	3.确定函数有没有返回值(a.如果后续的程序要使用当前函数里面的数据b.需求里明确说明要返回值)
	
递归函数:一个函数在内部调用了自己
	递归的死循环,每次调用函数所占用的内存不会释放,所以递归到一定的深度就会报错 
核心思想:每一次递归,整体问题都要比原来减少,并且递归到一定深度时,要给出结果结束递归
	
	
文件操作(文本文件)
	1.打开文件
		使用open()函数,后面要传入两个参数,一个参数时文件的路径,第二个参数时文件的打开方式,第三个参数为选传,如果被打开的文件的字符集是utf8,就需要加第三个参数encoding='utf8',默认gbk打开
			路径:	绝对路径:从盘符开始,一层一层的路径
				  相对路径:相对于当前文件,目标文件的路径
		打开方式:
			r:只读 打开不存在的文件,会报错
			w:只写(覆盖写入,打开文件后,会先把文件清空);打开不存在的文件,会新建
			a:只写(追加) append
		文件可读可写方式:
			r+ :可读可写,打开文件后,指针在文件开头;打开不存在的文件,会报错
				写入后指针在文件末尾,使用file.seek(0)将指针调到开头;
				如果打开文件后直接写入,会覆盖掉原来内容;
			w+ :打开文件后,会先清空文件;打开不存在的文件,会新建
			a+ :打开文件后,指针会在文件的末尾;打开不存在的文件,会新建
	2.读取/操作文件
		读取的方法:
			read:读取所有,返回字符串
				s.read(3):指定对三个字符
			s.readline():读取一行
			s.readlines():读取所有,返回列表,文件中的一行为列表中的一个值
			s.seek(0):如果读取完所有内容后,指针会移动到末尾,使用seek方法把指针移动到0
		写入的方法:
        	s.write('字符串') 只能写入字符串
        	s.writelines(['123', '234']) 可写入集合,集合中的元素必须是字符串,也可写入字符串
        	
	3.关闭文件
		close()
	
    with open 语法:可以自动关闭文件
		with open('路径', '打开方式', encoding='') as file:  # 打开文件命名为file
			all = file.read()
		print(file.closed)  # closed验证文件是否关闭,返回True
		
	复制图片:
		with open('图片路径', 'rb') as file:	# rb 用来读取二进制文件(图片,视频,音频...)
			all = flie.read()
		with open('新路径', 'wb') as file:	# wb 用来写入二进制文件
			file.write(all)
			

模块和包
	包:一个python文件夹
	模块:一个python文件
	
	导入模块:
	import random	#导入整个random模块,就可以使用random里面的所有函数
	random.randint(1, 4)	#使用'模块名.函数'来使用
	
	from random import randint as r		#从random模块里面,只导入了randint函数; as用来取别名
	print(randint(1, 4))
	
	导入自定义模块:
		如果别导入的模块和当前文件在同一路径下,可以直接import导入;
			注意:如果别导入的模块里面有调用函数或者打印语句,导入后会自动执行代码
		如果被导入模块不在同一路径下,就需要从项目名的下一层开始导入
		如果在根目录下,直接导入
		

异常处理
	
	try:	#尝试执行里面的代码
		number = int(input('输入数字:'))
		print(100/number)
	except Exception as e:	#如果try里面的代码报错会直接执行except里面的代码,然后程序继续
							#如果try里面的代码没有报错,就会跳过except
							#Exception 代表所有异常的父类,包含了所有的错误类型
							#as e 代表把这个错误对象赋值给变量e
		print('try里面代码报错')
		print(e)
	else:	#如果try里面的代码没有报错,就会执行else里面的代码,出错就跳过else
		print('没错')
	finally:	#不管try不管有没有报错,都会执行finally里面的代码
				#通常在函数里面except和else里面都写了return的时候使用
		print('执行')
	print('后续代码')
	

程序调试:debug
	1.在需要调试和行数打一个断点,右键点击调试,程序会停在断点的行数(还未执行的一行)
	2.点击'步过'(F8)按键,程序会执行当前代码
	

python连接数据库
	如果第一次连接数据库,需要先下载第三方数据库 pymysql
	下载方式:1)打开cmd 输入命令 pip install pymysql 进行下载
			2)使用pycharm下载:文件-设置-python解释器-点击+-输入pymysql-点击安装
	1.先导入pymysql
		import pymysql
	2.建立连接对象	#connect用来建立连接对象
		db = pymysql.connect(
			host='localhost',	#要连接的数据库的ip
			port=3306,	#数据库的端口号,必须以int类型传入
			user='root',
			password='123456'	#以str传入
			db=''	#要连接的数据库名
			charset='utf8'	#字符集
		)
	3.创建游标对象:使用连接对象调用cursor方法来创建游标对象,后续对数据库的操作都使用游标对象来实现
		link = db.cursor()
	4.操作数据库:execute()函数用来执行sql语句
		link.execute('sql语句')	#只执行查询语句,查询结果现在还保存在游标对象里
		all = link.fetchall()	#把游标对象里面保存的内容读取出来;游标会停在尾部
									link.scroll(0, 'absolute') 把游标移动到最前面
			link.fetchone() —— 读取一行 返回元组
			link.fetchmany(1) —— 读取指定行数的数据 返回元组嵌套全组
		print(all)
		
		link.execute('sql插入数据语句')
		db.commit()	#如果对数据库是增删改操作,就必须
	
		数据库参数化:
			id = 4
			name = 'xioaming'
			sex = 'man'
			link.execute('insert into emp values(%s, %s, %s),(id, name, sex)')
			link.execute(f'insert into emp values({id}, "{name}", "{sex}")')
			link.executemany('insert into emp values(%s, %s, %s),[(6, 'xiaob', 'man')]')
				可以插入多条数据
			
		将一张表的内容复制到另一张表
			link.execute('select * from info')
			all = link.fetchall()
			link.executemany('insert into info values(%s, %s, %s)', all)
	5.关闭游标对象
		link.close()
	6.关闭连接对象
		db.close()
	
	
面向过程:是一种以事件为中心的编程思想,重点关注功能实现的步骤	
	优点:相对来说条例更清晰,更易读;
	缺点:重复代码多,函数量大,不利于后期维护
面向对象:是一种以对象为中心的编程思想,重点关注结果;面向对象的核心思想就是封装,把相关的功能和属性封装到一个类里面
	1.类:对同一类事物的总体描述
		代码:
			属性(静态特征):
				1)类属性(静态属性):直接定义在类里面,这个类的所有对象都拥有一样的值
					在类外边类属性可以被类和对象调用
				2)实例属性:定义在构造方法里面,不同的对象所拥有的值不一样
					只能被对象调用
			方法(动态功能)
				1)构造方法(初始化方法/init方法):
					调用时机:在实例化对象的时候,自动调用;通常用来给实例属性赋值
				2)实例方法:
					类里面的普通方法,都是实例方法;第一个参数是self,代表当前对象
					类不能直接调用实例方法,对象可以调用实例方法
					在其他方法里面,需要用self来调用实例方法
				3)类方法:通常一个类的所有对象都拥有的方法,就可以定义成类方法
					类方法前面必须加上@classmethod装饰器(在不改变代码的前提下,让代码实现更多功能)
                        @classmethod
                        def function(cls):	# 类方法的第一次参数必须是cls,代表当前类
                            print('这是一个类方法')
					对象和类都可调用类方法
					不能在类方法里面调用实例方法,反之可以
					调用类属性用cls.类属性
				4)静态方法:跟类无关的工具方法(优先级最低)什么方法都调用不了
					必须使用@staticmethod装饰器
						@staticmethod
						def jingtai():
							print('静态方法')
	2.对象:从类里面实例化出来的一个实实在在的对象
	
	面向对象的三大特性:
		1)封装:把相关的属性和方法都封装到类里面,目的是增加代码的复用性(以及安全性)
		2)继承:子类可以继承父类的属性和方法
				被继承的类叫父类/基类/超类
				继承后的类叫子类/导出类
					class Animal:	# 父类
					class Cat(Animal):	# 子类
				父类可以被多个子类继承
				可以继承多父类,如果有相同的属性或方法,以继承到的第一个父类为准
		3)多态:当子类和父类拥有相同的属性或方法时,子类会覆盖掉父类的方法/属性,总是调用自己的
	
	
正则表达式:是一种用来描述某种字符串规则的通用逻辑公式,使用预先定义好的正则表达式,来检索字符串中满足规则的文本
	re标准库:
		re.findall():查找所有满足条件的文本,以列表的形式返回
		re.match()
		re.search()
		上面三个方法,里面必须传入两个参数,第一个参数是正则表达,第二个参数是要查找的字符串,第三个参数为选传,re.I-代表不区分大小写;re.S-匹配内容包含换行符
	
常用元字符:
	^ 匹配开头	re.findall(r'^sd', str1)判断字符串str1是否以sd开头,是返回sd列表,否返回[]
	$ 匹配结尾	re.findall(r'sd$', str1)判断字符串str1是否以sd结尾
	[] 选择匹配里面的单个字符	re.findall(r'[asd]', str1)匹配里面的单个字符,匹配a,b,c
	(|) 选择匹配里面的字符串	re.findall(r'(ad|as)', str1)匹配组合字符串,返回ad或as
	{} 控制前一个字符的数量	re.findall(r'ab{2}', str1)匹配abb
		{1,3}最多匹配3个,最少匹配1个,优先匹配最多的
	\d 匹配数字
		\d\d = \d{2}匹配两位数
		[0-9] 匹配0-9的数字
	\s 匹配空白字符
	\w 匹配字母,数字,下划线(包括汉字)
		[a-z\d_] 匹配字母数字下划线
	. 匹配除\n以外的任意字符
		re.findall(r'\.', str1) 匹配普通字符.		匹配一些特殊字符用\转义
		
	* 匹配前一个字符0-无限次 等同于{0,}
	+ 匹配前一个字符1-无限次 等同于{1,}
	? 匹配前一个字符0-1次 等同于{0,1}
	默认贪婪模式,会优先匹配更多条件

match():从字符串开头的位置进行匹配,如果匹配成功,返回的是match对象,匹配失败返回None
	result = re.match(r'python', str)
	result.group() —— group方法提取对象的结果内容
	result.span() —— span方法提取索引
	
search():从字符串第一次出现对应内容的位置进行匹配,如果匹配成功,返回的是search对象,匹配失败返回None
	result.group() —— group方法提取对象的结果内容
	result.span() —— span方法提取索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北屿807

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值