测试基础 测试基础-Python 篇 琐碎但十分实用的知识点

耿晓 · 2023年02月14日 · 最后由 耿晓 回复于 2023年02月24日 · 4628 次阅读

再梳理一遍 Python 系列知识点,夯实基础,无他,唯手熟尔

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

  • for......else......的执行顺序:
    当迭代对象完成所有迭代后且此时的迭代对象为空时,如果存在 else 子句则执行 else 子句,没有则继续执行后续代码;如果迭代对象因为某种原因(如带有 break 关键字)提前退出迭代,则 else 子句不会被执行,程序将会直接跳过 else 子句继续执行后续代码;

  • 数值型比较不能使用 not in,因为 not in 本质是循环遍历右侧数据,用左侧数据进行比对,len() in range(1,5) 可以使用,因为 range 是一个集合,可以遍历, "li" in "lili"不建议使用,因为返回结果为 True(包含),达不到预期结果,所以准确比较建议使用'==';

  • 字典取值:有两种方式,a={'name':'lili'}
    第一种:a['name']
    第二种: a.get('name')
    区别:a['wenwen'] 报错-KeyError a.get('wenwen') 不报错-None

  • 如果在方法中给全局变量赋值,则要在方法中提前声明全局变量-global;

  • 列表转成字符串''.join(list)
    用''中的字符串作为连接,拼接 list 列表中的每个元素 --- 只能用在每个元素都是字符串的时候可以用,要不然就会报错;

  • 集合数据类型 set 取值
    因为集合(set)是一种无序的不重复的元素的集合。因为集合中的元素没有特定的顺序,所以无法通过下标索引来访问。
    可以使用循环遍历取值,也可使用 in 判断目标元素是否在集合中。

  • 当遇到复杂计算的数字字面量时,保留整个数学公式,提示可读性也不会降低性能;

  • 要判断某个容器是否包含特定成员,用集合比用列表更合适,因为集合底层使用了哈希表数据结构

# 列表数据越多效果越明显
VALID_NAMES = ['pip', 'lili', 'name']

VALID_NAMES_SET = set(VALID_NAMES)

def validate_name(name):
    if name not in VALID_NAMES_SET:
        raise ValueError(f'{name} is not a valid name')
  • 使用集合去重会导致去重后的集合丢失原有的成员顺序,若要去重,又要保持原有的成员顺序可使用有序字典 OrderedDict
nums = [10, 2, 3, 21, 10, 3]

def ordered_dict(member: list[int]):
    from collections import OrderedDict
    result = list(OrderedDict.fromkeys(member).keys())
    return result

print(ordered_dict(nums))
----------------------------------------------------
[10, 2, 3, 21]
  • 在遍历时不要直接修改原列表,可以启用一个新列表来保存修改后的成员;

  • 对于未来可能会变动的多返回值函数来说,可以使用 NamedTuple 类型对返回结果进行建模,可以减少后期代码变动对已有程序的影响

from typing import NamedTuple

class Address(NamedTuple):
    """地址信息结果"""
    country: str
    province: str
    city: str

def latlon_to_address(lat, lon):
    return Address(
        country = country,
        province=  province,
        city = city,
    )
addr = latlon_to_address(lat, lon)
# 通过属性名来使用addr
# addr.city / addr.country / addr.province
  • 使用 product() 扁平化多层嵌套循环 product() 接收多个可迭代对象作为参数,然后根据他们的笛卡尔积不断生成结果;
from itertools import product

print(list(product([1,2],[3,4])))
----------------------------------------
[(1, 3), (1, 4), (2, 3), (2, 4)]
# 常用多层嵌套循环
def find_twelve(nem_list1, num_list2, num_list3):
    "从这三个数字列表中,寻找是否存在和为12的3个数"
    for num1 in num_list1:
        for num2 in num_list2:
            for num3 in num_list3:
                 if num1 + num2 + num3 == 12:
                    return num1, num2, num3

# 使用product()扁平化多层嵌套循环
from itertools import product

def find_tewlve_v2(num_list1, num_list2, num_list3):
    for num1, num2, num3 in product(num_list1, num_list2, num_list3):
        if num1 + num2 + num3 == 12:
            return num1, num2, num3
  • 使用 islice 实现循环内隔行处理 需求:有一个文件,隔行读取文件中的内容。
# 方法1:使用enumerate
def parse_titles(filename):
    """从各行数据文件中取数据"""
    with open(filename, 'r') as fp:
        for i, line in enumerate(fp):
            if i % 2 == 0:
                yield line

if __name__ == '__main__':
    message_generator = parse_titles('logs.txt')
    while True:
        try:
            print(next(message_generator))
        except StopIteration as e:
            break

但如果需求变更为每隔 3 行读取或者每隔 4 行读取,那我们按照以上的写法应该怎么筛选呢?

# 方法2:使用islice
from itertools import islice

def parse_titles_v2(filename):
    """使用slice实现隔行取值"""
    with open(filename, 'r') as fp:
        for line in islice(fp, 0, None, 2): # islice(seq, start, end, step)
            yield line

if __name__ == '__main__':
    message_generator = parse_titles_v2('logs.txt')
    while True:
        try:
            print(next(message_generator))
        except StopIteration as e:
            break

如果需求变更为每隔 3 行读取或者每隔 4 行读取,我们只需要将 islice(seq, start, end, step) 中的 step 改成 3 或者 4 就行了

测试基础-Python 篇 问&答①

共收到 1 条回复 时间 点赞
耿晓 测试基础-Python 篇 基础③ 中提及了此贴 02月14日 15:47

平时多和 Error 见见面,等调试的时候就不那么发憷了!😀
测试基础-Python 篇 PyCharm 调试步骤及 Python 运行时常见错误

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册