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

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

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

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

  • 问:替换字符串?
  • 问:计算指定字符串出现的次数?
  • 问:将矩阵转置?
  • 问:生成斐波那契数列?
  • 问:冒泡排序?
  • 问:Python 的解包是什么?
  • 问:有一个 key 为姓名,value 为年龄的字典,根据年龄正序排列姓名,并输出姓名列表,若没有年龄,则放在最后;
  • 问:合并字典的多种方式?
  • 问:json 和 Python 中的 dict 有什么区别?
  • 问:Python 列表和字符串的相互转换?

问:替换字符串

答:

s = "Python is a programming language. Python is awesome"
# 字符类型是不可变数据类型,str.replace()方法不会改变原字符串,会生成新值
ss = s.replace('P','p')
print(ss)

问:计算指定字符串出现的次数

a = 'python is a programming language. python is python.'
答:

# 我得笨方法:
d = {}
for _ in a:
    if _ not in d:
        d[_] = 1
    else:
        d[_] += 1
print(d['p'])

# 标答
print(a.count('p'))

问:将矩阵转置

a = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
答:

b = [list(s) for s in zip(*a)]
print(b)

问:生成斐波那契数列

斐波那契数列是一个数列,其中的每个数都是前两个数的和。
答:

def fibonacci(n):
    if n <= 0:
        return []
    elif n == 1:
        return [0, ]
    elif n == 2:
        return [0, 1]
    else:
        fib = [0, 1]
        for i in range(2, n):
            fib.append(fib[-1] + fib[-2])
        return fib

print(fibonacci(10))
-----------------------------------------------------
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

问:冒泡排序

def bubble(l):
    for i in range(len(l) - 1):
        for j in range(len(l) - 1 - i):
            if l[j] > l[j + 1]:
                l[j], l[j + 1] = l[j + 1], l[j]
    return l

问:Python 的解包是什么?

答:解包是 Python 里的一种特殊赋值语句,可以把可迭代对象 (列表,元祖,字典,字符串) 一次性赋给多个值。

a, b, c = (1, 2, 3)
a, b = b, a
numbers = [1, 2, 3, 4, 5]
for a, b in zip(numbers, numbers[1:]):
    print(a, b)
---------------------------------------------------------
1 2
2 3
3 4
4 5

注意:

  • 普通变量解包,需要注意变量数量和列表中元素数量应保持一致,否则报'SyntaxError: cannot assign to literal';
  • 如果可迭代对象是字典,则变量个数要等于字典中的键值对个数,若不指定字典的取值,则默认取字典的 key 值,若指定字典的值为 items(),则变量为字典键值对的元组形式;

问:有一个 key 为姓名,value 为年龄的字典,根据年龄正序排列姓名,并输出姓名列表,若没有年龄,则放在最后;

users = {'tom': 19, 'jerry': 13, 'jack': None, 'andrew': 43}
答:
知识点:在排序前将年龄为 None 的值变更为正无穷大;

  • 正无穷:float("inf")
  • 负无穷:float("-inf")
# 我想到的方法:
# 先将字典中年龄为None的值变更成正无穷大
def key_func(users):
    for key in users.keys():
        if users[key] is None:
            users[key] = float('inf')

# 根据年龄进行正序排序,最后以列表形式输入排序好的姓名
def sort_user(user: dict):
    sort_item_for_v = sorted(user.items(), key=lambda x: x[1])
    return [user[0] for user in sort_item_for_v]

key_func(users)
print(sort_user(users))
-------------------------------------------------------------------------------
['jerry', 'tom', 'andrew', 'jack']
# 参考答案:
def sort_user_inf(users: dict):
    """
    接收一个key为姓名,value为年龄的字典,根据年龄正序排列姓名,若没有年龄,则放在最后
    :param users: 用户名:年龄字典
    :return: 返回姓名列表
    """
    def key_func(username):
        age = users[username]
        # 当年龄为空时,返回正无穷大作为key,因此就会被排到最后
        return age if age is not None else float('inf')

    return sorted(users.keys(), key=key_func)

