这个Python代码可以进一步压缩吗?

这个Python代码可以进一步压缩吗?,python,coding-style,Python,Coding Style,下面是获取域中所有子域的Python代码。它接受一个包含网站页面源的文件作为输入。第二个参数是域名。例如:”https://www.sometime.com“ 我试着将内部的“if-else语句”缩小到 for ele in m: subDomainLst.append(ele.split('/')[2]) if(m) else continue 但这是一个错误 上面的代码是否可以进一步缩小(目前为16行),以便占用最少的行数并变得更像Python?您可能需要将if语句更改为try..exce

下面是获取域中所有子域的Python代码。它接受一个包含网站页面源的文件作为输入。第二个参数是域名。例如:
”https://www.sometime.com“

我试着将内部的“if-else语句”缩小到

for ele in m: subDomainLst.append(ele.split('/')[2]) if(m) else continue
但这是一个错误


上面的代码是否可以进一步缩小(目前为16行),以便占用最少的行数并变得更像Python?

您可能需要将
if
语句更改为
try..except

try:
    for ele in m: subDomainLst.append(ele.split('/')[2])
except TypeError:
    print "OMG m is not iterable!"

或者诸如此类的事情,你有两个不同的目标:缩小界线,变得更像蟒蛇。 这里是一行,但不是pythonic:

import re;fil,domain = raw_input("Enter the file name\n"),raw_input("Enter the domain\n");print '\n'.join(set(ele.split('/')[2] for line in open(fil) for ele in (re.findall(r'\bhref="\https://[\w+\.*]+%s/'%domain,line) or ())))
您不需要添加“继续”。您可以尝试这样做,尽管我不建议这样做,因为这样会使代码不可读

subDomainLst = [ele.split('/')[2] for line in f for ele in re.findall(r'\bhref="\https://[\w+\.*]+%s/' % domain, line)]
顺便说一句,您应该将代码缩进4个空格,并尽量避免一行不可理解的语句:pythonic意味着也可读

完整代码:

if __name__ == '__main__':
    import re 
    fil, domain = raw_input("Enter the file name\n"), raw_input("Enter the domain\n")
    with open(fil) as f:
        print '\n'.join([ele.split('/')[2] for line in f for ele in re.findall(r'\bhref="\https://[\w+\.*]+%s/' % domain, line)])

您可以完全删除
else:continue
部分,因为首先不需要它。请注意,“这样它就占用了最少的行数并变得更像pythonic?”可能是互斥的-Python优先考虑代码的可读性,而为了它而压缩是不好的形式(遗漏空格、单字符标识符等)阅读,并解释为什么希望它更短。@Frederic您的建议是下降,但我已经想出了一些办法。可以使用大写字母“Continue”而不是“Continue”。因此,在m:subDomainLst.append(ele.split(“/”)[2])中使用的最后一行as将用于ele:subDomainLst.append(ele.split(“/”)[2]),如果(m)其他的Continue@jonrsharpe我欢迎你的建议。在这里,我试图把这个程序作为一个挑战/竞赛,让我的同事们编写最短的代码。所以我的程序必须是最短的。@Harvey,在长度上竞争有什么意义?为什么不改变挑战,编写最整洁的代码或最有效的代码?c的一个点竞赛是磨练你的技能,在这种情况下,你似乎磨练了错误的技能。明白你的意思了。这将作为对最短代码的挑战。我在一行上完成了它,因为“目标”是使它变短。干杯。你是一颗宝石。除了“;”以外的任何东西都将受到赞赏。
if __name__ == '__main__':
    import re 
    fil, domain = raw_input("Enter the file name\n"), raw_input("Enter the domain\n")
    with open(fil) as f:
        print '\n'.join([ele.split('/')[2] for line in f for ele in re.findall(r'\bhref="\https://[\w+\.*]+%s/' % domain, line)])