首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单MAC转换器

简单MAC转换器
EN

Code Review用户
提问于 2016-08-12 13:57:18
回答 3查看 4.9K关注 0票数 6

我刚接触过Python,并尝试了一些简单的脚本。如果您能给我一些关于如何改进或简化以下代码的建议,我将不胜感激。

代码语言:javascript
复制
#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)
EN

回答 3

Code Review用户

回答已采纳

发布于 2016-08-12 14:18:04

你的代码很好。我唯一想改变的就是减少线的数量。要做到这一点,我的算法将以列表理解的使用为基础。

  1. 将MAC分成几段。
  2. 将段分割成三个项目列表。(就像没有联接的gr1 )
  3. 执行列表理解,将切片段连接在一起。
  4. 加入新的三项列表。
  5. 还回去。
代码语言:javascript
复制
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。你应该经常使用四个空格。

这可能导致:

代码语言:javascript
复制
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))
票数 3
EN

Code Review用户

发布于 2016-08-12 14:14:06

首先,您应该使用return而不是print从函数中获取值,否则在尝试扩展程序时会出现问题。

代码语言:javascript
复制
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)。实际上,您可以将这个变量的用法全部删除:

代码语言:javascript
复制
#join groups into a single MAC
final_mac = '.'.join([gr1, gr2, gr3])

但是,如果我正在编写这篇文章,我可能只需要用几行代码来完成,因为您完全知道输入和输出字符串将如何格式化:

代码语言:javascript
复制
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地址,但这个函数不能处理它)。

票数 5
EN

Code Review用户

发布于 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中一样)。

Documentation

#Coverts MAC Addresses into cisco format应该是docstring

#print final MAC address只是一个视觉垃圾-下一行是足够自我描述的。

算法

您假设输入数据的某种格式,而不是显式地拼写出来。虽然您可以通过命名/文档来处理这个问题,但是您可以更改算法,将MACs从几种格式转换为CISCO -只需从字符串中删除分隔符(多个str.replace-s就可以了),然后根据需要对结果进行切片。

实际上,您可以接受所需的格式作为参数(而不是sep)。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/138527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档