print(sort_user_inf(users))
-----------------------------------------------------------------------------
['jerry', 'tom', 'andrew', 'jack']

问:合并字典的多种方式?

答:

  • 方式 1:update
d1 = {'name': 'Lili', 'score': 90}
d2 = {'name': 'Tom', 'hobby': 'run'}

d1.update(d2)
print(d1)
-----------------------------
{'name': 'Tom', 'score': 90, 'hobby': 'run'}
# 这种方法会改变d1的原始值
  • 方式 2:编写一个函数 (不改变 d1 的原始值)
d1 = {'name': 'Lili', 'score': 90}
d2 = {'name': 'Tom', 'hobby': 'run'}

def update_dict(d1: dict, d2: dict):
    d = d1.copy()
    d.update(d2)
    return d

print(update_dict(d1,d2))
print(d1)
print(d2)
---------------------------------------
{'name': 'Tom', 'score': 90, 'hobby': 'run'}
{'name': 'Lili', 'score': 90}
{'name': 'Tom', 'hobby': 'run'}
  • 方式 3:解包
d1 = {'name': 'Lili', 'score': 90}
d2 = {'name': 'Tom', 'hobby': 'run'}

print({**d1, **d2})
print({**d2, **d1})
print(d1)
print(d2)
--------------------------------------
{'name': 'Tom', 'score': 90, 'hobby': 'run'}
{'name': 'Lili', 'hobby': 'run', 'score': 90}

{'name': 'Lili', 'score': 90}
{'name': 'Tom', 'hobby': 'run'}
  • 方式 4:Python3.9 版本后可用"|"合并字典
d1 = {'name': 'Lili', 'score': 90}
d2 = {'name': 'Tom', 'hobby': 'run'}

print(d1|d2)
print(d2|d1)
print(d1)
print(d2)
-----------------------------
{'name': 'Tom', 'score': 90, 'hobby': 'run'}
{'name': 'Lili', 'hobby': 'run', 'score': 90}

{'name': 'Lili', 'score': 90}
{'name': 'Tom', 'hobby': 'run'}

问:json 和 Python 中的 dict 有什么区别?

答:

  • 1.JSON 的类型是字符串,字典的类型是 dict;
  • 2.JSON 的 key 只能是字符串,字典的 key 可以是任何可 hash 对象,如:字符串,数字,元祖;
  • 3.JSON 的 key 是有序的,可以重复的;字典的 key 不能重复;
  • 4.JSON 的 key 有默认值 undefined,字典的 key 默认没有默认值;
  • 5.JSON 的 value 可以是字符串、浮点数、布尔值、null 或者他们组成的数组或对象,字典的 value 可以是任意类型的对象;
  • 6.JSON 的 value 访问方式可以是 [] 或者.,字典的 value 访问方式只能是 key 值;
  • 7.JSON 的字符串强制使用双引号,字典的字符串可以是单引号也可以是双引号;
  • 8.字典可以嵌套元祖,JSON 只有数组;
  • 9.真假空的表示:JSON(true,false,null),字典(True,False,None);
  • 10.JSON 的中文必须是 Unicode 编码,如"\u6211";

问:Python 列表和字符串的相互转换?

第一种类型:

s = '1,2,3,4,5'
l = s.split(',')
print(l)
l2 = [int(i) for i in l]
print(l2)
--------------------
['1', '2', '3', '4', '5']
[1, 2, 3, 4, 5]

第二种类型:

l1 = ['1','2','3']
s1 = ','.join(l1)
print(s1)
---------------
1,2,3

第三种类型:

l2 = [1,2,3]
s2 = ','.join([str(i) for i in l2])
print(s2)
-----------------------------
1,2,3
共收到 0 条回复 时间 点赞
耿晓 测试基础-Python 篇 问&答③ 中提及了此贴 02月14日 18:07
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册