Python: 传递一个函数调用的列表索引作为它自己的参数
Python: pass a function call's list index as its own argument
我有一个相当大的 (3.9 kB) 脚本,旨在根据某些参数、居中等对齐某些文本。
以下是我希望改进的块:(为有点代码高尔夫道歉,但重点不是功能的作用,而是它们的结构:它们在理论上工作得很好,但我很想制作它们更短)
#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 的 "we won't write your code for you" 政策,我绝对不打算寻求这样的帮助,只是指导:有没有办法(我用谷歌搜索过,用谷歌搜索过)通过其内容根据其数组索引动态迭代调用和自定义,使 LnMgn 及其类似数组更高效、更小?
只需使用列表理解。一个例子:
LnMgn = [calcMgn(index)*spa for index in range(4)]
您可以对所有其他人执行相同的操作。
您还可以创建函数列表:
func_list = [f1, f2, f3, f4]
并称呼他们,例如:
[func_list[i](i) for i in range(4)]
这个例子会 return:
[f1(0), f2(1), f3(2), f4(3)]
我有一个相当大的 (3.9 kB) 脚本,旨在根据某些参数、居中等对齐某些文本。
以下是我希望改进的块:(为有点代码高尔夫道歉,但重点不是功能的作用,而是它们的结构:它们在理论上工作得很好,但我很想制作它们更短)
#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 的 "we won't write your code for you" 政策,我绝对不打算寻求这样的帮助,只是指导:有没有办法(我用谷歌搜索过,用谷歌搜索过)通过其内容根据其数组索引动态迭代调用和自定义,使 LnMgn 及其类似数组更高效、更小?
只需使用列表理解。一个例子:
LnMgn = [calcMgn(index)*spa for index in range(4)]
您可以对所有其他人执行相同的操作。
您还可以创建函数列表:
func_list = [f1, f2, f3, f4]
并称呼他们,例如:
[func_list[i](i) for i in range(4)]
这个例子会 return:
[f1(0), f2(1), f3(2), f4(3)]