Python技术迷

女生和32岁大厂程序员交往半年多,最近纠结要不要分手,原因直接给我看懵了:“他不行”…

刚看到个贴子,说一女生和32岁的大厂程序员谈了半年,现在纠结要不要分手,理由竟然是“他🌟生活不行”,属实把我看愣了。
网友们的回复我也瞄了下,有的说女孩现实、有的说男生可怜。但在我看来,这事本质上是 需求不匹配 ,就像你点外卖想吃麻辣烫,结果对方给你送了清汤面,再好的人你也吃不下去。 感情里这种“核心诉求”是很难靠忍的,越忍越别扭。 换个角度想,女生提出这个问题,本质上也不是挑事,而是困惑:其他都挺好,但有个关键点对不上。 亲密关系不是职场,没法靠忍耐换来价值;两个人的节奏、需求、身体沟通如果始终不对拍,早晚要爆雷。 不过话说回来,遇到问题不代表一定要立刻分手,先沟通、先尝试调整也没啥不好。感情不像写代码,不是一报错就删库重建。 【备注:文末可领最新资料】

面试题:验证IP地址

直接上题哈,就是那个很常见的算法题:验证一个字符串是不是合法 IP 地址,用 Python 写。 给你一个字符串 queryIP ,你要判断它到底是:
  • 合法 IPv4
  • 合法 IPv6
  • 还是压根就不是 IP
然后返回 "IPv4" / "IPv6" / "Neither" 这三个里的一个。这个就是 LeetCode 上那道“验证IP地址”。 看着像简单字符串判断,其实细节还挺多的,所以这题特别考“耐心”。

先聊聊 IPv4 怎么判断

IPv4 长这样: a.b.c.d ,中间 3 个点,4 段数字。 每一段有几个规则:
  1. 必须都是数字,不能有字母
  2. 长度 1~3 位
  3. 不能有前导 0(除非这个数就是 0 本身)
  4. 数值范围 0~255
举几个例子:
  • 合法的: "192.168.0.1" 、 "0.0.0.0" 、 "255.255.255.255"
  • 不合法的: "01.1.1.1" (前导 0)、 "256.1.1.1" (超过 255)、 "1..1.1" (空段)、 "1.a.1.1" (有字母)
Python 写一个判 IPv4 的函数,思路就是:
  • 先用 split('.') 切成 4 段,不是 4 段直接失败
  • 每一段挨个检查刚才那几个条件
代码大概这样:
def is_ipv4(ip: str) -> bool:
    parts = ip.split('.')
    if len(parts) != 4:
        returnFalse
    
    for part in parts:
        # 不能为空
        ifnot part:
            returnFalse
        # 必须全是数字
        ifnot part.isdigit():
            returnFalse
        # 不能有前导 0(但单个 0 允许)
        if len(part) > 1and part[0] == '0':
            returnFalse
        # 范围 0~255
        num = int(part)
        if num < 0or num > 255:
            returnFalse
    returnTrue

再看 IPv6 怎么判断

IPv6 是 16 进制的,格式类似: x:x:x:x:x:x:x:x ,一共 8 段,用冒号分隔。 每段的规则:
  1. 每段长度 1~4
  2. 只能出现字符 0-9 、 a-f 、 A-F
  3. 不能有空段(这题 不 考虑压缩写法 :: ,LeetCode 那题规定是完整形式)
例子:
  • 合法: "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
  • 也合法: "2001:db8:85a3:0:0:8A2E:370:7334" (大小写都可以,前导 0 随便)
  • 不合法: "2001:db8:85a3::8A2E:370:7334" (有 ::,本题不认)、 "2001:db8:85a3:8A2E:370:7334" (只有 7 段)、 "GGGG:..." (超出 16 进制范围)
Python 写法思路:
  • split(':') 看是不是 8 段
  • 每段长度 1~4
  • 然后逐字符判断是不是在合法字符集合里
def is_ipv6(ip: str) -> bool:
    parts = ip.split(':')
    if len(parts) != 8:
        returnFalse
    
    hex_chars = "0123456789abcdefABCDEF"
    
    for part in parts:
        # 不能为空,长度不能超过 4
        if len(part) == 0or len(part) > 4:
            returnFalse
        # 每个字符必须是合法 16 进制
        for ch in part:
            if ch notin hex_chars:
                returnFalse
    returnTrue

整合一下主函数

最终的主函数就很清爽了:
  • 如果里面有点 . ,先尝试按 IPv4 校验
  • 如果里面有冒号 : ,按 IPv6 校验
  • 两个都不通过,就返回 "Neither"
注意一个坑:不能只看有没有 . 或 : 就直接判断类型,比如 "1.1.1." 也有点,但显然不是 IPv4,所以一定要调用上面两个校验函数。 完整 Python 代码可以这样写:
class Solution:
    def validIPAddress(self, queryIP: str) -> str:
        if self.is_ipv4(queryIP):
            return"IPv4"
        if self.is_ipv6(queryIP):
            return"IPv6"
        return"Neither"

    def is_ipv4(self, ip: str) -> bool:
        parts = ip.split('.')
        if len(parts) != 4:
            returnFalse
        
        for part in parts:
            ifnot part:
                returnFalse
            ifnot part.isdigit():
                returnFalse
            # 不能有前导 0
            if len(part) > 1and part[0] == '0':
                returnFalse
            try:
                num = int(part)
            except ValueError:
                returnFalse
            if num < 0or num > 255:
                returnFalse
        returnTrue

    def is_ipv6(self, ip: str) -> bool:
        parts = ip.split(':')
        if len(parts) != 8:
            returnFalse
        
        hex_chars = "0123456789abcdefABCDEF"
        for part in parts:
            if len(part) == 0or len(part) > 4:
                returnFalse
            for ch in part:
                if ch notin hex_chars:
                    returnFalse
        returnTrue
你自己本地可以简单测几下:
s = Solution()
print(s.validIPAddress("192.168.0.1"))                     # IPv4
print(s.validIPAddress("2001:0db8:85a3:0000:0000:8a2e:0370:7334"))  # IPv6
print(s.validIPAddress("256.256.256.256"))                 # Neither
print(s.validIPAddress("1e1.4.5.6"))                       # Neither
整体来说,这题没什么高深算法,主要就是 字符串拆分 + 规则判断 ,但非常考细节。写的时候多想一句:“这个 case 会不会出 bug”,基本就能 AC。 -END -
我为大家打造了一份RPA教程, 完全免费: songshuhezi.com/rpa.html 🔥 虎哥私藏精品 🔥 虎哥作为一名老码农,整理了全网最全 《python高级架构师资料合集》 ,总量高达 650GB