[英]Creating instances efficiently in Python
因此,我有一个程序,其中需要使用从外部文档导入的变量创建一个类的4个实例。 我有一个解决方案,已将其放在下面,但是我想知道是否有一种更简单/更有效的方法,也许是使用for循环。
partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part1 = Parts(partsList[0], partsList[1], partsList[2],)
partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part2 = Parts(partsList[0], partsList[1], partsList[2],)
partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part3 = Parts(partsList[0], partsList[1], partsList[2],)
partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part4 = Parts(partsList[0], partsList[1], partsList[2],)
经验法则:如果您有多个具有相同名称的变量,但末尾有一个数字,请用列表替换所有变量。
my_parts = []
for i in range(4):
partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
my_parts.append(Parts(partsList[0], partsList[1], partsList[2],))
您仍然可以使用索引来引用各个部分,例如my_parts[2]
,因此您并不会因此失去任何表现力。
生成零件列表 ,不要使用单独的partN
变量名称。 使用itertools.islice()
将文件的读取行限制为前四行:
from itertools import islice
parts = []
for line in islice(partsDoc, 4):
part = Parts(*line.split(None, 3)[:3]) # apply the first 3 elements as arguments
parts.append(part)
可以使用列表理解来进一步减少:
parts = [Parts(*line.split(None, 3)[:3]) for line in islice(partsDoc, 4)]
从这里开始,您可以使用索引解决这四个部分:
parts[2]
给您文件中第三行的结果。
请注意,我用str.split(None, 3)
替换了str.split(' ')
str.split(None, 3)
; 这将更改拆分行为,以在开头和结尾去除多余的空格,并将拆分次数限制为仅您需要的内容,而不再需要。
使用函数创建新的Parts
实例:
def make_part(parts_doc):
parts_line = parts_doc.readline()
parts_list = parts_line.split(' ')
return Parts(parts_list[0], parts_list[1], parts_list[2])
您可以在列表理解中使用它:
parts = [make_part(parts_doc) for _ in range(4)]
通过索引检索实例:
parts[0]
def make_part_from_line(parts_line):
parts_list = parts_line.split(' ')
return Parts(parts_list[0], parts_list[1], parts_list[2])
文件对象是一个迭代器,它使用next
返回下一行:
parts = [make_part_from_line(next(parts_doc)) for _ in range(4)]
def make_part_from_line(parts_line):
return Parts(*parts_line.split(' ')[:3])
*
-syntax将列表解压缩为三个函数参数。
该功能只有一行。 直接使用:
parts = [Parts(*next(parts_doc).split(' ')[:3]) for _ in range(4)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.