【测试工程师】Python面试题


----------------------8月4日----------------------------------------------------------------

1. python中a==b和a is b的却别

a==b是比较运算符,变量a b的值相等则返回Ture否则返回False

a is b 是同一运算符,a,b的数值相等未必返回Ture,Python为了优化效率内置了小整数对象池和简单字符串对象池,小整数对象池包括[-5, 256]这之中的数相同时,指的是一个对象。简单字符串也如此。

2.打印5次“hello world”字符串

print(“world”*5)

3.dic中取出对应的值

①dic["key"]

②dic.values()。(取出所有的键,dic.keys())

③for k,v in dic.items(): print(k)

④ dic.get("key","没有找到该键“)

⑤dic.pop("key","没有找到该键")获取该键对应的值,并且删除字典中的这一键值对,如果该键不存在,则返回第二个参数(默认值)

 

-----------------------------------------------------------------------------------------------

**python中的那些容器可以存放不同数据结构?

list、tuple、set、dict

 

**如何创建Python中的不同数据类型?

lis=[]

tuple=()

set={}

dict={}

bul=None

 

**__init__.py功能?

①标识该目录为python模块包

②当用 import 导入该目录时,会执行 __init__.py 里面的代码,该文件就是一个正常的python代码文件。因此可以将初始化代码放入该文件中

**用过Python哪些装饰器

装饰器:为原函数扩展信工鞥你,用新功能待提就功能

作用,再不改变原油代码基础上,实现功能上的扩展

操作:讲一个函数当做变量存入到新的函数中,用到闭包函数(内层函数引用外层函数值,外层函数返回内层函数)的方法

闭包函数,将原函数替换为新的函数

@符号的作用

  1.把@符号下面的函数当做参数传递给装饰器

  2.可以把函数进行返回,让新函数代替旧函数,以实现功能上的扩展

 

def kuozhan2(func):

  def newfunc():

    print('扩展脚本1')

    func()

    print('扩展脚本2')

  return newfunc

 

@kuozhan2

def fun():

  print('旧方法')

装饰器嵌套

@kuozhan3

@kuozhan4

def func():

  print('旧方法')

用装饰器修饰带有参数的函数

扩展新的功能要和原函数的功能在参数和返回值上保持一致

def kuozhan5(func):

  def newfunc(who,where):

    XXX

    kuozhan5()

  return newfunc

@kuozhan5

def func(who, where):

  print("{who}在{where}买车",format(who,where))

 

func('张三',‘4s点’)

**Python中哪些数据类型的是可变参数,哪些是不可变参数

int、String、touple---不可变

dic、list---可变

 

1. mro是什么

method resolution Order,方法解析顺序,方法调用时需要对当前类和基类进行搜索以确定方法艘在的位置,而搜索的顺序就是 方法解析顺序

2. 什么是c3算法

为了解决原来基于深度优先算法不满足本地优先级和单调性的问题,

本地优先级:声明时父类的顺序,C(A,B)

 

3. 面向对象中带双下划线的特殊方法

__setattr__:添加/修改属性时会触发

__delattr__:删除属性时触发

 

4. 双下划线和单下划线的区别

单:保护变量。只有类对象和子类对象能访问到这些变量

双:私有成员,只有类对象能访问,子类对象不能访问

 

5.上下文context你知道吗?(with的用法,如果类需要支持with语句,应该如何书写?)

基本格式 with context_expression [as target(s)]: with - body 这里context_expression要返回一个上下文管理器对象, 该对象并不赋值给as中的target(s),如果制定了as子句的话,会将上下文管理器的__enter__()和__exit__()两个方法context_manager.__enter__():进入上下文管理器的运行时上下文,在语句执行前调用,。with语句将该方法返回值赋值给as子句中的target,

 

6. 实现一个Singleton单例类,要求遵循基本语言编程规范(用尽量多的方式)

通过函数返回一个对象、装饰器实现、__new__

希望某一个对象仅在程序中出现一次,之后所有调用使用同一个对象

__new__

class RedisClient:

  _instance = None

  @classmethod

  def __new__(cls, *args, **kwargs):

    if not cls._instance:

      cls._instance = redis.StrictRedis(**REDIS_CONFIG, bd=0)

    return cls._instance

 

if __name__ == '__main__':

  r=RedisClient()

单例模式的优点核应用?

1.节省空间,全局内只有一个实例

2.数据库配置、数据库连接池

3.网站计数器

 

7. json序列化时,默认遇到中文会换成unicode,想保留中文怎么办?

json.dump({"ddf":"你好“”}, ensure_ascii = Flase)

 

8. 用python匹配HTMLtag的时候,<.*>和<.*?>有什么区别?

<.*>贪婪匹配,匹配所有

<.*?>非贪婪匹配,匹配到第一个就停了

 

9.如何判断一个邮箱合法

import re

if re.match(r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$', email):

  print('right')

else:

  print('wrong')

 

10. 用列表生成式写一个0-100的列表

a = [i for i in range(100)]

11, 用列表生成式写一个取0-100的技术

b= [i for i in range(100) if i%2 != 0]

c =  [i for i in range(1,100,2)]

range可以设置步长

切片:字符串也有下标,【开始的下标:长度】

s = “hello world”

a = s[0:5]

切片加步长,每隔2个切一个[0:100:2]

d = [i for i in range(100)[::2]]

 

12.将类表中重复的元素过滤

lis = [1,2,2,3,3,5]

list(set(lis))

counter = {}定义一个计数器,用来保存元素在列表中出现的次数

for i in lis:

  if 

 

13.列表和元组的去表

li = []

tu = (1,2,3,4)#元组的元素不可变

 

14. 迭代器与生产器的区别

x = [1,2,3,4,5]

y = range(1,6)

list保存完整的值

generator不保存值

是什么:可以边迭代边计算,占用内存小

为什么要用:list中值都会存在内存中,当有大量数据时,且仅适用list中部分值,那么不适用的值就浪费了,生成器解决了这个问题

创建生成器:①将[1,2,3]改为(1,2,3)②当函数中使用了yield关键字,那么这个函数是一个generator,调用函数就是创建了一个生成器对象。

原理:生成器有一个next()方法,可以重复调用next()对象向生成器中取值,并且yield在return后会记住当前位置,并下次调用时从yield下一条语句开始执行

 

15.进程与线程的区别

线程是程序运行的最小单位

进程是操作系统管理的最小单元

进程可能包括好几个线程

 

16.说一下python中的多线程特点

一般编程语言中多线程可以利用CPU的多核心

python的多线程有GLI全局锁,不能真正意义上多核心

 

10.python怎么利用多核心

可以利用多进程实现

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM