我刚接触过Python,并尝试了一些简单的脚本。如果您能给我一些关于如何改进或简化以下代码的建议,我将不胜感激。
#Coverts MAC Addresses into cisco format
def mac_conv(mac, sep='-'):
#split mac address into 3 groups
splitted_mac = mac.split(sep)
gr1 = ''.join(splitted_mac[0:2])
gr2 = ''.join(splitted_mac[2:4])
gr3 = ''.join(splitted_mac[4:])
#join groups into a single MAC
mac = gr1, gr2, gr3
final_mac = '.'.join(mac)
#print final MAC address
print(final_mac)
#Open file with MAC addresses and convert them
with open('mac.txt', 'r') as f:
for mac in f.readlines():
mac_conv(mac)发布于 2016-08-12 14:18:04
你的代码很好。我唯一想改变的就是减少线的数量。要做到这一点,我的算法将以列表理解的使用为基础。
gr1 )segments = mac.split(sep)
groups = [segments[0:2], segments[2:4], segments[4:]]
a = [''.join(group) for group in groups]
mac = '.'.join(a)
return mac然后我把最后三行连成一列。因为return和'.'.join很容易在一条单线线上理解。
除了上面的函数之外,您不需要使用f.readlines() --您只需要使用f。你应该经常使用四个空格。
这可能导致:
def mac_conv(mac, sep='-'):
segments = mac.split(sep)
groups = [segments[0:2], segments[2:4], segments[4:]]
return '.'.join(''.join(group) for group in groups)
with open('mac.txt', 'r') as f:
for mac in f:
print(mac_conv(mac))发布于 2016-08-12 14:14:06
首先,您应该使用return而不是print从函数中获取值,否则在尝试扩展程序时会出现问题。
def mac_conv(mac, sep='-'):
#etc
#return final MAC address
return final_mac
#Open file with MAC addresses and convert them
with open('mac.txt', 'r') as f:
for mac in f.readlines():
print(mac_conv(mac))我还将避免重用变量,特别是如果它是一个函数参数(mac)。实际上,您可以将这个变量的用法全部删除:
#join groups into a single MAC
final_mac = '.'.join([gr1, gr2, gr3])但是,如果我正在编写这篇文章,我可能只需要用几行代码来完成,因为您完全知道输入和输出字符串将如何格式化:
def mac_conv(mac, sep='-'):
mac_parts = mac.split(sep)
return "{0[0]}{0[1]}.{0[2]}{0[3]}.{0[4]}{0[5]}".format(mac_parts)如果这进入到产品中,我可能也会添加一些错误处理,以便允许输入的输入不是mac地址--太短、太长、分隔符和备用分组(cisco格式的地址仍然是有效的mac地址,但这个函数不能处理它)。
发布于 2016-08-12 14:24:47
代码看起来很好--它很有效,而且很容易理解。
您可以print结果,而不是return-ing it。如果您想用该格式的MAC执行其他操作(比如将其打印为某个字符串的一部分),您会做什么?
MAC地址可能有其他格式。如果有人成功地猜到mac_conv转换了MAC地址,那么他们仍然需要猜测格式。mac_to_cisco_format是长的,mac_to_cisco可能没事。
separator而不是sep可能对只看到函数签名的人有一点帮助(就像在许多IDE中一样)。
#Coverts MAC Addresses into cisco format应该是docstring。
#print final MAC address只是一个视觉垃圾-下一行是足够自我描述的。
您假设输入数据的某种格式,而不是显式地拼写出来。虽然您可以通过命名/文档来处理这个问题,但是您可以更改算法,将MACs从几种格式转换为CISCO -只需从字符串中删除分隔符(多个str.replace-s就可以了),然后根据需要对结果进行切片。
实际上,您可以接受所需的格式作为参数(而不是sep)。
https://codereview.stackexchange.com/questions/138527
复制相似问题