python零碎知识点

一、一次性空格间隔输出列表元素,或者其他符号间隔输出列表元素

用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 时,结果为 1,否则为 0。 示例:9 & 59 的二进制 000010015 的二进制 00000101),运算结果为 00000001(十进制 1)。

  2. 按位或(| 规则:两个对应位中至少有一个为 1 时,结果为 1,否则为 0。 示例:9 | 500001001 | 00000101),运算结果为 00001101(十进制 13)。

  3. 按位异或(^ 规则:两个对应位不同时为 1,相同时为 0。 示例:9 ^ 500001001 ^ 00000101),运算结果为 00001100(十进制 12)。

  4. 按位取反(~ 规则:将操作数的每一位二进制取反(1 变 00 变 1)。 示例:~99 的二进制 00001001,取反后为 11110110,在 Python 中按补码规则解释为 -10)。

  5. 左移位(<< 规则:将二进制位向左移动指定位数,右侧补 0。相当于乘以 \(2^n\)(n 为移动位数)。 示例:9 << 200001001 左移 2 位为 0010100,即 9 * 4 = 36)。

  6. 右移位(>> 规则:将二进制位向右移动指定位数,左侧补 0(正数)或符号位(负数)。相当于整除 \(2^n\)。 示例:9 >> 200001001 右移 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
'''

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值