测试基础 测试基础-Python 篇 问&答②

耿晓 · 2023年02月14日 · 4194 次阅读

面对洋洋洒洒的知识点,我往往 “一看就会,一写就废”,为了更有针对性的加深知识点的印象,我将以做题的形式继续总结 Python 系列,每篇 10 道问答,以下是本篇目录:

Python 系列总结都是我自己平时的学习笔记,如果有不正确的地方,希望各位佬儿哥指正纠偏🤗

  • 问:类反射中常用的方法及含义?
  • 问:python 中创建一个新线程有哪几种方式?
  • 问:python 中 GIL 全局解释器锁在什么情况下会被释放?
  • 问:描述编写装饰器的原则是什么?
  • 问:现在有一个 Animal 类有初始化方法定义如下:
  • 问:文件 zen.txt 中保存着 python 之禅,请使用 python 代码统计该文件中每个单词出现的次数。
  • 问:编写一个装饰器,使用该装饰器能够显示任意函数运行所需时间。
  • 问:用两种方法合并下面列表
  • 问:计算得到列表当中长度最长的字符串 words = ['Python', 'is', 'awesome']
  • 问:将列表中的顺序倒转 (2 种方法) words = ['Python', 'is', 'awesome']

问:类反射中常用的方法及含义?

答:常用的类反射方法有:
type(object):获取对象的类型,返回一个 type 对象。
isinstance(object, classinfo):判断对象是否是某种类型的实例,返回布尔值。
issubclass(class, classinfo):判断一个类是否是另一个类的子类,返回布尔值。
getattr(object, name[, default]):获取对象的属性或方法,如果不存在,可以返回 default 参数指定的默认值。
hasattr(object, name):判断对象是否具有某个属性或方法,返回布尔值。
setattr(object, name, value):设置对象的属性值。
delattr(object, name):删除对象的属性。
使用类反射可以动态地获取和操作类的信息,是动态语言的重要特性。

问:python 中创建一个新线程有哪几种方式?

答:
1.使用 threading 模块:通过定义一个继承自 Thread 的类并重写其 run 方法,然后通过该类的实例调用 start 方法启动线程。
2.使用 multiprocessing 模块:通过使用 Process 类创建新的进程。
3.使用协程:通过使用生成器实现协程,在协程内部通过 yield 实现非阻塞的多任务执行。
多线程编程是高并发编程的一种常见形式,可以提高程序的执行效率。

问:python 中 GIL 全局解释器锁在什么情况下会被释放?

答:
Python 中的 GIL (Global Interpreter Lock) 是一种机制,它限制任意时刻仅有一个线程可以运行在 Python 解释器中。GIL 在以下情况下会被释放:
解释器在执行 CPU 密集型任务时:例如运算,在这种情况下,GIL 会每隔一定时间被释放,以便其他线程有机会被调度执行。
解释器在执行 I/O 密集型任务时:例如读取文件,在这种情况下,由于 I/O 操作需要等待外部设备,所以 GIL 会在 I/O 操作期间被释放。
GIL 可能会影响多线程程序的性能,因此通常不建议在 Python 中开发 CPU 密集型的多线程程序。可以使用多进程来代替多线程以提高性能。

问:描述编写装饰器的原则是什么?

答:
1.不改变原函数的内部逻辑;
2.不改变原函数的调用方法;

问:现在有一个 Animal 类有初始化方法定义如下:

class Animal:
def init(self, skin, legs):
self.skin = skin
self.legs = legs
如果现在想定义一个 Dog 类,并继承于这个 Animal 类,并想给这个 Dog 类增加一个 nickname 对象属性,Dog 类的初始化方法应该怎么定义才能保证 Dog 类和其父类均能初始化成功?
答:

# 两种写法,第二种以Cat举例
class Animal:
    def __init__(self, skin, legs):
        self.skin = skin
        self.legs = legs


class Dog(Animal):
    def __init__(self, skin, legs, nickname):
        super().__init__(skin, legs)
        self.nickname = nickname


class Cat(Animal):
    def __init__(self, skin, legs, hobby):
        Animal.__init__(self, skin, legs)
        self.hobby = hobby


a = Animal(skin='sss', legs='lll')
d = Dog(skin='sss', legs='lll', nickname='nnn')
c = Cat(skin='sss', legs='lll', hobby='hhh')

print(a.skin)
print(d.nickname)
print(c.hobby)
print(c.skin)
----------------------------------------------------------------------
sss
nnn
hhh
sss

super 方法是 Python 中的一种特殊方法,用于引用父类。它常用于多重继承,当子类需要调用父类的方法时,就可以使用 super 方法。这个方法可以直接调用父类的方法,而无需显式命名父类名称。

问:文件 zen.txt 中保存着 python 之禅,请使用 python 代码统计该文件中每个单词出现的次数。

答:

file_path = r'C:\Users\EDZ\Desktop\zen.txt'
with open(file_path, 'r') as f:
    text = f.read()

words = text.split()
word_counts = {}

for word in words:
    if word in word_counts:
        word_counts[word] += 1
    else:
        word_counts[word] = 1

print(word_counts)

问:编写一个装饰器,使用该装饰器能够显示任意函数运行所需时间。

答:

def running_time(fun):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = fun(*args, **kwargs)
        end_time = time.time()
        print(f'{fun.__name__}运行花费了:{end_time-start_time:.2f} 秒。')
        return result
    return wrapper

@running_time
def take_time():
    time.sleep(2)

take_time()
----------------------------------------------------
take_time运行花费了2.01 

问:用两种方法合并下面列表

答:

x = ['a', 'b']
y = ['c', 'd', 'e']

x.extend(y)
# 或
x += y

问:计算得到列表当中长度最长的字符串 words = ['Python', 'is', 'awesome']

答:

words = ['Python', 'is', 'awesome']
# 我的笨方法
s = ''
for _ in words:
    if len(_) > len(s):
        s = _
print(s)

# 标答给的方法
# 使用内置函数 max() 和 len() 计算,在 max() 函数中使用 key 参数指定了用于比较大小的函数为 len(),这样比较的就是字符串的长度,而不是字典序。
longest_word = max(words, key=len)
print(longest_word)

问:将列表中的顺序倒转 (2 种方法) words = ['Python', 'is', 'awesome']

答:

words = ['Python', 'is', 'awesome']

# 方法1,列表的reverse()方法(改变原列表)
words.reverse()
print(words)

# 方法2,列表切片(生成新列表,原列表不变)
w = words[::-1]
print(w)

测试基础-Python 篇 问&答③

共收到 0 条回复 时间 点赞
耿晓 测试基础-Python 篇 问&答① 中提及了此贴 02月14日 14:39
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册