因为我是网络工程师,从开始学python3起就对判断ipv4地址是否合法有需求,目前这个是觉得最简洁好用的了。
def is_ipv4(ip: str) -> bool:
'检查ip是否合法'
return ([True] * 4 == [(True) if (x.isdigit() and 0 <= int(x) <= 255) else (False) for x in ip.split('.')])
几个地方给新人解释一下:
1、(ip: str) -> bool
提示而不是强制!!
提示你输入ip这个参数的类型应该是str,返回值应该是bool
def在接受参数的时候不会去强制检查参数类型
2、列表推导式
[(True) if (x.isdigit() and 0 <= int(x) <= 255) else (False) for x in ip.split('.')]),
for x in ip.split('.') 将其按小数点分割,稍后再判断每一位的值是否合法,合法就append1个True到返回列表,不合法就append1个False到返回列表
每一位的判断过程:
返回 True,如果x是数字,且在0到255的范围,
返回False,如果x不是数字(因为是and连接,前面x是false,后面就不执行判断数字范围了,假如x是非数字,这里的int(x)也不会报错,因为没有执行它)
返回False,如果x是数字,但int(x)得到的数字不在0到255的范围里面
如果每一位都合法,且列表长度为4,则列表推导式返回的列表是[True, True, True, True]
3、[True] * 4
[True] * 4 就是 [True, True, True, True]
4、return(XX == YY)
== 检查XX和YY,如果相同,结果是1个True,如果不同,结果是1个False,将其返回