一、一次性空格间隔输出列表元素,或者其他符号间隔输出列表元素
用print(*ls),还可以加入sep=''与end=''
ls=[1,2,3,4,5]
print(ls)
#[1,2,3,4,5]
print(*ls)
#1 2 3 4 5
print(*ls,sep=',',end='.\n')
#1,2,3,4,5.
二、位运算符
-
位与(
&
) 规则:两个对应位都为1
时,结果为1
,否则为0
。 示例:9 & 5
(9
的二进制00001001
,5
的二进制00000101
),运算结果为00000001
(十进制1
)。 -
按位或(
|
) 规则:两个对应位中至少有一个为1
时,结果为1
,否则为0
。 示例:9 | 5
(00001001 | 00000101
),运算结果为00001101
(十进制13
)。 -
按位异或(
^
) 规则:两个对应位不同时为1
,相同时为0
。 示例:9 ^ 5
(00001001 ^ 00000101
),运算结果为00001100
(十进制12
)。 -
按位取反(
~
) 规则:将操作数的每一位二进制取反(1
变0
,0
变1
)。 示例:~9
(9
的二进制00001001
,取反后为11110110
,在 Python 中按补码规则解释为-10
)。 -
左移位(
<<
) 规则:将二进制位向左移动指定位数,右侧补0
。相当于乘以 \(2^n\)(n 为移动位数)。 示例:9 << 2
(00001001
左移 2 位为0010100
,即9 * 4 = 36
)。 -
右移位(
>>
) 规则:将二进制位向右移动指定位数,左侧补0
(正数)或符号位(负数)。相当于整除 \(2^n\)。 示例:9 >> 2
(00001001
右移 2 位为00000010
,即9 // 4 = 2
)。
三、网络判断ipaddress库
判断子网
ipaddress
库是 Python 标准库的一部分,它提供了用于操作 IPv4 和 IPv6 地址和网络的类。以下是 ipaddress
库中一些常用类和方法的用法及参数介绍:
1. ipaddress.ip_address()
- 功能:创建一个表示单个 IP 地址的对象。
- 参数:可以是字符串形式的 IP 地址,也可以是整数形式的 IP 地址。
- 示例代码:
import ipaddress
# 创建 IPv4 地址对象
ipv4 = ipaddress.ip_address('192.168.1.1')
print(ipv4)
# 创建 IPv6 地址对象
ipv6 = ipaddress.ip_address('2001:0db8:85a3:0000:0000:8a2e:0370:7334')
print(ipv6)
'''
192.168.1.1
2001:db8:85a3::8a2e:370:7334
'''
2. ipaddress.ip_network()
- 功能:创建一个表示 IP 网络的对象。
- 参数:
- 第一个参数是字符串形式的网络地址和子网掩码(如
'192.168.1.0/24'
)。 strict
参数(可选):默认为True
,表示严格检查输入的网络地址是否为网络地址的起始地址;若为False
,则允许输入非网络地址的起始地址。
- 第一个参数是字符串形式的网络地址和子网掩码(如
import ipaddress
# 创建 IPv4 网络对象
ipv4_network = ipaddress.ip_network('192.168.1.0/24')
print(ipv4_network)
# 允许非网络地址的起始地址
ipv4_network_non_strict = ipaddress.ip_network('192.168.1.1/24', strict=False)
print(ipv4_network_non_strict)
'''
192.168.1.0/24
192.168.1.0/24
'''
3. ipaddress.ip_interface()
- 功能:创建一个表示 IP 接口的对象,结合了 IP 地址和所属网络。
- 参数:字符串形式的 IP 地址和子网掩码(如
'192.168.1.1/24'
)。
import ipaddress
# 创建 IPv4 接口对象
ipv4_interface = ipaddress.ip_interface('192.168.1.1/24')
print(ipv4_interface)
'''
192.168.1.1/24
'''
4. 常用方法和属性
- 属性:
version
:返回 IP 地址的版本(4 或 6)。network
:返回该 IP 地址所属的网络。broadcast_address
:返回网络的广播地址。num_addresses
:返回网络中可用的 IP 地址数量。
- 方法:
hosts()
:返回网络中所有可用的主机地址的迭代器。
import ipaddress
ipv4_network = ipaddress.ip_network('192.168.1.0/24')
print(f"网络版本: {ipv4_network.version}")
print(f"广播地址: {ipv4_network.broadcast_address}")
print(f"可用 IP 地址数量: {ipv4_network.num_addresses}")
print("可用主机地址:")
for host in ipv4_network.hosts():
print(host)
'''
网络版本: 4
广播地址: 192.168.1.255
可用 IP 地址数量: 256
可用主机地址:
...
...
...
...
...
'''
5. 判断 IP 地址的类型
import ipaddress
# 判断是否为 IPv4 地址
try:
ip = ipaddress.ip_address('192.168.1.1')
if isinstance(ip, ipaddress.IPv4Address):
print("这是一个 IPv4 地址")
elif isinstance(ip, ipaddress.IPv6Address):
print("这是一个 IPv6 地址")
except ValueError:
print("输入的不是有效的 IP 地址")
#输出:这是一个 IPv4 地址
# 判断是否为私有地址
ip = ipaddress.ip_address('192.168.1.1')
if ip.is_private:
print("这是一个私有 IP 地址")
#输出:这是一个私有 IP 地址
# 判断是否为回环地址
ip = ipaddress.ip_address('127.0.0.1')
if ip.is_loopback:
print("这是一个回环 IP 地址")
#输出:这是一个回环 IP 地址
6. 地址的比较与排序
import ipaddress
ips = [
ipaddress.ip_address('192.168.1.3'),
ipaddress.ip_address('192.168.1.1'),
ipaddress.ip_address('192.168.1.2')
]
sorted_ips = sorted(ips)
for ip in sorted_ips:
print(ip)
'''
192.168.1.1
192.168.1.2
192.168.1.3
'''
7.IP 地址和整数之间进行相互转换
import ipaddress
ip = ipaddress.ip_address('192.168.1.1')
ip_int = int(ip)
print(f"IP 地址 {ip} 转换为整数: {ip_int}")
new_ip = ipaddress.ip_address(ip_int)
print(f"整数 {ip_int} 转换为 IP 地址: {new_ip}")
'''
IP 地址 192.168.1.1 转换为整数: 3232235777
整数 3232235777 转换为 IP 地址: 192.168.1.1
'''
8. 网络地址的合并与拆分
import ipaddress
# 合并网络示例
networks = [
ipaddress.ip_network('192.168.1.0/25'),
ipaddress.ip_network('192.168.1.128/25')
]
'''
ipaddress.collapse_addresses() 函数的作用是将一系列相邻的子网合并成更大的网络。
这里传入 networks 列表,尝试将其中的两个子网合并。
该函数返回一个迭代器,使用 list() 函数将迭代器转换为列表,存储在 merged_networks 变量中。
'''
merged_networks = list(ipaddress.collapse_addresses(networks))
for net in merged_networks:
print(f"合并后的网络: {net}")
'''
输出:合并后的网络: 192.168.1.0/24
'''
# 拆分网络示例
big_network = ipaddress.ip_network('192.168.0.0/16')
subnets = list(big_network.subnets(prefixlen_diff=2))
'''
big_network.subnets() 是 IPv4Network 对象的一个方法,用于将一个大的网络拆分成多个较小的子网。
prefixlen_diff 参数指定子网掩码前缀长度的增加量。
这里设置为 2,表示将原来 /16 的子网掩码增加 2 位,变为 /18。
该方法返回一个迭代器,使用 list() 函数将其转换为列表,存储在 subnets 变量中。
'''
for subnet in subnets:
print(f"拆分后的子网: {subnet}")
'''
拆分后的子网: 192.168.0.0/18
拆分后的子网: 192.168.64.0/18
拆分后的子网: 192.168.128.0/18
拆分后的子网: 192.168.192.0/18
'''