我还在学习Python(3.5),我有这段代码,需要为一些对象分配很多值,所以我想知道什么是最优化的方法。我问这个是因为我缺乏知识来理解循环中“较少的代码行”是否比不使用循环更耗时(文件大小较小,但是proccesing会增加......也许?)
方法1:
# 01
self.lineReferencia1.setText(utilidades.ensure_its_str(registro[16]))
self.lineConcepto1.setText(utilidades.ensure_its_str(registro[17]))
self.lineCantidad1.setText(utilidades.ensure_its_str(registro[18]))
self.linePrecio1.setText(utilidades.ensure_its_str(registro[19]))
self.lineDescuento1.setText(utilidades.ensure_its_str(registro[20]))
# 02
self.lineReferencia2.setText(utilidades.ensure_its_str(registro[23]))
self.lineConcepto2.setText(utilidades.ensure_its_str(registro[24]))
self.lineCantidad2.setText(utilidades.ensure_its_str(registro[25]))
self.linePrecio2.setText(utilidades.ensure_its_str(registro[26]))
self.lineDescuento2.setText(utilidades.ensure_its_str(registro[27]))
# 03
self.lineReferencia3.setText(utilidades.ensure_its_str(registro[30]))
self.lineConcepto3.setText(utilidades.ensure_its_str(registro[31]))
self.lineCantidad3.setText(utilidades.ensure_its_str(registro[32]))
self.linePrecio3.setText(utilidades.ensure_its_str(registro[33]))
self.lineDescuento3.setText(utilidades.ensure_its_str(registro[34]))
# 04
self.lineReferencia4.setText(utilidades.ensure_its_str(registro[37]))
self.lineConcepto4.setText(utilidades.ensure_its_str(registro[38]))
self.lineCantidad4.setText(utilidades.ensure_its_str(registro[39]))
self.linePrecio4.setText(utilidades.ensure_its_str(registro[40]))
self.lineDescuento4.setText(utilidades.ensure_its_str(registro[41]))
方法2:
items = (
(self.lineReferencia1, registro[16]), (self.lineConcepto1, registro[17]), (self.lineCantidad1, registro[18]),
(self.linePrecio1, registro[19]), (self.lineDescuento1, registro[20]), (self.lineReferencia2, registro[23]),
(self.lineConcepto2, registro[24]), (self.lineCantidad2, registro[25]), (self.linePrecio2, registro[26]),
(self.lineDescuento2, registro[27]), (self.lineReferencia3, registro[30]), (self.lineConcepto3, registro[31]),
(self.lineCantidad3, registro[32]), (self.linePrecio3, registro[33]), (self.lineDescuento3, registro[34]),
(self.lineReferencia4, registro[37]), (self.lineConcepto4, registro[38]), (self.lineCantidad4, registro[39]),
(self.linePrecio4, registro[40]), (self.lineDescuento4, registro[41]))
for i in items:
i[0].setText(utilidades.ensure_its_str(i[1]))
注意:通过这种方法,我将20行代码减少到10行,但实际代码不只有4个部分,它有27个,所以目标是减少135行代码。
方法3:
使用dict来存储数据而不是元组元组会在处理时更有效吗?
方法4:
我应该为每个项目而不是循环使用方法/函数吗?
真正的问题:还有其他方法可以减少该文件中的代码行数而不会影响性能或可读性吗?怎么样?为什么呢?
答案 0 :(得分:6)
代码本身看起来像是非常开发的界面,但假设你必须使用它,你可以用getattr
以编程方式获取对象的属性因此,组ID,索引参考点和属性,并使得像
一样lineReferencia
关于整体代码质量:
acme_api.event.jwt_created_listener:
class: AppBundle\EventListener\JWTCreatedListener
tags:
- { name: kernel.event_listener, event: lexik_jwt_authentication.on_jwt_created, method: onJWTCreated }
存储为对象列表答案 1 :(得分:0)
好方法:面向对象
应该创建一个带有字段Referncia,Concepto ...的对象行,并且您的主类包含一个行列表。这将与扩展版本一样快。
Class Line:
def __init__(self, ......):
self.referencia = .....
Class Polygon:
def __init__(self):
self.lines = ()
line1 = Line(.......)
self.lines.append(line1)
line2 =
快捷方式:适用于解释型语言
member_names = ("lineReferencia", "lineConcepto", "lineCantidad", "linePrecio", "lineDescuento")
for i in range(4):
for member_name in member_names:
text_widdget = self.__dict__["lineReferencia" + str(i)]
i_register = 16 + member_names.index(member_name) + 7 * i
text_widget.setText(utilidades.ensure_its_str(registro[i_register]))
注意使用self.__dict__
这是一个包含当前对象成员变量的dict,其名称为key。