2015-10-22 10 views
-3

我有一个相当大的(3.9 kB)脚本,旨在根据一些参数对齐一些文本,居中等。 这里是块寻求改善:(对于有些-codegolf道歉但问题是不是有什么功能做的,但它们的结构:他们工作得很好,因为它是在理论上,而且我浑身酸痛,使他们更短)

Python:传递一个函数调用的列表索引作为自己的参数

#manage + control the margin in spaces between the body text and right vertical rule 
def calcMgn(lnNum): return toEven(bwinner-(len(LnOpn[lnNum])+len(LnCtn[lnNum])),-1)//2 
def calcRMgn(lnNum): return (0-(1-(toEven(((bwinner-(len(LnOpn[lnNum])+len(LnCtn[lnNum])))//2),-1)))) 
def calcLenOf(lnNum): return len(LnMgn[lnNum])+len(LnOpn[lnNum])+len(LnCtn[lnNum])+calcRMgn(lnNum) 
def calcRDiff(lnNum): return LnMgnR[lnNum] - (lenOf[lnNum] - bwinner) 
def calcRMgnSpa(lnNum): return ((LnMgnRAdjust[lnNum])-adjust) 
    #there absolutely must be a better way to call a function based on its position in a list than the following: 
LnMgn=[calcMgn(0)*spa,calcMgn(1)*spa,calcMgn(2)*spa,calcMgn(3)*spa] 
LnMgnR=[calcRMgn(0),calcRMgn(1),calcRMgn(2),calcRMgn(3)] 
lenOf=[calcLenOf(0),calcLenOf(1),calcLenOf(2),calcLenOf(3)] 
LnMgnRAdjust=[calcRDiff(0),calcRDiff(1),calcRDiff(2),calcRDiff(3)] 
LnMgnR_spa=[calcRMgnSpa(0)*spa,calcRMgnSpa(1)*spa,calcRMgnSpa(2)*spa,calcRMgnSpa(3)*spa,] 
    #take the lengths for a test drive to see if they break any rules 
testLen=[LnMgn[0] + LnOpn[0] + spa + LnCtn[0] + LnMgnR_spa[0],\ 
LnMgn[1] + LnOpn[1] + spa + LnCtn[1] + LnMgnR_spa[1],\ 
LnMgn[2] + LnOpn[2] + spa + LnCtn[2] + LnMgnR_spa[2],\ 
LnMgn[3] + LnOpn[3] + spa + LnCtn[3] + LnMgnR_spa[3]] #instead of this, I want something like a for statement or ??? 
for i in range(0,3): 
    if len(testLen[i]) > bwinner: 
     LnMgnR_spa[i] = int((toEven(LnMgnRAdjust[i])-adjust)-(len(testLen[i])-bwinner))*str(spa) 
    #concatenate strings 
addLine=[idt + vl + LnMgn[0] + LnOpn[0] + spa + LnCtn[0] + LnMgnR_spa[0] + vr + nl,\ 
idt + vl + LnMgn[1] + LnOpn[1] + spa + LnCtn[1] + LnMgnR_spa[1] + vr + nl,\ 
idt + vl + LnMgn[2] + LnOpn[2] + spa + LnCtn[2] + LnMgnR_spa[2] + vr + nl,\ 
idt + vl + LnMgn[3] + LnOpn[3] + spa + LnCtn[3] + LnMgnR_spa[3] + vr + nl] 



我知道SO的政策是“我们不会为你写代码”,而且我绝对不打算要求这样的好处,只是指导:有没有办法(我已经用Google和Google搜索)来制作LnMgn并且其类似的数组通过其内容动态地迭代地调用和基于它们的数组索引的自定义而更高效且更少巨大?

+3

不要只是为不好的格式道歉 - 如果你希望其他人阅读并遵循你的代码,你应该阅读并遵循[风格指南](http://www.python.org/)开发/ PEPS/PEP-0008 /)。你应该阅读例如'map'和'zip'以及*“comprehensions”*来帮助改进你的代码。 – jonrsharpe

+0

@jonrsharpe好东西别人永远不会读这个,然后 – cat

+3

...除了**你要求我们所有人现在阅读**。不管你喜欢什么,你都可以编写自己的代码,但前提是你从不提问或者与其他人合作。只要不是这种情况(或以前,视情况而定...),找到并遵循风格指南;这只是基本的礼貌。 – jonrsharpe

回答

1

您还可以创建功能列表:

func_list = [f1, f2, f3, f4] 

,并呼吁它们,例如,如:

[func_list[i](i) for i in range(4)] 

这个例子将返回:

[f1(0), f2(1), f3(2), f4(3)] 
+0

你也可以做'[func(index)for index,func in enumerate(func_list)]''。 – jonrsharpe

1

只需使用列表理解。举一个例子:

LnMgn = [calcMgn(index)*spa for index in range(4)] 

您可以对所有其他人做同样的事情。

+1

另外,只想说读这些东西让我的眼睛流血。请正确格式化您的代码,这对每个人都有好处。 – tzaman

相关问题