上次说python是干啥的,简单理解就是通过各种方式搜集数据,进行数据处理,最后输出的一门工具语言。
其中经常用到的,比如把列表转成字符串,再把字符串处理后重新生成列表。下面以使用ip地址,生成isis的network为例来说明。
我们知道isis 的网络号通常是这样:“49.0001.0912.0908.6001.00”, 其中“0912.0908.6001” 这一段,通常是把loopback地址先补足3位,再分成3端算出来,比如192.168.10.1, 先变成192.168.010.001,去掉“.”,再按4位分割则是: 1921.6801.0001,网络号就是“49.0001.1921.6801.0001.00”
好了,那么先输入的IP地址"192.168.10.1"是一个字符串,首先按"."分割:
ip_list = ip.split('.')
然后补0到3位。由于数据比较固定,就用for循环搞定:
for n in range(0,4):
if len(ip_list[n]) == 3:
ip_list[n] = ip_list[n]
if len(ip_list[n]) == 2:
ip_list[n] = "0" + ip_list[n]
print(ip_list[n])
if len(ip_list[n]) == 1:
ip_list[n] = "00" + ip_list[n]
print(ip_list[n])
现在要ip_list是一个列表["192", "168", "110", "001"],说到正题,有三种方式可以把列表加起来:
1、最常见的是用for循环
net1 = ''
for i in ip_list:
net1 = net1 + i
print net1
这种方式的弊端是效率较低,因为在循环连接字符串的时候,每次都要重新开辟空间,然后把字符串连接起来,再放入新的空间,重复循环,内存操作比较频繁,效率低。数据量大的时候,会表现的很明显。
2、建议使用 join,最为简洁
net2 = ''.join(ip_list)
3、使用字符替换,
net1 = '%s%s%s%s' % tuple(ip_list)
但是你需要知道列表里有多少个值,否则会报错:
TypeError: not enough arguments for format string
现在得到了新的字符串,生成net只需按顺序取出相加即可:
net3 = "49.0001." + net1[0:4] + "." + net1[4:8] + "." + net1[8:12] + ".00"
print(net3)
4、当然也可以直接把列表里的值相加,需要对列表结构了解很清晰:
net1 = ip_list[0] + ip_list[1] +ip_list[2] + ip_list[3]
完整的脚本如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#用于输入IP地址,生成ISIS网络号
from pprint import pprint
import sys
ip = input("Please input ip address : xx.xx.xx.xx : ")
def ip_net(argv):
ip_list = ip.split('.')
print(ip_list)
#判断位数,可注释掉
print(len(ip_list[0]), len(ip_list[1]) , len(ip_list[2]), len(ip_list[3]))
#不足3位的加0
for n in range(0,4):
if len(ip_list[n]) == 3:
pass
if len(ip_list[n]) == 2:
ip_list[n] = "0" + ip_list[n]
print(ip_list[n])
if len(ip_list[n]) == 1:
ip_list[n] = "00" + ip_list[n]
print(ip_list[n])
# ip_net = ip_list[0] + ip_list[1] +ip_list[2] + ip_list[3]
net1 = ''
net1 = '%s%s%s%s' % tuple(ip_list)
net2 = ''.join(ip_list)
print("This is net1 : ", '%17s'%net1)
print("This is net2 : ", '%17s'%net2)
# print("This is ip_list : ", ip_list)
# print(("This is ip_net : ", ip_net)
net3 = "49.0001." + net2[0:4] + "." + net2[4:8] + "." + net2[8:12] + ".00"
print(net3)
# print("49.0001.0912.0908.6001.00")
return(net3)
ip_net(ip)
if __name__ == "__ip_net__":
ip_net(sys.argv)
输出结果如下:
Please input ip address : xx.xx.xx.xx : 192.168.10.1
['192', '168', '10', '1']
3 3 2 1
010
001
This is net1 : 192168010001
This is net2 : 192168010001
49.0001.1921.6801.0001.00
BTW,还有一个更简单的方法,前提是IP地址基本固定,比如说我们知道IP地址都在同一个C类地址,只有最后一位不同,如192.168.10.X/24, 生成的network地址都是类似"49.0001.0912.0908.6001.00" - "49.0001.0912.0908.6254.00"这样只有倒数几位不同的,可以用一句搞定:
'49.0001.1921.6801.0{:0>3d}.00'.format(int(ip.split('.')[3]))
意思是把ip地址以"."分割成列表后,把最后一个转换成数字,"{:0>3d}"表示长度3位,左边补0, 如果是"{:0<3d}"则是右边补0。