简体   繁体   English

在Python中高效创建实例

[英]Creating instances efficiently in Python

So I have a program in which I need to create 4 instances of a class with variables imported from an external document. 因此,我有一个程序,其中需要使用从外部文档导入的变量创建一个类的4个实例。 I have a solution and I have placed it below, but I want to know if there's an easier/more efficient way to do it, perhaps with a for loop. 我有一个解决方案,已将其放在下面,但是我想知道是否有一种更简单/更有效的方法,也许是使用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],)

Rule of thumb: if you have multiple variables with the same name except for a number at the end, replace all of them with a list. 经验法则:如果您有多个具有相同名称的变量,但末尾有一个数字,请用列表替换所有变量。

my_parts = []
for i in range(4):
    partsLine = partsDoc.readline()
    partsList = partsLine.split(' ')
    my_parts.append(Parts(partsList[0], partsList[1], partsList[2],))

You can still refer to individual parts using indexing, eg my_parts[2] , so you haven't lost any expressiveness by doing so. 您仍然可以使用索引来引用各个部分,例如my_parts[2] ,因此您并不会因此失去任何表现力。

Produce a list of the parts, don't use individual partN variable names. 生成零件列表 ,不要使用单独的partN变量名称。 Limit reading lines from the file to the first four with itertools.islice() : 使用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)

This can be further reduced using a list comprehension: 可以使用列表理解来进一步减少:

parts = [Parts(*line.split(None, 3)[:3]) for line in islice(partsDoc, 4)]

From here on out you can address these four parts with indexing: 从这里开始,您可以使用索引解决这四个部分:

parts[2]

gives you the results of the 3rd line in the file. 给您文件中第三行的结果。

Note that I replaced str.split(' ') with str.split(None, 3) ; 请注意,我用str.split(None, 3)替换了str.split(' ') str.split(None, 3) this changes the split behaviour to strip off extra whitespace at the start and end, and to limit the number of splits made to just what you need and no more. 这将更改拆分行为,以在开头和结尾去除多余的空格,并将拆分次数限制为仅您需要的内容,而不再需要。

Basic Version 基本版本

Using a function to create a new Parts instance: 使用函数创建新的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])

you can use it in a list comprehension: 您可以在列表理解中使用它:

parts = [make_part(parts_doc) for _ in range(4)]

Retrieve the instances through indexing: 通过索引检索实例:

parts[0]

Incremental Improvement I - Make the function take a line 增量改进I-使函数成一行

def make_part_from_line(parts_line):
    parts_list = parts_line.split(' ')
    return Parts(parts_list[0], parts_list[1], parts_list[2])

A file object is an iterator that returns the next line using next : 文件对象是一个迭代器,它使用next返回下一行:

parts = [make_part_from_line(next(parts_doc)) for _ in range(4)]

Incremental Improvement II - Shorten the function 增量改进II-缩短功能

def make_part_from_line(parts_line):
    return Parts(*parts_line.split(' ')[:3])

The * -syntax unpacks the list into three function arguments. * -syntax将列表解压缩为三个函数参数。

Incremental Improvement III - Make it a one-liner 增量改进III-使它成为单线

The function has only one line. 该功能只有一行。 Use it directly: 直接使用:

parts = [Parts(*next(parts_doc).split(' ')[:3]) for _ in range(4)]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM