初学 Python,此函数求优化

2016-01-01 12:48:06 +08:00
 hellogbk

大家新年快乐!
我初学 Python 一个星期左右,求优化下面这个函数,此函数的作用在于生成 IP 列表:

def parse_ip(ip):
    ips = []
    if '-' in ip:
        segments = ip.split(".")
        seg_index = 0
        for segment in segments:
            if '-' in segment:
                prefix = ".".join(segments[:seg_index])
                suffix = ".".join(segments[seg_index+1:])

                start, end = map(int, segment.split("-"))

                new_ips = [".".join(filter(lambda s: s, map(str,[prefix, ip_segment, suffix]))) for ip_segment in range(start, end +1)]
                for new_ip in new_ips:
                    ips += parse_ip(new_ip)

                break

            seg_index += 1

    else:
        ips += [ip]

    return ips


if __name__ == "__main__":
    print "\n".join(parse_ip("192.168.1-2.1-10"))

输出的结果是:

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
192.168.1.10
192.168.2.1
192.168.2.2
192.168.2.3
192.168.2.4
192.168.2.5
192.168.2.6
192.168.2.7
192.168.2.8
192.168.2.9
192.168.2.10

求指点代码还可以怎么优化,谢谢!

4730 次点击
所在节点    程序员
30 条回复
congeec
2016-01-01 17:05:21 +08:00
@ringzero from Python 3.2 we have int.to_bytes
>>> int.from_bytes(socket.inet_aton('192.168.1.1'), byteorder='big')
3232235777

>>> _.to_bytes(length=4, byteorder='big')
b'\xc0\xa8\x01\x01'

>>> socket.inet_ntoa(_)
'192.168.1.1'
congeec
2016-01-01 17:12:37 +08:00
Python 号称 battery included, 你应该用自带的 ipaddress 库,写起来方便性能还不错
poke707
2016-01-01 21:19:20 +08:00
基本就是参考 4 楼与 10 楼的优化计算逻辑(分段解析再求笛卡尔积)。
我来再尝试把代码意图写得更明显些
https://gist.githubusercontent.com/Ginhing/aae1096546e94921990b/raw/8f5ab916950381f2e433e752b10be8f99c72ba65/ip_segment_parser.py
hellogbk
2016-01-01 22:11:10 +08:00
@poke707
数学真的很重要啊。 我得去学学数学。
tt0411
2016-01-01 22:29:06 +08:00
看来主要技巧是 itertools.product ,我的代码

https://gist.github.com/7c00/9216518c4e7c35b296b8
Gothack
2016-01-01 22:38:40 +08:00
大神们都在炫技
congeec
2016-01-01 22:48:45 +08:00
@syv2 还是你屌。 python 的 itertools, functools, collection 这三个库真是必须掌握呢
Orzpls
2016-01-02 13:52:34 +08:00
马克之。
menc
2016-01-03 03:03:30 +08:00
别的不说

new_ips = [".".join(filter(lambda s: s, map(str,[prefix, ip_segment, suffix]))) for ip_segment in range(start, end +1)]

这行代码你觉得这个可读性过关么
Braid
2016-01-04 15:36:29 +08:00
@asxalex ddd

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/247648

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX