python - 当我尝试使用参数测试我的代码时,我正在努力从我的函数中删除此错误
问题描述
当我尝试使用“我遇到的错误”列表中列出的参数测试我的代码时,我正在努力从我的函数中删除此错误
有人可以帮助我我一直在尝试修复此错误但无法解决吗?
我在下面列出:
我们必须为此代码处理的 number.txt 文件
我得到的错误
我的代码
样品测试
所以我的问题很清楚。
在这个问题中使用customers.txt 文件。
12345,Tom,Black,300.00,1998-01-30
23456,Alice,Smith,1200.50,1998-02-20
14567,Jane,White,900.00,1998-07-01
43564,Weilin,Zhao,450.25,1998-01-03
45432,Bina,Mehta,278.95,1998-03-21
我得到的错误
Test various parameters: '['customers file variable', '12345']'
ERROR:
Expected: ['12345', 'Tom', 'Black', '300.00', '1998-01-30']
Test various parameters: '['customers file variable', '45432']'
ERROR:
Expected: ['45432', 'Bina', 'Mehta', '278.95', '1998-03-21']
def customer_by_id(fh, id_number):
"""
-------------------------------------------------------
Find the record for a given ID in a sequential file.
Use: result = customer_by_id(fh, id_number)
-------------------------------------------------------
Parameters:
fh - file to search (file handle - already open for reading)
id_number - the id_number to match (str)
Returns:
result - the record with id_number if it exists,
an empty list otherwise (list)
-------------------------------------------------------
"""
num = fh.read().split("\id_number")
if int(id_number) < len(num):
result = int(num[id_number]).strip().split(",")
else:
result = []
print(result)
样品测试:
Find customer by id_number
Enter an ID: 23456
['23456', 'Alice', 'Smith', '1200.50', '1998-02-20']
----
Find customer by id_number
Enter an ID: 99999
[]
解决方案
首先,在您的代码中,.split("\id_number")
导致了问题。它在文本文件中查找不存在的字符串。 \id_number
因此,这会产生一个包含单个元素的列表,后者是整个文本。
然后该if
条款没有意义,直言不讳。左侧是例如12345
表示客户id的整数。另一方面,右侧是列表的元素数,即 1。语法正确,但语义错误。
所以当你看到这个时,LHS 几乎总是一个很大的数字,比如 12345,而 RHS 是 1。if
因此,这个子句永远不会被执行。相反,else
达到了部分,导致一个空列表。
这是我不使用 csv 的建议。
def customer_by_id(fh, id_number):
records = f.read().splitlines()
records = [record.split(",") for record in records]
for record in records:
if record[0] == id_number:
return record
return []
with open("customers.txt", "r") as f:
print(customer_by_id(f, "23456"))
在函数定义的第一行,records
是一个包含每行customers.txt 的列表。所以它看起来像
['23456,Alice,Smith,1200.50,1998-02-20', '14567,Jane,White,900.00,1998-07-01', ...]
请注意,列表的每个元素只是一个字符串。
第二行现在使用 . 将每个字符串转换为列表split()
。现在records
是一个列表的列表,即 的每个元素records
又是一个列表。现在看起来像
[['23456', 'Alice', 'Smith', '1200.50', '1998-02-20'], ['14567', 'Jane', 'White', '900.00', '1998-07-01'], ... ]
接下来,for 循环遍历这些子列表并将(子列表的)第一个元素与id_number
. 如果它们匹配,则返回子列表(结束函数)。否则,继续迭代。当它们都不匹配id_number
,return []
时。
推荐阅读
- node.js - 返回html时获取双引号
- codeigniter - 添加 database.sql /docker-entrypoint-initdb.d/database.sql
- apache-kafka - 如何实现幂等KafkaProducer的回退?
- git - 在重构期间拆分文件时跟踪文件与 git 一起移动
- python - 如何在“matplotlib”中只找到波中的大峰
- gdb - 为什么设置断点并运行失败(第 2 章 shellcoder 手册)
- c# - 允许您更改 MS Teams 的默认帐户的脚本
- c# - 运行多个存储过程的最佳方法是什么?
- javascript - 如何将多个返回的 SQL 行组合成一个字符串
- sql-server - SQL:如何将行转换为列(需要另一种方法)