You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以Pythonic方式遍历指定CIDR范围的/16子网并获取下一个子网

嘿,这个需求用netaddr模块来实现简直完美,完全符合你想要的Pythonic风格,再也不用手动去拆分IP字符串、递增八位组这种容易出错的操作了!

首先,先确保你已经安装了netaddr:

pip install netaddr

接下来直接上代码,我会一步步解释:

from netaddr import IPNetwork, IPAddress

def get_all_16_subnets(start_cidr, end_cidr):
    # 把起始和结束的CIDR转换成IPNetwork对象,方便后续操作
    start_net = IPNetwork(start_cidr)
    end_net = IPNetwork(end_cidr)
    
    # /16子网的网络地址增量是2^(32-16) = 65536,也就是2**16
    subnet_step = 2 ** 16
    
    # 把起始网络地址转成整数,方便计算
    current_net_int = int(start_net.network)
    end_net_int = int(end_net.network)
    
    # 循环遍历直到超过结束网段
    while current_net_int <= end_net_int:
        # 把整数转回IP地址,再包装成/16的子网对象
        current_subnet = IPNetwork(f"{IPAddress(current_net_int)}/16")
        yield current_subnet
        # 跳到下一个/16子网
        current_net_int += subnet_step

# 测试使用
start_range = "10.40.0.0/16"
end_range = "10.100.0.0/16"

for subnet in get_all_16_subnets(start_range, end_range):
    print(subnet.cidr)  # 输出每个/16子网的CIDR格式

为什么这是更Pythonic的实现?

  • 类型安全:用netaddr的IPNetwork和IPAddress处理IP,避免了手动字符串拆分、拼接的繁琐和潜在错误(比如跨255的网段跳转,手动处理很容易写错)。
  • 迭代器风格:用生成器yield返回子网,符合Python的迭代器设计哲学,内存友好,还能直接用for循环遍历。
  • 可读性高:代码逻辑清晰,每一步都有明确的意义,不用猜那些字符串操作是在干嘛。

如果只是简单的一次性遍历,也可以简化成更紧凑的版本:

from netaddr import IPNetwork, IPAddress

start_net = IPNetwork("10.40.0.0/16")
end_net = IPNetwork("10.100.0.0/16")

current = int(start_net.network)
while current <= int(end_net.network):
    print(f"{IPAddress(current)}/16")
    current += 2**16

这个方法不仅能处理你当前的10.40.x.x到10.100.x.x的场景,哪怕是跨大网段(比如从10.255.0.0/16到11.5.0.0/16)也能自动正确处理,比手动操作八位组靠谱多了!

内容的提问来源于stack exchange,提问作者Barun Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:13:59