python 基础操作
1.Python 的装饰器是什么?
- 本质上是一个 Python 函数
- 为已存在的方法提供额外的功能
- 可以将大量与方法本身提供的功能无关的代码提取出来,方便重用
2.Python 的装饰器一般是用来干嘛?
- 可以直接用框架提供的装饰器,一般会用到 pytest、allure 的装饰器,以下是自己写的:
- 异常捕捉:会给自己封装的每个方法加上这个异常捕捉装饰器,如果调用的封装方法报错了,就会进入这个装饰器,捕捉到指定异常后,我会刷新页面,再次执行刚刚报错的封装方法,然后会记录一次失败日志
- 日志:一般自己封装的方法都希望有日志,那如果每个封装的方法里单独调用日志类就会显得很臃肿重复,所以可以用一个日志装饰器代替
- 前置操作:比如多个方法执行前都需要调用同一个方法,那可以将依赖方法写在装饰器中
- 后置操作:比如每次执行方法后都需要还原数据集,可以将清理操作写在装饰器中
- 权限校验:执行方法前先进行权限校验,校验通过才会允许执行方法
3.return与yieid的区别
- return 是返回值后结束,不在执行函数体内的代码
- yieid 是返回值后暂停,此时是一个生成器,等待下一次调用。下次则会从yieid后继续执行函数内代码。
4.python 连接数据库操作
5.python中mock 的使用
通过mock.Mock() 进行mock返回值
6.open与with open 读写模式
1)open的使用方法
打开文件:file=open("路径+文件名",“读写模式”) 注意:打开文件使用完成后,记得关闭。否则长时间会导致内存泄漏。
一般读写模式有:
w 以写的方式打开(会覆盖原有的文件)
r 以只读的方式打开
a 以追加的模式打开(在原文件的末尾追加要写入的数据,不覆盖原文件)
b 以二进制文件的方式打开
rb 以二进制读的方式打开 注意:常用于文件上传内使用
wb 以二进制写的方式打开
ab 以二进制追加的模式打开
2)with open的使用方法 (可以open操作无论成功失败,都会自动关闭文件)
1)with open("path_file", "r") as f1: # 以读取的方式打开file文件,并且将文件的所有内容存储到f1变量中 path_file是file文件的文件路径(path)和文件名(file)
f2 = f1.readlines() # 将file文件中的所有行都读取,并且存储到变量f2中
for line in f2: # 从file文件中的所有行里,每次提取一行,进行后续的操作
2)with open("path_file", "w") as f1: # 以写入的方式打开file文件,并将文件存储到f1变量中
7、正则表达式
使用场景与模块
1)适合用来对匹配字符串,提取相关信息。使用 re 模块。
常见函数
1)re.match 含义:从字符串的起始位置匹配,如不是起始位置返回none
语法:*re.match(匹配的正则表达式, 要匹配的字符串)
2)re.findall 含义:找到正则匹配的所有字串,返回一个列表
8、枚举,使用枚举值:类.name.value
类继承enum这个库,就是枚举类。枚举其实也就是常量,但跟常量不一样的是,枚举不能在使用中修改,不能类.name.value = 新值。
同时枚举使用 @unique这个装饰器,可以保持枚举名称的唯一性,当不唯一是会报错。
枚举的使用多是在对数据的管理,统一抽离出来,方便修改应用。
9、异常处理
1)异常处理格式: try 执行代码块,except 异常类型块 as 实例;Exception 是万能异常处理
2)一个try 至少对应一个except,也可对应多个except。同时try/except 后可以继续else,当无异常仍可执行else。
3)try...finally...语句无论是否发生异常都将会执行最后的代码,比如打开文件后,可以finally 关闭文件。
4)常用的异常处理类型:
- 找不到文件打开。 IOError类型的错误
- assert 断言语句失败。 AssertionError
- 传入的对象类型与要求不符。 TypeError
- 使用一个未赋予对象的变量。 NameError
10、抛出异常
为什么要抛出异常?
1)对于异常场景可以主动抛出然后处理,或者进行提示。比如余额不足无法体现,提前抛出异常。
抛出异常的方法?
1)raise 异常类型 (value)
11、openpyxl
用于读取/写入Excel 2010 xlsx 、xlsm 、xltx 、xltm 文件
12、深拷贝与浅拷贝
浅拷贝:直接copy使用,拷贝父对象不拷贝子对象,当父对象改变,子对象也会改变。
深拷贝:导入copy模块,使用copy.deepcopy 使用,同事拷贝父对象与子对象。不受原对象影响。
13、给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
解答思路:先判断字符串的长度是否为奇数,如是则false。如为0 则true。
然后在把内容存成字符串,循环判断是否存在同组key和value。存在删除,不存在就写入列表内。最终列表为空则是true,反之false
class Solution: def isValid(self, s: str) -> bool: len_s=len(s) if len_s%2 !=0: return False if len_s==0: return True #利用进栈出栈的思想 str_dict={'(':')','[':']','{':'}'} stacked=[] for i in range(len_s): #判断stacked是否为空,以及stacked的最后一个元素是否存在于字典的关键字之中 #判断字符串中的下一个字符是否与stacked中存储的最后一个元素相等,相等则删除stacked中的最后一个元素 #不相等则存入stacked之中,用于接下来的判断 if stacked and stacked[-1] in str_dict.keys() and s[i]==str_dict[stacked[-1]]: stacked.pop() else: stacked.append(s[i]) #若输入为有效字符串则最终stacked中的左右元素将会被完全删除 if stacked==[]: return True else: return False
14、列表如何去重
set
15、文件如何排序
16、字符串如何去掉某些字符
replace
17、多线程使用
#多线程实例 import time import threading def mark(index): print("线程使用,第%d次"%index) #暂停一秒,不然看不到效果哦 time.sleep(1) if __name__=="__main__": for i in range(6): #定义子线程,执行mark函数 t=threading.Thread(target=mark,args=(i,)) #启动子线程 t.start()