12-Python编程基础
12-Python编程基础
001-Python中的self参数有什么作用?
实例方法的第一个参数通常定义为self,对象在调用实例方法时,会将对象本身当成第一个参数,传递给self接收。在方法内部可以通过self去访问对象,获取对象的属性和调用相关的方法。
002-匿名函数怎样做的?
python中匿名函数是用lambda表达的。语法格式是lambda 参数:要返回的表达式
003-存入字典里的数据有没有先后排序?
存入字典里的数据没有先后顺序。
004-finally里面的代码一定会执行吗?
如果try一定会执行,那么finally一定会执行。 要看执行时,逻辑会不会走到try
005-如何将字符串转换为小写?
str.lower()
006-对Python的继承和多态的了解?父类可以用子类的方法吗?
Python可以实现单继承和多重继承,子类可以使用父类的方法,但是父类不能直接使用子类方法。
007-python如何将json写到文件里
这个题目应该是如何把字典转换成json数据然后写到文件中,非常简单,通过json模块的dump函数结合open函数就可以实现例如: import json dic = {'name': 'xinlan'} with open('some.json', 'w',encoding='utf-8') as f: json.dump(dic, f)
008-python中,和字典相关的常见函数有哪些?
在Python中,与字典(dictionary)相关的常见函数有以下几个:
- len() :返回字典中键值对的数量。
- keys() :返回一个包含字典所有键的列表。
- values() :返回一个包含字典所有值的列表。
- items() :返回一个包含字典所有键值对的列表,每个键值对表示为一个元组。
- get(key, default) :返回指定键的值,如果键不存在则返回默认值。
- pop(key, default) :移除并返回指定键的值,如果键不存在则返回默认值。
- popitem() :随机移除并返回字典中的一个键值对,以元组形式返回。
- clear() :移除字典中的所有键值对,使其变为空字典。
- copy() :创建一个字典的浅拷贝。
- update(other_dict) :将另一个字典中的键值对更新到当前字典中。
- setdefault(key, default) :返回指定键的值,如果键不存在则将键值对添加到字典中。 这些函数是常见的字典操作函数,可以用于创建、修改和查询字典中的键值对。
009-你如何使用Python编写测试用例?
使用Python编写测试用例,首先需要定义测试用例的输入数据,然后编写测试步骤,最后定义正确的输出。
010-如何将数字转换为字符串?
1、要将数字转换为字符串,请使用内置函数str()。如果需要八进制或十六进制表示,请使用内置函数oct()或hex()。
011-简述python中如何创建生成器以及应用场景?
当创建一个元素数量非常大的序列时,会占用很大的存储空间,而且有时候我们可能仅仅只需要访问前面几个元素,那后面的绝大部分元素占据的空间就浪费了。所以如果元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的序列,从而节省大量的空间。在python中,这种一边循环一边计算的机制,称为生成器(Generator)。
创建生成器的最简单的方法是把列表生成式的[]改成(),这样就创建了一个生成器。
[x2 for x in range(10)] [0, 4, 9, 16, 25, 36, 49, 64, 81] g = (x2 for x in range(10)) at 0x7f9dff3100d0> 另外一种定义生成器的方式是在函数中使用
yield关键字返回值,那么这个函数就不再是一个普通的函数,而是一个生成器。
例如,著名的斐波拉切数列,可以使用生成器来创建
def fib(max): n, a, b = 0, 0, 1 while n 生成器的取值也是通过迭代来完成的,生成器中同时实现了 __iter__()和__next__()方法。
所以生成器也是特殊的迭代器。
012-模块和包是什么
模块: 一个python文件就是一个模块,其中定义的对象可以别其他模块调用。可以解决把所有代码放在一个文件中不便维护的问题。 包: 包含__init__.py文件的文件夹被称为python的包
013-编写一个装饰器,用于计算函数的执行时间。
import time
def time_it(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f'Time taken: {end_time - start_time:.2f} seconds') return result return wrapper
@time_it def my_function(): # do some stuff pass
014-如何提高selenium 用例运行的稳定性?
尽量使用隐性和显性等待机制
注意元素定位表达式编写,避免使用绝对路径和多节点关系定位,减少索引使用,避免动态属性的使用
尽量避免用例之间相互关联
015-你的自动化用例的执行策略是什么?
每日执行:比如每天晚上在主干执行一次
周期执行:每隔2小时在开发分之执行一次
动态执行:每次代码有提交就执行
016-什么是递归函数。
参考: 1、程序调用自身的编程技巧称为递归。所以一个函数在其定义中直接或间接的调用自身,那么这个函数就是一个递归函数。 2、一般来说递归需要有边界条件,递归前进段和递归返回段。当边界条件不满足时,递归前进,当边界条件满足时,递归返回。
017-字典和列表的区别
列表和字典其实没有可比性,结构都不一样。不同点太多,列表是有顺序的,通过下标索引元素,可以切片。字典是无顺序的键值对集合,通过键索引元素。
018-你认为python和C的区别是什么
1)python是解释型语言,编译的时候,不需要入口函数
C是编译型语言,编译的时候,需要入口main函数
2)python是面向对象,C是面向过程,只不过C也有很多办法做成面向对象,但是很复杂
3)python调试起来方便,直接命令行就可以执行,C的话,调试麻烦
4)python数据类型不用指定,可以给任意变量赋任意值
5)python还能做爬虫,实现一些WEB开发,Django框架等
019-简要说明一下你对生成器和迭代器的理解?
迭代器: 迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记 住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问 完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法: iter() 和 next() 。 字符串,列表或元组对象都可用于创建迭代器:任何实现了 iter 和 next() 方法的对象 都是迭代器。 iter 返回迭代器自身,__next__返回容器中的下一个值。
生成器: 生成器是一种特殊的迭代器,它的返回值不是通过 return 而是用 yield , 生成器算得上 是 Python 语言中最吸引人的特性之一,生成器其实是一种特殊的迭代器,不过这种迭代器 更加优雅。它不需要再像上面的类一样写 iter() 和 next() 方法了,只需要一个 yield 关键字。 生成器一定是迭代器, 但迭代器不一定是生成器。生成器是边计算边遍历的。
020-python常见的数据类型
int 、float、str、bool、list、tuple、dict、set、None
021-装饰器是什么,装饰器的用途
参考:
装饰器是一个函数,它可以在不改变被装饰函数的源码和调用方式的情况,可以给其增加额外功能。
022-简述python中的迭代器和迭代对象的区别。
简单来说,迭代器和迭代对象的区别是。迭代对象中只实现了 __iter__ 方法,迭代器中还实现了__next__方法。
在python中大部分的容器对象(list, tuple,dict,set)都可以使用for语句迭代。这种方式风格清晰,简洁又方便。
在底层,for语句会在容器对象上调用iter()。该函数返回一个定义了__next__()方法的迭代器对象,此方法将逐一访问容器中的元素。
当元素用尽时,__next__()将引发StopIteration的异常来通知终止for循环。可以使用next()内置函数来调用__next__()方法。
所以,给一个类定义一个__iter__方法,此方法返回一个带有__next__()方法的对象,那么这个类就具备了迭代器行为,可以通过for语句来迭代该类的对象,这个类的对象也就是可迭代对象。
一个类实现了__next__方法,同时实现了__iter__返回它自己,这个类就是一个迭代器。
023-什么是协程,以及协程的适用场景。
协程本质上就是一个函数,这个函数不能直接执行,往往有I/O操作并且可以暂停。它是通过代码控制程序运行顺序的一种机制。python中可以使用async/await异步语法创建协程,这也是官方推荐的方式。还可以通过yield创建基于生成器的协程,且已经弃用。
因为协程只是改变了执行顺序,资源开销少,因此它切换非常快,往往可以开启大量的协程,提高执行效率,主要应用在处理大量的网络请求等I/O密集型任务上。
024-面向对象程序设计有哪些特点?
面向对象程序设计有4个主要特点,分别是:抽象、封装、继承、多态。
025-range 和 xrange 的区别?
在python2中,range返回的是一个列表,xrange返回的是一个生成器前者是直 接开辟一块内存空间来保存列表,后者是边循环边使用,只有使用时才会开辟内存空间,所以当列表很长时,使用 xrange 性能要比 range 好。
在python3中,只有range,它返回生成器。
026-print 调用 Python 中底层的什么方法?
print 方法默认调用 sys.stdout.write 方法,即往控制台打印字符串。
027-装饰器是啥
装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。
028-操作系统中的同步和互诉能解决了什么问题
1、相互合作的两个进程之间需要在某个(些)确定点协调它们的工作,一个进程到达了该点后,除非另一进程已经完成了某些操作,否则就不得不停下来,等待这些操作的完成。这就是进程间的同步
2、两个进程由于不能同时使用同一临界资源,只能在一个进程使用完了,另一进程才能使用,这种现象称为进程间的互斥
3、同步的主要特征是:一个进程在某一点上等待另一进程提供信息,两进程之间存在直接制约关系,其表现形式为进程—进程。
4、互斥的主要特征是争用资源,两进程间存在间接制约关系,其表现形式是进程—资源—进程。
029-Python的异常处理是怎么做的?
python中的异常处理语句主要有try和except关键字来实现。
当程序执行try语句时,如果发生了异常,程序会跳转到对应的except语句进行处理;
在except语句中,我们可以使用不同方式来处理异常,比如打印出错误信息、重新抛出异常或者添加修复代码。
030-写出语句打印" let's go", she said
参考:
1、print(""let's go",she said")
031-怎样创建一个临时文件?
from tempfile import TemporaryFile
with TemporaryFile('w+t') as f: # Read/write to the file f.write('Hello World\n') f.write('Testing\n')
# Seek back to beginning and read the data
f.seek(0)
data = f.read()
032-列表去重一行代码怎么实现
list(set(list))
033-python中能直接相互转换的数据类型有哪些
int 》 str
str 》 int
tuple 》 set
set 》 tuple
list 》 set
set 》 list
list 》 tuple
tuple 》 list
034-python中,isinstance()和type()的区别
在Python中,isinstance()和type()都是用于检查对象的类型的函数,但它们之间有一些区别。 type()函数返回对象的类型,它返回一个类型对象。例如,对于整数对象,type()将返回int类型对象。 isinstance()函数用于检查对象是否属于某个特定的类型或其子类。它接受两个参数:要检查的对象和类型。如果对象是给定类型或其子类的实例,则返回True,否则返回False。
总结一下,isinstance()用于检查对象是否属于某个类型或其子类,而type()用于返回对象的类型。
035-解释如何在Python中生成随机数字?
1、可以使用python的random模块的randint方法生成随机数字
2、可以使用faker库的的pyint生成随机数字
036-编程题:阶乘
a = 1 n = 5 for i in range(1,n+1): a = a * i print(a)
037-说说 pytest 里的钩子函数
几个常用的钩子:
pytest_configure(config):添加自定义的标签等
pytest_collection_modifyitems(items):在 case 收集后调用,可以对项目顺序或其他功能 进行自定义
pytest_addoption(parser):为命令行添加自定义参数
更多可参考测试派文章:http://testingpai.com/article/1642583935406
038-python函数调用时参数的传递是值传递还是引用传递?
python中传递不可变数据类型的参数时是值传递,可变数据类型的参数是引用传递。
039-python中的浅拷贝和深拷贝的区别
浅拷贝和深拷贝主要是应用在数据嵌套的情况下。比如列表嵌套字典,字典嵌套列表等。
浅拷贝是指,拷贝的是地址或者引用,并没有把值拷贝过去。
深拷贝是指,拷贝的是值,与之前引用没有关系了。
040-Python中的反向索引是什么?
1、Python序列可以是正数和负数的索引。对于正索引,0是第一个索引,1是第二个索引,依此类推。对于负索引,( - 1)是最后一个索引,( - 2)是倒数第二个索引,依此类推。
041-简述进程与线程的异同。
进程是操作系统中资源分配的基本单位。进程是操作系统对正在运行程序的一种抽象,可以将进程看作程序的一次运行。
线程是操作系统中调度执行的基本单位。一个线程是一个“执行流”,每个线程之间都可以按照顺序执行自己的代码,多个线程“同时”执行多份代码。
进程和线程之间的区别与联系如下:
一个进程可以包含多个线程,线程在进程的内部。
进程之间的资源是独立的,线程之间的资源则是共享的。
进程是操作系统中资源分配的基本单位,线程是操作系统中调度执行的基本单位。
多个进程同时执行时,如果一个进程崩溃,一般不会影响其他进程,而同一进程内的多个线程之间,如果一个线程崩溃,很可能使得整个进程崩溃。
进程的上下文切换速度比较慢,而线程的上下文切换速度比较快。
进程的创建/销毁/调度开销大,线程的创建/销毁/调度开销相对少很多。
042-用python实现二分法排序
def quick_sort(l): if len(l) >= 2: # 递归结束条件 k = l[0] # 选取k值 left, right = [], [] # 定义基准值左右两侧的列表 l.remove(k) # 移除基准元素 for item in l: if item 还可以一行解决: f = lambda l:l if len(l)= l[0]]) + [l[0]] + f([x for x in l[1:] if x
043-with操作文件为什么不用手动关闭?原理是什么?
参考:
1、with操作文件不用手动关闭是因为文件对象中实现了上下文管理协议。
2、也就是说类里面定义了__enter__()和__exit__()方法,其中__enter__()方法的作用是将with语句后的返回值绑定到as关键字后的变量。
3、__exit__()方法是在退出上下文时执行,资源的释放定义在了此方法中。
044-json和字典的区别
json是一种特殊格式的字符串,是一种表示多维数据的格式。 字典是python中的一种数据类型,在一定程度上可以进行相互转化。
045-简述python中is和==的区别?
参考:
python中is比较的是两个对象的内存地址是否相等,也即是在对象上调用id()函数的值。
046-简述Python的可变类型和不可变类型?
参考:
1、简单来说在python中,变量引用的数据类型,在更改值的时候,如果不开辟新内存,则此数据类型是可变数据类型,反之如果在更改值的时候需要开辟新内存,此数据类型为不可变类型。 2、 python中,字符串,数值,元祖数据类型是不可变类型,列表,字典,集合等是可变数据类型。
047-list数据去重 (使用set)
set([1,2,2,])
048-用python删除文件和用linux命令删除文件的方法
python: os.remove(文件名)
linux: rm 文件名
049-深拷贝和浅拷贝的区别?
参考: 1、深浅复制通常是在数据嵌套的情况下讨论,当被嵌套的数据是可变类型的情况下,对这个数据进行复制的时候就要考虑到深浅复制了,比如列表嵌套列表。
2、列表中自带的copy方法就是浅复制,调用copy方法复制列表的时候,只会复制这个列表,列表中引用的数据(比如嵌套的列表),不会进行复制,直接引用。
3、浅复制由于复制的不彻底,原列表引用的那个数据发送变化的时候,复制后的数据也会受到影响
4、深复制的话就要用到copy模块中的deepcopy方法了,使用deepcopy方法复制列表的时候,不仅会复制这个这个列表,列表中引用的数据也都会复制一份
050-python中pass语句的作用是什么?
有时只编写框架思路,具体实现还没有设计好就可以通过pass进行占位,使程序语法结构 完整不会报错。
051-给定一个列表,找到其中第k大的元素。
import random
def quick_select(nums, k): pivot = random.choice(nums) left = [x for x in nums if x > pivot] mid = [x for x in nums if x == pivot] right = [x for x in nums if x < pivot]
if k <= len(left):
return quick_select(left, k)
elif k <= len(left) + len(mid):
return mid[0]
else:
return quick_select(right, k - len(left) - len(mid))
nums = [3, 2, 1, 5, 6, 4] print(quick_select(nums, 2))
052-解释如何在Flask中访问会话?
会话基本上允许您记住从一个请求到另一个请求的信息。在一个Flask中,它使用签名cookie,以便用户可以查看会话内容并进行修改。如果只有密钥Flask.secret_key,则用户可以修改会话。
053-Python中局部变量和全局变量的规则是什么?
1、局部变量:如果在函数体内的任何位置为变量赋值,则假定它是本地的。
2、全局变量:仅在函数内引用的那些变量是隐式全局变量。
054-你熟悉哪些Python自动化测试技术?
我熟悉的Python自动化测试技术有Web测试,API测试,UI自动化测试,性能测试,回归测试,移动自动化测试,数据驱动测试等。
055-__init__和__new__区别?
1、__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。
2、__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。
056-常用的python内置库有哪些?
参考: 时间相关的模块:time json数据处理的模块:json 随机数生成的模块:random 正则表达式:re 和python解释器交互的模块:sys 和系统交互的模块:os 日志处理: logging
057-如何在函数内部修改全局变量
在函数内部使用关键字global先声明,然后再修改
058-怎么生成随机数
import random random.random()
059-Python 中的 os 模块常见方法?
os.path.dirname() 去掉文件名,返回目录路径
os.path.join() 将分离的各部分组合成一个路径名
os.remove()删除文件
os.rename()重命名文件
os.walk()生成目录树下的所有文件名
os.chdir()改变目录
os.mkdir/makedirs 创建目录/多层目录
os.rmdir/removedirs 删除目录/多层目录
os.listdir()列出指定目录的文件
os.getcwd()取得当前工作目录
os.chmod()改变目录权限
os.path.basename()去掉目录路径,返回文件名
060-python的常用数据类型有哪些?
int(整数)
float(浮点数)
bool(布尔值)
str(字符串)
list(列表)
tuple元组)
Set(集合)
dict(字典)
061-简述Python垃圾回收机制?
python的垃圾回收机制主要是引用计数,标记清除和分代回收三种机制。
引用计数的原理是为每个对象维护一个ob_ref,用来记录当前对象被引用的次数,也就是来追踪到底有多少引用指向这个对象。当指向该对象的内存的引用计数为0的时候,该内存将会被回收。
引用计数有个明显的缺点就是无法解决循环引用问题。A和B相互引用而再没有外部引用A和B中的任何一个,它们的计数都为1,但显然应该被回收。
为了解决这个问题,python的垃圾回收机制引入了标记清除算法,它是一种基于追踪回收技术实现的垃圾回收算法。它分两个阶段:第一个阶段是标记阶段,在这个阶段会为所有的"活动对象"打上标记,第二阶段是把那些没有标记的对象"非活动对象"进行回收。
标记阶段是通过对象之间通过引用连接在一起构成的有向图来区分活动对象和非活动对象的。对象构成这个有向图的节点,引用关系构成这个有向图的边。从根对象出发,沿着有向边遍历对象,可达的对象标记为活动对象,不可达的对象就是要被清除的非活动对象。根对象就是全局变量,调用栈,寄存器。
python什么时候会进行这个标记过程呢?为了性能和效率考虑,又引入了分代回收的机制。
简单来说就是将所有对象按照引用次数分为3代。刚创建的对象都会被放入零代链表中,当这个对象的引用计数随着程序的运行超过了某个阈值之后,会被从零代放入更老一代。越新的代,进行标记的频率就越高,当检查到有循环引用时,会将相互引用的对象的引用计数都减1,如果引用计数为0则销毁该对象。
062-什么是GIL?
GIL是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
063-python中,和集合相关的常见函数有哪些?
在Python中,与集合(set)相关的常见函数有以下几个:
set() :创建一个空集合或将可迭代对象转换为集合。
len() :返回集合中元素的数量。
add() :向集合中添加一个元素。
remove() :从集合中移除指定元素,如果元素不存在会引发KeyError错误。
discard() :从集合中移除指定元素,如果元素不存在不会引发错误。
pop() :随机移除并返回集合中的一个元素。
clear() :移除集合中的所有元素,使其变为空集合。
copy() :创建一个集合的副本。
union() :返回两个集合的并集。
intersection() :返回两个集合的交集。
difference() :返回一个集合与另一个集合的差集。
symmetric_difference() :返回两个集合的对称差集,即两个集合中不重复的元素组成的集合。
issubset() :检查一个集合是否是另一个集合的子集。
issuperset() :检查一个集合是否是另一个集合的超集。
这些函数是常见的集合操作函数,可以用于创建、修改和比较集合。
064-Python中自定义的函数如何传递动态参数?
参考:
参数使用args或者kwargs
065-如何在Python中复制对象?
1、要在Python中复制对象,可以尝试copy.copy()或copy.deepcopy()来处理一般情况。您无法复制所有对象,但大多数对象都是如此。
066-给出一个函数,写程序判断当月总天数。
import calendar res = calendar.monthrange(2022, 5) print(res) #res值为 (6, 31)。第一个数表示月份的第一天是星期6,第二个值表示这个月总天数。# 普通方法 year = int(input('请输入年份:')) month = int(input('请输入月份(1~12):')) if month == 2: if year % 4 == 0 and year % 100 != 0 or year % 400 == 0: print('闰年29天') else: print('平年28天') elif month in (4,6,9,11): print('30天') else: print('31天')
067-列表和元组有什么区别
列表是可变数据类型,元组是不可变数据类型
068-什么是 Python 的命名空间?
参考:
在 Python 中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作——这就是命名空间。它就好像一个盒子,每一个变量名字都对应装着一个对象。当查询变量的时候,会从该盒子里面寻找相应的对象。
python中有三种命名空间:
- 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。- 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。- 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。
069-简单的说一下深拷贝与浅拷贝的区别
对于不可变数据来说深浅拷贝的结果一致会重新创一个数据的副本。
浅拷贝对于可变类型来说只会拷贝其元素的引用。
深拷贝对于可变元素来说会递归的整个重新创建一个原数据的副本。
070-python中如何一行代码交换两个变量的值
这一题主要考察对赋值预算符的运算流程的理解。在python中先计算赋值运算符右边的表达式,然后再赋值给左边的变量。
a=1 b=2 a,b=b,a
即可完成a,b变量值的互换
071-Python 中的小整数池你有了解过吗?
1、小整数池 是指在运行 Python 程序的时候,Python 解释器会自动创建,负 5 到 256 之间的整数对象,保存到缓存里面,也就是我们所说的小整数池; 2、当程序中将这些整数复制给变量的时候,那么 Python 解释器,就会不断重新去分配内存去创建这个对象了,而是直接引用,已经创建好的缓存里面的对象; 3、小整数池这个设计的初衷是为了优化程序的运行效率,需要相同的整数的时候,直接从这个整数池里面拿出来就可以用,可以避免频繁去创建和销毁这个对象,提升效率、节约内存
072-列表,字典,元组的定义
列表:test_list=[1,2,3,4]
字典:test_dict={"key1":"val1","key2":"val2"} 元组:test_tuple=(1,2,3,4)
073-列表和元组的区别
列表可变
元组不可变
074-Python向列表增加数据,怎么操作?
(1)通过append方法可以向列表中添加元素
(2)通过extend方法可以将另一个列表中的元素逐一添加到列表中
(3)通过insert(index,object)方法在指定位置index前插入元素object
075-字典怎么新增删除?
1.字典可以通过索引赋值的方式新增元素
示例:d = {'name':'xinlan'} 新增元素:d['age'] = 18
也可以通过调用update方法扩展键值对
d.update({'height': 170, 'weight': 65})
2.字典可以通过pop方法删除指定key的键值对
d.pop('height')
也可以通过del删除 del d['weight']
076-装饰器,迭代器和生成器的区别
装饰器:本质上是一个 Python 函数,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能。装饰器的返回值也是一个函数的对象,它经常用于有切面需求的场景。
迭代器:是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,对于 string、list、dict、tuple 等这类容器对象。
生成器(Generator):是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用 yield 语句。每次 next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置 和所有的数据值)
077-你如何使用Python来实现性能测试?
使用Python实现性能测试,可以使用Python的性能测试框架(例如Locust,Gatling,JMeter)来生成负载,并使用Python的性能分析模块(例如psutil)来分析测试结果。
078-现在有一个字典,我要遍历它的value值,怎么编程?
使用for循环,使用字典的.values方法可以获取
079-python 中的 __new__ 方法的作用是什么?
在python中__new__方法用来创建对象。
当一个类实例化时,会自动调用该方法。
它的主要目的是允许不可变类型的子类(例如int,str或tuple)定制实例创建过程。它也常会在自定义元类中被重载以便定制类创建过程。
080-什么是线程和进程,它们的区别是什么,分别适用于什么场景?
进程是具有独立功能的程序的一次运行活动,它是操作系统进行资源分配和调度的一个独立单位。
线程,有时被称为轻量进程,是程序执行流的最小单元。它是进程的一个实体,一个进程中至少有一个线程。
进程和线程的主要差别在于进程有独立的地址空间,线程没有单独的地址空间,同一个进程下的线程共享进程的地址空间。所以切换线程的开销会比切换进程的开销少,效率高。
在Cpython中,由于存在GIL锁(全局解释性锁),在一个cpu中,同一时间只能执行一个线程,所以python中的多线程并不是真正意义上的并发。但是GIL锁有一个很棒的设计,在遇到任意IO阻塞的时候,会自动切换线程。
所以当遇IO密集型任务的时候使用多线程,计算密集型任务的时候为了利用多cpu并发使用多进程。
081-元组和列表的区别
列表可以增,删,改,元组一旦创建不能修改。
082-Dockerfile最常用的指令有哪些?
FROM:指定基础镜像 LABEL:功能是为镜像指定标签 RUN:运行指定的命令 CMD:容器启动时要运行的命令
083-一句话解释什么样的语言能够用装饰器?
函数可以作为参数传递的语言,可以使用装饰器
084-什么是单例模式?单例模式使用与什么场景?
单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在。 单例模式应用场景:
1. 资源共享的情况下,避免由于资源操作时导致的性能问题。例如日志文件,配置文件等。
2. 控制资源的情况下,方便资源之间的相互通信。如线程池,数据库连接池等。
085-介绍一下 except 的作用和用法?
except: #捕获所有异常
except: : #捕获指定异常
except: : 捕获异常 1 或者异常 2
except:,:捕获指定异常及其附加的数据
except:::捕获异常名 1 或者异常名 2,及附加的数据
086-pytest 参数化怎么实现
使用@pytest.mark.parametrize 装饰器
范例:
@pytest.mark.parametrize('字符串形式接收参数名', [(参数 1-1, '参数 2-1'), (参数 1-2, '参 数 2-2')],ids=['第 1 条参数对应的用例名', '第 2 条参数对应的用例名'])
@pytest.mark.parametrize('goods_id,stock,exp', [(12, 1, '缺失规格'), ('商品编号', '1', '商品 不存在或已删除')],ids=['不填写规格参数加购', '商品编号为异常值'])
087-is和==区别
1、is是比较内存地址,==是比较值
088-数据库的索引作用是什么
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能
089-[::-1]表示什么?
切片,步长为负一,会返回原序列的倒序
090-super是干嘛用的?为什么要使用super?请举例说明
1、super用于直接调用父类方法和属性
2、当父类与子类有同名方法和属性的时候,self优先调用的是自己的方法不是调用父类方法,而super可以直接调用父类方法
091-python有哪些数据类型?
基本数据类型有 整数,浮点数,复数,字符串,列表,元组,集合,字典,布尔型,None
092-进程,线程的定义及区别
定义:
1、进程是计算机中资源分配的最小单元
2、线程是计算机中可以被cpu调度的最小单元
区别:
1、一个进程中可以有多个进程,同一个进程中的线程共享资源
2、线程是真正工作的单位
3、进程是为线程提供资源的单位
093-Python 中各种下划线的作用?
双下划线开头,双下划线结尾,表示python的魔术方法
单下划线开头,表示是保护成员,只能是类对象和子类对象能够访问
双下划线开头,表示私有成员,只能是类本身可以访问
单下划线结尾,主要是用于区分该名称和关键字
094-怎么将两个有序的列表,合并成一个有序的列表
用列表的extend的方法,将2个列表合并到一起。
095-编写一段程序,使用递归实现 0-100 之间的和。
def my_sum(num): if num
096-请用一行代码实现1-1000之和.(忽略导入模块)
print(sum(range(1,1001)))
097-编写一个程序读入3个整数,输出最大值或最小值 。
def myfunc(a,b,c): min_value = min([a,b,c]) max_vaule = max([a,b,c]) return min_value, max_vaule
min_value, max_value = myfunc(12,56,32) print(f"最小值:{min_value} 最大值:{max_value}")
098-自动化代码中,用到了哪些设计模式?
- 单例设计模式- 工厂模式- PO设计模式- 数据驱动模式- 面向接口编程设计模式
099-编程题:冒泡法排序
def bubbleSort(arr): for i in range(1, len(arr)): for j in range(0, len(arr)-i): if arr[j] > arr[j+1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] return arr
100-谈一下什么是解释性语言,什么是编译性语言?
参考:
1、计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。
2、解释性语言在运行程序的时候才会进行翻译。
3、编译型语言写的程序在执行之前,需要一个专门的编译过程,把程序编译成机器语言(可执行文件)。
101-a="张明 98分",用re.sub,将98替换为100
import re
a="张明 98分"
a = re.sub(r'\d+', '100', a)
102-with语句打开处理文件做了哪些隐藏工作
with语句可以在实现了上下文协议的对象上自动的调用资源释放方法。
具体到文件处理中它会在代码块执行结束之后自动关闭文件对象,哪怕发生了异常。
103-使用docker-compose部署是要手动创建网桥吗?
不需要用,docker-compose会自动创建网桥
104-给定一个列表,将该列表反转
li = [11, 22, 33, 3, 22, 44, 5556, 677] li.reverse()
105-Python有没有垃圾回收机制?它又是通过什么来的?
参考:python的垃圾回收机制: 引用计数、标记清除、分代回收
106-什么是字典,什么场景下使用字典?
dict:字典,字典是一组键(key)和值(value)的组合,通过键(key)进行查找,没有顺序, 使用大括号”{}”;使用键和值关联数据的时候使用字典。
107-简要描述Python的垃圾回收机制
Python在内存中存储了每个对象的引用计数(reference count)。如果计数值变成0,那么相应的对象就会小时,分配给该对象的内存就会释放出来用作他用。
偶尔也会出现引用循环(reference cycle)。垃圾回收器会定时寻找这个循环,并将其回收。举个例子,假设有两个对象o1和o2,而且符合o1.x == o2和o2.x == o1这两个条件。如果o1和o2没有其他代码引用,那么它们就不应该继续存在。但它们的引用计数都是1。
Python中使用了某些启发式算法(heuristics)来加速垃圾回收。例如,越晚创建的对象更有可能被回收。对象被创建之后,垃圾回收器会分配它们所属的代(generation)。每个对象都会被分配一个代,而被分配更年轻代的对象是优先被处理的。
108-列表中添加元素的方法?
append、insert、extend
109-python中,和列表相关的常见函数有哪些?
在Python中,与列表(list)相关的常见函数有以下几个: 1.len():返回列表中元素的数量。 2.append():向列表末尾添加一个元素。 3.extend():将可迭代对象中的元素添加到列表末尾。 4.insert(index,element):在指定索引位置插入一个元素。 5.remove(element):移除列表中第一个匹配的元素,如果元素不存在会引发ValueError错误。 6.pop(index):移除并返回指定索引位置的元素。 7.clear():移除列表中的所有元素,使其变为空列表。 8.index(element):返回列表中第一个匹配元素的索引,如果元素不存在会引发ValueError错误。 9.count(element):返回列表中指定元素的出现次数。 10.sort():对列表进行排序,原地修改列表。 11.reverse():将列表中的元素按相反的顺序排列,原地修改列表。 12.copy():创建一个列表的浅拷贝。 这些函数是常见的列表操作函数,可以用于创建、修改和查询列表中的元素。
110-selenium 如何提高点击事件的成功率
使用显性等待,等待某个元素被点击
使用 ActionChains 中的 click 方法或者原生 JS 的 click 语句代替 el.click
元素没有被其他元素遮挡
确定是否点击元素中心位置
点击只能在 viewport 中,元素不可见时需要先将元素滚动到可视范围之内。
111-列表推导式是什么?
推导式 是 Python 中用来生成数据的一种高级用法,Python 不仅有列表推导时,还有字典推导式、集合推导式、生成器表达式;
它的语法都是一样的,都是通过 for 循环来创建数据的一种简写的方式
112-怎么将两个字典合并
def Merge(dict1, dict2): return(dict2.update(dict1))
两个字典
dict1 = {'a': 10, 'b': 8} dict2 =
返回 None
print(Merge(dict1, dict2))
dict2 合并了 dict1
print(dict2)
113-元组跟列表有什么区别?
元组是不可变类型的数据,列表是可变类型的数据。
114-python为什么使用*args和**kwargs
不确定往函数中传入多少个参数,或者想以tuple、list形式传参数就使用*args
- 不确定往函数中传入多少个关键字参数,或者想传入字典的值作为关键字参数时就使用**kwargs
115-is和 ==有什么区别?
is比较的是两个对象的id值,也就是说两个对象是否为同一个实例对象;而==比较的是对象的值是否相等
116-1689年到2019年,打印出所有的闰年
for i in range(2000,2501): if i%40 and i%100!=0 or i%4000: print(i)
117-生成器和迭代器是什么
迭代器是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,对于 string、list、 dict、tuple 等这类容器对象,使用 for 循环遍历是很方便的。在后台 for 语句对容器对象调用 iter()函数,iter() 是 python 的内置函数。iter()会返回一个定义了 next()方法的迭代器对象,它在容器中逐个访问容器内元素,next() 也是 python 的内置函数。在没有后续元素时,next()会抛出一个 StopIteration 异常。
生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数 据的时候使用 yield 语句。每次 next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置 和所有的数据值)
区别:生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且 生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当 生成器器终结时,还会自动抛出 StopIteration 异常。
118-python的list数据怎么去重
1,可以循环列表,将元素存在另一个列表中,如果元素已经存在,则不再存储
2,可以调用 set 函数转化成集合类型,再通过 list 方法转成列表
119-什么是 PEP8 规范?
1、PEP8规范 又叫 Python8号增强提案,他主要针对于 Python 代码编写风格,而制定的一个指南; 2、比如:首先在一个模块中,模块中的函数 或者 类,他们的间隔是两行;然后类里面的方法,他们间隔是一行;代码行的缩进通常用一个 tab 键 及四个空格来表示; 3、然后一行代码 PEP8的规范里面指出来,最大应该是79个字符;
120-简述你对 input()函数的理解?
在 Python3 中,input()获取用户输入,不论用户输入的是什么,获取到的都是字符串类型的。
在 Python2 中有 raw_input()和 input(), raw_input()和 Python3 中的 input()作用是一样的, input()输入的是什么数据类型的,获取到的就是什么数据类型的。
121-python常用数据类型中,可变类型和不可变类型分别有哪些?
可变类型:list set dict
不可变类型:str tuple int float
122-进程,线程,协成,你是怎么理解的?
1、进程是操作系统资源分配的基本单位;线程是操作系统调度的基本单位;协成 也叫 微线程,协成 存在于线程 之中,是比线程更小的可执行单元;
2、进程和线程可根据操作系统的调度,有可能是并发执行,有可能是并行;协成在一个线程之中,只能并发不能实现并行
123-装饰器的作用是什么?使用于什么场景?
参考: 1、装饰器是用来装饰函数和类的,能够在不改变函数和类的定义与调用方式的情况下,给函数和类添加和修改新的功能。 2、装饰器的主要应用场景如下:
1、当需要给某个高频类或着函数动态附加功能时可以使用装饰器
2、在某个函数的执行前后做相关操作时,例如计时,脚手架等
124-冒泡法排序
def bubbleSort(arr): for i in range(1, len(arr)): for j in range(0, len(arr)-i): if arr[j] > arr[j+1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] return arr
125-实现一个算法,找到一个列表中的最长连续子序列
def longest_consecutive(nums: list) -> int: num_set = set(nums) res = 0 for num in num_set: if num-1 not in num_set: cur_num = num cur_len = 1 while cur_num+1 in num_set: cur_num += 1 cur_len += 1 res = max(res, cur_len) return res
nums = [100, 4, 200, 1, 3, 2] print(longest_consecutive(nums)) # 4
126-Python语言中子类如何调用父类的构造函数?
参考:
1、如果子类没有定义构造函数,则子类默认会调用父类的构造函数;
2、如果子类定义了构造函数,那么在子类的构造函数中,调用父类的构造函数:python3中,使用super().init()
127-队列和栈有什么区别?
参考:
1、队列先进先出,栈先进后出。
2、对插入和删除操作的"限定"不同。栈是限定只能在表的一端进行插入和删除操作的线性表。队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。 3、遍历数据速度不同。 栈只能从头部取数据,也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性。 队列基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影像数据结构,速度要快的多
128-python的反射?
python的反射通常可以通通过 hasattr, getattr, setattr, delattr 全局函数来实现。
129-※python统计字符串中指定字符出现次数的方法
s = "Count, the number of spaces."
print(s.count(" "))
x = "I like to program in Python"
print(x.count("i"))
130-python除了做接口自动化还能用来做什么
UI自动化都可以,性能测试也可以,web开发、爬虫、数据分析,运维等很多都可以应用python.
131-统计列表(list)中每个元素出现的次数?
参考: lista = [1, 2, 3, 4, 12, 22, 15, 44, 3, 4, 4, 4, 7, 7, 44, 77, 100]
new_dict = {}
for item in lista:
if item not in new_dict.keys():
new_dict[item] = lista.count(item)
print(new_dict)
132-Python 函数的重载机制是什么?
1、函数重载主要是为了解决两个问题:第一个,是可变参数类型,第二个,是可变参数个数; 2、在 Python 当中参数不需要申明类型,函数是可以接受任何类型的参数的;如果函数的功能相同,一个函数就可以处理了; 3、在 Python 当中通过 一个 * 号 和 两个 ** 号 来处理可变参数个数;所以在 Python 里面他不需要处理函数重载;
133-python的内置基本数据类型有哪些
int, bool, float, complex, str, list, tuple, set, dict
134-给定一个字符串,判断其是否为回文字符串
def is_palindrome(s: str) -> bool: return s == s[::-1]
135-请用python脚本实现从1到100的求和。
sum = 0 for i in range(1,101): sum += i print(sum)
136-你熟悉哪些自动化测试工具?
我熟悉的自动化测试工具有Jenkins,jmeter,GitLab CI,CircleCI,postman等。
137-python的元组和列表字典有什么区别
1.元组是序列类型,元素是有顺序的,而字典是散列,元素之间是没有顺序的 2.元组可以通过下标索引取值,字典是通过key取值,key必须是可哈希对象
3.元组是不可变类型,字典是可变类型
138-模块和包是什么
包:是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序结构。
模块:自我包含并且有组织的代码片段为模块
139-用python实现斐波那契数列
def fib(n): # 打印斐波那契数列到数n a, b = 0, 1 while a
140-Python中的列表和元组有什么区别?
列表可变,元组不可变
141-写一下冒泡排序
def bubble_sort(arr): n = len(arr) for i in range(n - 1): for j in range(n - i - 1): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] 具体过程可参考:https://www.runoob.com/python3/python-bubble-sort.html
142-请写一段代码,随机生成10个数并写入文件
fs = open("num.txt","a") list1 = [] for index in range(10): num = random.randint(0,1000) list1.append(str(num)) fs.write(",".join(list1))] fs.close()
143-python中,和字符串相关的常见函数有哪些?
在Python中,与字符串相关的常见函数有以下几个: 1.len():返回字符串的长度。 2.lower():将字符串转换为小写。 3.upper():将字符串转换为大写。 4.capitalize():将字符串的首字母大写。 5.title():将字符串中每个单词的首字母大写。 6.strip():去除字符串首尾的空白字符。 7.replace(old,new):将字符串中的旧子串替换为新子串。 8.split():将字符串按照指定的分隔符拆分成子串列表。 9.join(iterable):使用指定的分隔符将可迭代对象中的元素连接成字符串。 10.startswith(prefix):检查字符串是否以指定的前缀开头。 11.endswith(suffix):检查字符串是否以指定的后缀结尾。 12.find(substring):在字符串中查找子串并返回其索引。 13.count(substring):计算字符串中子串的出现次数。 14.isalpha():检查字符串是否只包含字母字符。 15.isdigit():检查字符串是否只包含数字字符。 16.isalnum():检查字符串是否只包含字母和数字字符。 17.islower():检查字符串是否全为小写。 18.isupper():检查字符串是否全为大写。 19.isspace():检查字符串是否只包含空白字符。 20.startswith(prefix,start,end):在指定范围内检查字符串是否以指定的前缀开头。 这些函数可以用于在Python中操作和处理字符串。
144-python2和python3的range(100)的区别
python2返回列表,python3返回迭代器,节约内存
145-read、readline 和 readlines 的区别?
read:读取整个文件。
readline:读取下一行,使用生成器方法。
readlines:读取文件的每一行,返回一个列表。
146-怎么用lambda实现11 +22 +3*3 ...
work = lambda x: sum([i * i for i in range(x)]) print(work(5))
147-python连接数据库的方式?
连接不同的数据库可使用python的第三方库实现:
连接mysql数据库,用pymysql
连接oracle数据库,用cx Oracle
连接sql server数据库,用pymssql
148-python中os.path 和 sys.path 分别代表什么
os.path 主要是用于对系统路径文件的操作。
sys.path 是包含 Python包导入时解释器搜索的路径列表。
149-请用你熟悉的语言实现冒泡排序。
l = [1, 7, 5, 6, 2, 8, 3, 9, 4] n = len(l) for m in range(n-1): flag = True # 设置一个标志位 for i in range(n-m-1): if l[i] > l[i+1]: l[i], l[i+1] = l[i+1], l[i] flag = False # 如果本能循环还需要交换就改变flag的值 if flag: # 如果flag没有改变就说明排序成功了 break print(l)
150-你如何使用Python编写可重复使用的脚本?
使用Python编写可重复使用的脚本,可以使用Python的函数和类来定义可重复使用的功能,并使用模块和包来组织代码,以便脚本可以被多个应用程序使用。
151-请按 alist 中元素的 age 由大到小排序
alist [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}] def sort_by_age(list1): return sorted(alist,key=lambda x:x['age'],reverse=True)
152-多套环境,pytest如何切换环境?
方式一: pytest有个hooks函数,可以自定义命令行参数,一般在conftest.py中去引用。 Conftest.py中写pytest_addoption这个hooks函数,可以自定义命令行参数,base_url只能对一个url地址进行传递,那么有的项目不仅需要多项目请求的url地址进行不同环境的切换,还需要对mysql的url地址进行不同的切换,这个时候就可以用自定义命令,定义不同的命令行参数,这样我们在执行pytest的时候就可以自由进行传递。
方式二: 通过 yml文件 和 fixture 进行配合使用,首先在项目目录下面创建一个conf.yml,然后里面去手动配置现在要运行的环境, 然后在创建一个conftest.py,里面定义两个fixture函数,一个用来读取conf.yml里面的内容,另一个用来配置具体的环境信息 参考文章 :https://yebd1h.smartapps.cn/pages/blog/index?blogId=123293735&_swebfr=1&_swebFromHost=baiduboxapp
比如qa环境,release环境,然后通过conf.yml里面配置的qa还是release,来读取project_url 和 mysql_url,
153-python的高阶函数有哪些, 分别都有什么作用?
参考:filter: 过滤器 zip: 打包
154-python列表和字典的区别,列表和元组的区别
列表是有序的,字典是无序的。列表通过索引获取、字典通过 key 获取。
列表是可变的,可以修改、添加、删除其中的元素,但是元组是不可变的,不能修改、添加、删除其中的元素。
对于一个元素的元组,必须要在元素后加逗号,而列表不需要。
155-L=[1,2,3,4,5],L[10:]的结果是
参考答案:
[ ]
156-什么是冒泡排序?
冒泡思想:通过无序区中相邻记录的关键字间的比较和位置的交换,使关键字最小的记录像气泡一样逐 渐向上漂至水面。整个算法是从最下面的记录开始,对每两个相邻的关键字进行比较,把关键字较小的记录 放到关键字较大的记录的上面,经过一趟排序后,关键字最小的记录到达最上面,接着再在剩下的记录中找 关键字次小的记录,把它放在第二个位置上,依次类推,一直到所有记录有序为止
157-python中, 对list去重并找出列表list中的重复元素
from collections import Counter #引入Counter a = [1, 2, 3, 3, 4, 4] b = dict(Counter(a)) print(b) print ([key for key,value in b.items() if value > 1]) #只展示重复元素 print ({key:value for key,value in b.items() if value > 1}) #展现重复元素和重复次数
158-什么是页面工厂
页面工厂类在Selenium中是POM(页面对象模型)设计模式的扩展,它用于初始化页面对象的元素或实例化页面对象本身
使用注解的页面工厂是这样的:
@FindBy(id=“userName”) WebElementtxt_UserName;
OR @FindBy(how=How.ID,using=“userName”) WebElementtxt_UserName;
然后我们通过页面工厂实例化页面对象 PageFactory.initElements(driver,Login.class);
159-一行代码实现1-100之和
sum(range(1,101)
160-开发改了 bug 之后你怎么去做回归,回归的步骤
首先看看引起bug 的用例是否正常,是否正常修复;
相关功能重运行,看是否引入其他 bug
161-Python 中的魔术方法了解过吗?
有了解过,Python 类当中内置的那个双下划 开头 和 结尾 的方法,都叫做 魔法函数,它是在特定的情况下除法的;
比如说:类的初始化 init,它就是在创建对象的时候会自动调用,用于初始化对象;
Python 当中有很多的特性,都是通过魔术方法来实现的。
162-python正则模块re中match函数与search的区别?
match只检测表达式是否匹配字符串的开头,search只匹配第一个符合表达式的部分。
163-如何将两个字典合并?
调用字典的update方法,合并2个字典。
164-Python 函数的重载机制是什么?
函数重载主要是为了解决两个问题:第一个,是可变参数类型,第二个,是可变参数个数;
在 Python 当中参数不需要申明类型,函数是可以接受任何类型的参数的;如果函数的功能相同,一个函数就可以处理了;
在 Python 当中通过 一个 * 号 和 两个 ** 号 来处理可变参数个数;所以在 Python 里面他不需要处理函数重载;
165-python实现列表去重的方法
先通过集合去重,再转换成列表
166-python递归的最大层数?
一般计算机默认的最大递归深度在1000左右,python最大递归深度一般在4000左右。
跟计算机的性能有关系,这个数不是一个定数,可以通过以下方法测试 import sys print(sys.getrecursionlimit())
167-Python常用的数据类型有哪些
整型,浮点数,布尔,字符串,元组,字典,列表,集合等
168-页面对象模型和页面工厂有什么区别?
页面对象模型是一种为webUI元素创建对象存储库的设计模式。
但是页面工厂是Selenium中用于维护对象存储库的类。
169-python如何操作数据库的?
python是使用第三方库去操作数据库,不同的数据库都有对应的第三方库。 工作中,mysql用的比较多,所以在python中使用的是pymysql模块去操作的。 首先,是初始化数据库类,配置连接参数,含数据库地址、数据库名、用户名和密码,端口,编码格式,指定查询结果为字典。 其次,调用execute方法,执行sql语句。如果是对数据库进行修改,再调用commit函数提交 。 操作完成之后,调用close方法关闭数据库连接
170-python中如何实现列表和元组之间的转换
列表和元组之间的转换,使用list方法或者tuple方法转换即可。
171-冒泡排序了解多少
冒泡排序是指按从小到大,或者从大到小进行排序。
可以使用python的列表的sort函数排序,也可以使用python内置函数sorted进行排序 也可以使用双重for循环实现
172-Python装饰器的作用是什么?
Python装饰器是一种用于拓展函数功能的方法,它可以封装旧函数并返回一个新函数,从而简化装饰器代码。
装饰器的作用是对函数进行包装、验证、缓存、等操作,增强函数的功能。
具体来说,装饰器可以将函数包装成闭包函数,并在不修改原函数及其调用方法的情况下对其进行扩展。
此外,装饰器还可以对函数进行缓存,避免反复计算。
173-你能描述Python中的列表推导式吗?
Python中的列表推导式是一种从现有列表中创建新列表的简洁语法。它允许开发人员以简洁的方式从现有列表中提取数据。
174-简述__new__与__init__的区别
创建一个对象时首先执行object.new(cls[,...]),它创建一个cls类的新实例。
它会将所请求实例所属的类作为第一个参数,其余的参数会被传递给__init__方法。
注意如果__new__没有返回一个cls的实例,则新实例的__init__方法不会被执行,__init__是初始化方法,对象创建后,就立即调用.
175-什么是装饰器
装饰器是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更优雅
176-请说一下单例模式的概念及应用场景
单例模式(Singleton),是一种常用的软件设计模式,单例对象的类必须保证只有一个 实例存在。
网站的计数器,一般采用单例模式,否则难以实现同步;
多线程的线程池设计一般也是单例模式,方便对池中的线程进行控制;
操作系统的文件系统,因为一个操作系统只能有一个文件系统;
web 应用的配置对象的读取,一般也是单例模式,这是由于配置文件是共享的资源;
Windows 的 Task Manager(任务管理器)就是很典型的单例模式;
数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据 库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗, 这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗
177-python的单例模式?
单例模式是:确保类有且只有一个对象被创建 为唯一对象提供访问点,令其可被全局访问 控制共享资源的并行访问
具体实现方式可以通过模块导入、装饰器、控制 __new__方法 等等。
178-写出 r‘123\n’ * 3的运行结果
123\n123\n123\n
179-什么是Python中的迭代?
Python中的迭代是指通过使用迭代器在Python对象集合中进行重复操作的过程。迭代器是一种对象,它可以用于遍历序列中的所有元素,并且可以使用迭代器来实现迭代。
180-Python中,怎么对列表(list)的值进行修改、删除、增加?
增加
list1.append("age") # append()在列表的后面追加元素
print(list1)
list1.insert(3,"hobby") # 指定位置3添加元素,插入
print(list1)
# 添加多个元素 -- 将两个列表合并显示(不可以指定位置)
list1.extend(["aa","bb","cc"])
print(list1)
# 删除
list1.pop() # 默认删除最后一个元素
print(list1)
list1.pop(2) # 指定位置删除元素
print(list1)
list1.remove('hobby') # 指定元素本身来删除
print(list1)
# list1.clear() # 清空列表
# print(list1)
修改
list1 = [10, 3.14, "name", True, [1, 2, 3, 4, 5], 'name', 10] print(list1[3]) list1[3] = "Number" # 先取值,再重新赋值 print(list1)****
181-编写一个函数,从一个列表中返回所有可能的子集。
from itertools import combinations
def subsets(nums: list) -> list: res = [] for i in range(len(nums)+1): res += list(combinations(nums, i)) return res
nums = [1, 2, 3] print(subsets(nums)) # [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
182-python里面调用函数传参的类形式有几种?
1、位置参数:根据传递的顺序,传递给函数中位置对应的参数
2、关键字参数:通过指定参数名,传递参数值
183-浅拷贝(copy())、深拷贝(deepcopy())的区别?
copy是浅拷贝,在copy嵌套的数据时,浅拷贝字符拷贝最外层的对象,对于对象中嵌套的元素,则直接引用。
deepcopy是深拷贝,在copy嵌套的数据时,深拷贝字符拷贝不仅会最外层的对象,对于对象中嵌套的元素也会进行拷贝。
184-Python的pass语句作用是什么?
pass就是一个空语句,它没有任何实际上的意义和作用。它一般是用做占位语句,可以保持程序结构的完整性。
185-python中交换两个数值一行代码
a,b=b,a
186-python常用的内置的数据类型有哪些?
列表、元组、字典、字符串、布尔值、int类型
187-请说明 sort 和 sorted 对列表排序的区别
sort()与sorted()的不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表。
sorted(L)返回一个排序后的L,不改变原始的L,L.sort()是对原始的L进行操作,调用后原始的L会改变, 没有返回值。sorted()适用于任何可迭代容器。
list.sort()仅支持list(本身就是list的一个方法),sorted使用频率比 list.sort()更高些,所以Python中更高级的排序技巧便通过sorted()来演示
188-python深浅拷贝的区别
参考:
1、对于简单对象,字符串,数值,深浅拷贝的效果一致。
2、深浅拷贝的区别仅与复合对象(包含列表或类的实例等其他对象的对象)有关: 浅拷贝会构造一个新的复合对象,然后(在尽可能的范围内)将原始对象中找到的对象的引用插入其中。 深拷贝会构造一个新的复合对象,然后,递归第讲原始对象里找到的对象的副本插入其中。
189-lambda函数实现两个数相乘
通过匿名函数
sum = lambda a,b: a*b
print(sum(2,6))
190-为什么用 Mac 写代码?
表面原因是 Mac 方便易用,颜值也高;深层原因是因为现在的服务器,大多都是采用 Linux 系统,而 Mac 系统 和 Linux 系统其实都是基于原来的 Unix 系统开发的;
而 Mac 基本上能够维持我们的开发环境和线上的一致性;
为什么不用 Linux ?
用 Linux 写代码也是一个很好的选择,但是 Linux 的界面操作和他的娱乐功能不是特别强,而 Mac 做到了很好的平衡;
191-python中元类是什么,它的作用是什么?
元类就是创建类的类,python中默认的元类是type,类在创建的时候默认使用type(name, bases, attrs)来构建。。
192-什么是Assert断言
- 断言Assert用于在代码中验证实际结果是不是符合预期结果,- 如果测试用例执行失败会抛出异常并提供断言日志
193-10.谈一下什么是解释型语言,是么是编译型语言。
高级编程语言编写的源代码计算机不能直接执行,需要翻译成机器码。
解释型编程语言是通过解释器实时逐行解释成机器码后交由cpu执行,它不会产生目标程序(可执行文件)。
编译型编程语言先通过编译器将源码编译成目标程序(可执行文件),然后再执行这个目标程序。
194-字符串怎么进行排序?
对字符串进行排序可以使用内置sorted函数,或者使用列表的sort方法
195-浅拷贝和深拷贝的区别?
1、浅拷贝
浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存。所以修改其中任意的值,另一个值都会随之变化
2、深拷贝
深拷贝会创造一个一模一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对象。
196-Python中的命名空间是什么?
1、在Python中,引入的每个名称都有一个存在的地方,可以被连接起来。这称为命名空间。它就像一个框,其中变量名称映射到放置的对象。每当搜索到变量时,将搜索此框以获取相应的对象。
197-简述 ORM 及其优缺点?
ORM 框架:
对象关系映射,通过创建一个类,这个类与数据库的表相对应!类的对象代指数据库中 的一行数据。 让用户不再写 SQL 语句,而是通过类以及对象的方式,和其内部提供的方法,进行数 据库操作! 把用户输入的类或对象转换成 SQL 语句,转换之后通过 pymysql 执行完成数据库的 操作。
ORM 的优缺点:
优点:
1.提高开发效率,降低开发成本
2.使开发更加对象化
3.可移植
4.可以很方便地引入数据缓存之类的附加功能
缺点:
1.在处理多表联查、 where 条件复杂之类的查询时, ORM 的语法会变得复杂。就需 要写入原生 SQL 。
198-Django,Pyramid和Flask之间有什么区别?
Flask是一个“微框架”,主要用于具有更简单要求的小型应用程序。在Flask中,您必须使用外部库。 Pyramid是为更大的应用程序构建的。它提供了灵活性,并允许开发人员为他们的项目使用正确的工具。开发人员可以选择数据库,URL结构,模板样式等。Pyramid是可配置的。 像Pyramid一样,Django也可以用于更大的应用程序。它包括一个ORM。
199-Python 的多线程有什么缺点?
1、根据 Python 官方文档知道,由于 Cpython 解释器的全局解释器锁的存在,那么多线程在同一时刻只能有一个线程执行, 2、意思就是说 Python 中的多线程只能并发执行,没有办法实现真正的并行;也就是无法利用多核 CPU 的资源
200-路径处理,获取当前路径
import os print(os.path.abspath(file))
201-Python 中的小整数池你有了解过吗?
小整数池 是指在运行 Python 程序的时候,Python 解释器会自动创建,负 5 到 256 之间的整数对象,保存到缓存里面,也就是我们所说的小整数池;
当程序中将这些整数复制给变量的时候,那么 Python 解释器,就会不断重新去分配内存去创建这个对象了,而是直接引用,已经创建好的缓存里面的对象;
小整数池这个设计的初衷是为了优化程序的运行效率,需要相同的整数的时候,直接从这个整数池里面拿出来就可以用,可以避免频繁去创建和销毁这个对象,提升效率、节约内存;
202-python中is和==的区别
is判断的是对象的内存地址是否相等,通过id来判断。==只判断对象的值是否相等。
203-pytest 里如何进行 case 的组装
1.默认使用检查以 test_ .py 或**test.py 命名的文件名,在文件内部查找以 test 打头的方 法或函数,并执行
2.可以使用自定义 marker(标签),比如 pytest 运行的时就只运行带有该 marker 的测试 用例,比如下面的@pytest.mark.P0
3.在命令行使用 指定文件
4.参数:-k args 模糊匹配 case(关键字 args:可以是 py 文件名,也可以是函数名)
204-列出python中可变数据类型和不可变数据类型,并简述原理?
1、可变数据类型:列表list和字典dict;
2、不可变数据类型:整型int、浮点型float、字符串型string和元组tuple
205-用lambda函数实现两个数相乘
lambda a,b: a*b
206-字典取值几种方式,有什么区别
1、a1[“a”] 2、a1.get(“a”) 3、用这两种方式获取不存在的键的时候,第一种方式会报错,第二种方式会返回None。
207-用python写一个冒泡排序。
def bubbleSort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
208-怎么获取python保留字?
保留字即关键字,我们不能把它们用作任何标识符名称。Python的标准库提供了一个keyword模块,可以输出当前版本的所有关键字:
import keyword print(keyword.kwlist)
209-在Python中,如何处理并发执行的测试用例?
可以使用Python的concurrent.futures库来实现并发执行的测试用例。通过创建线程池或进程池,并使用submit()方法提交测试任务,可以同时执行多个测试用例,并获取它们的执行结果。
210-python语言当中,什么是 PEP8 规范?
PEP8规范 又叫 Python8号增强提案,他主要针对于 Python 代码编写风格,而制定的一个指南;
比如:首先在一个模块中,模块中的函数 或者 类,他们的间隔是两行;
然后类里面的方法,他们间隔是一行;
代码行的缩进通常用一个 tab 键 及四个空格来表示;
然后一行代码 PEP8的规范里面指出来,最大应该是79个字符;
211-列表逆序几种方式
lists = [1,3,4,5,6,7,9,2]
切片
print lists[::-1]
函数reverse 对数组进行操作
lists.reverse() print lists
函数reversed 返回一个迭代对象,需要list化
print list(reversed(lists))
212-python中字符串怎么强制不转义
在字符串前加上字符r,例如r'\r\n'
213-什么是闭包函数,闭包函数有什么用。
在计算机科学中,闭包(closure)是词法闭包(Lexiacal Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另外一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
通过python来解释,简而言之,当内层函数中引用了外层函数中定义的变量或参数,而外层函数执行后会返回内层函数,那么这个返回的函数就是闭包函数。
def func():
a = 1
def inner():
print(a)
return inner
上面这个案例中的func执行后返回的函数就是一个闭包函数。func函数执行结束之后,其函数体中的局部变量a本应该会随着函数执行结束而销毁,但内层函数inner在其函数体中引用了a,所以这个变量a不会释放,而是和inner形成了闭包。
有什么办法可以显示查看函数是否闭包呢?
python中可以在函数对象上查看__closure__属性来函数是否闭包。该属性会返回一个元组对象,包含了闭包函数中所使用的外部变量。
print(func().closure) (,)
python中闭包的最主要应用就是装饰器。
214-Sybase数据库中注册用户与数据库用户有什么区别?
1、注册用户是有权利使用sybase的产品的用户
2、数据库用户是指可以对某一个具体的数据库进行实际的操作的用户,这个用户一般在刚建立的时候只有简单的增删改查的权限,要使用其他的功能(比如创建存储过程),就需要用一个DBA的用户在给这个用户其他的权限(比如创建存储过程的权限)
215-怎么将两个字典合并
def Merge(dict1, dict2): return(dict2.update(dict1))
两个字典
dict1 = {'a': 10, 'b': 8} dict2 =
返回 None
print(Merge(dict1, dict2))
216-列出python中可变与不可变数据类型,并简述原理
可变:列表,集合,字典
不可变:整数,浮点数,复数,字符串,元组。
一个对象在其内地地址不变的情况下能够改变其值就是可变数据类型,反之就是不可变数据类型。
217-python 中的dir()函数有什么功能
返回传入对象的属性名的字符串列表
218-python当中如何操作数据库?
1、python中不同的数据库,都有对应的第三方库。比如mysql数据库有pymysql库,oracle数据库有cx_Oracle
2、安装成功第三方库后,代码中将包导进来
3、接下来就是连接数据库,提供数据库的服务器地址、端口号、访问的用户名和密码、数据库名称,通过调用对应的方法去连接
4、连接成功之后,调用执行sql语句的方法去操作数据库
5、操作完成之后,释放数据库连接
219-列出5个python标准库
os,sys,re,math,datetime
220-页面对象模型的优点有哪些?
1、提高代码可读性,因为POM可以允许我们将UI的操作与要验证的业务流程分类
2、提高代码的复用性:由于对象对象存储库独立于测试用例,因此多个测试用例可以使用相同的对象存储库
221-说一下你对封装的理解
参考:
对于一段程序,我们通过可以使用函数或者类的形式完成封装,将这段程序封装好重复执行。
222-什么是lambda函数?有什么作用?
lambda函数是一个可以接收多个参数并返回单个表达式值的函数。它就是常说的匿名函数,即用即扔,很适合作为参数传入一些高阶函数,而在函数外部不适用的情况。
223-pytest 单元框架里,前置条件怎么处理?
1.使用 setup 函数级的(setup_function、teardown_function)只对函数用例生效,而且不在类中使用
类级的(setup_class、teardown_class)在类中使用,类执行之前运行一次,类执行之后 运行一次
类中方法级的(setup_method、teardown_method)在每一个方法之前执行一次,在每 一个方法之后执行一次
模块级的(setup_module、teardown_module)
2.使用 conftest @pytest.fixture(scope="module")
scope 参数的可选范围:
-function:每一个函数或方法都会调用
-class:每一个类调用一次,一个类中可以有多个方法
-module:每一个.py 文件调用一次,该文件内又有多个 function 和 class
-session:是多个文件调用一次,可以跨.py 文件调用,每个.py 文件就是 module
224-什么是装饰器?装饰器怎么用的?
python装饰器是一种用于拓展函数功能的方法,它可以封装旧函数并返回一个新函数,从而简化装饰器代码。
装饰器的作用是对函数进行包装、验证、缓存、等操作,增强函数的功能。具体来说,装饰器可以将函数包装成闭包函数,并在不修改原函数及其调用方法的情况下对其进行扩展。
225-给定两个列表,怎么找出他们相同的元素和不同的元素?
list1 = [1,2,3] list2 = [3,4,5] set1 = set(list1) set2 = set(list2) print(set1&set2) print(set1^set2)
226-简述classmethod和 staticmethod的区别
classmethod : 类方法,方法中可以通过 cls 获取类,通过类调用
staticmethod: 静态方法,和类与对象没有直接关系,即可以通过类调用,也可以通过实例调用。
227-init 和__new__的区别
__new__方式是用来创建实例对象的 __init__方法是用来对对象进行初始化的 实例化对象时先调用new方法生成对象,然后再在对象上调用init方法
228-迭代器和生成器是什么
迭代器是实现了 __iter__ 和 __next__ 方法的对象, 可以通过 for 循环进行迭代。
生成器是一种特殊的迭代器,用起来更方便,当一个函数中有 yield, 就表明这是一个生成器。
