Python技术迷

年终奖总共23.8w,小组就我和组长两个人,我只拿到 1.67w,组长却拿了22.13w

刚看到个贴子,说的是年终奖分配:组里一共23.8万,就两个人,结果组员拿了1.67万,组长直接拿走22万多,心态当场崩了。

Image

我觉得这事吧,很多网友第一反应都是“不公平”“太离谱”。网友回帖里有人劝他认清现实,说组长本来就拿大头;也有人替他鸣不平,觉得这是赤裸裸的剥削。怎么说呢,我比较认同一半一半。奖金这种东西,本质上就不是按“人数”分的,而是按“权力”和“责任”分的,组长能拍板、能背锅、能对上负责,拿多一点不奇怪。但差距拉到十几倍,确实容易让人寒心。

这件事其实反映了一个老问题:很多公司在分钱这块从不讲清规则,只讲结果。就像去菜市场买菜,不标价,你永远是被宰的那个。从我的角度看,与其事后吐槽,不如早点搞明白自己在团队里的“定价”,不值钱就要想办法涨价,涨不了,也得早点换摊位。

面试题:判断三角形

说三角形这个小算法题啊,说实话,挺像面试里那种“热身题”。但你真要写成代码,又有不少小坑。那我就用聊天的方式,带着你一步步把它撸明白,用 Python 写一版靠谱的。

题目一般就一句话: “给定三条边长 a、b、c,判断它们能不能构成三角形”。

稍微认真一点的话,我们其实可以拆成几个问题:

  1. 这三条边能不能构成三角形?
  2. 如果能,是等边、等腰,还是普通三角形?
  3. 是锐角、直角,还是什么钝角三角形?

很多笔试只要第一个,但你既然写文章,顺手把后面两个也搞了,代码就更完整。

脑子里过一遍初中知识:

  1. 边长必须是正数

  • 只要有一条边 ≤ 0,直接判不成立。
  • 三角形不等式(三选一就凉凉):

    • a + b > c
    • a + c > b
    • b + c > a 三个都要满足,缺一个就构不成三角形。 注意,是 大于,不是大于等于。等于的话是“退化成一条线”。
  • 分类(有了能构成以后再说):

    • 先把三条边按从小到大排序:x ≤ y ≤ z

    • 比较 x² + y² 和 z²:

    • x² + y² > z²:锐角三角形
    • x² + y² = z²:直角三角形
    • x² + y² < z²:钝角三角形
    • 三条边相等:等边
    • 只要有两条相等:等腰
    • 三条都不等:普通(不等边)
    • 边长分类:

    • 角度分类(用勾股定理的变形):

    浮点数的时候,等号那块要稍微放宽一点,不然会因为精度问题翻车。

    先来最朴素的版本,就回答一句:能,或者不能。

    defis_valid_triangle(a: float, b: float, c: float) -> bool:
    # 1. 先排除非正数
    if a <= 0or b <= 0or c <= 0:
    returnFalse

    # 2. 三角形不等式
    if a + b <= c:
    returnFalse
    if a + c <= b:
    returnFalse
    if b + c <= a:
    returnFalse

    returnTrue


    if __name__ == "__main__":
        print(is_valid_triangle(3, 4, 5))   # True
        print(is_valid_triangle(1, 2, 3))   # False(刚好一条线)
        print(is_valid_triangle(2, 2, 5))   # False

    这个版本面试里已经能用,但作为一篇文章就有点单薄。咱们稍微豪华一点。

    给调用方更多信息会更友好一点,比如返回一个 dict,把各种结果都塞进去。

    from typing import Literal, Optional, Dict
    import math

    TriangleType = Literal["equilateral", "isosceles", "scalene"]
    AngleType = Literal["acute", "right", "obtuse"]

    defclassify_triangle(a: float, b: float, c: float) -> Dict[str, Optional[str]]:
    """
        返回结构示例:
        {
            "valid": True/False,
            "side_type": "equilateral / isosceles / scalene / None",
            "angle_type": "acute / right / obtuse / None"
        }
        """

        result = {
    "valid": False,
    "side_type": None,
    "angle_type": None,
        }

    # 1. 先校验能不能构成三角形
    if a <= 0or b <= 0or c <= 0:
    return result

    if a + b <= c or a + c <= b or b + c <= a:
    return result

        result["valid"] = True

    # 2. 按边长分类
    if a == b == c:
            result["side_type"] = "equilateral"
    # 等边三角形肯定是锐角,角度类型也可以直接给
            result["angle_type"] = "acute"
    return result
    elif a == b or a == c or b == c:
            result["side_type"] = "isosceles"
    else:
            result["side_type"] = "scalene"

    # 3. 按角度分类
    # 先升序排序
        x, y, z = sorted([a, b, c])
    # 用平方避免开根号
        x2, y2, z2 = x * x, y * y, z * z

    # 浮点数比较,允许一点点误差
        eps = 1e-8
    if abs(x2 + y2 - z2) <= eps:
            result["angle_type"] = "right"
    elif x2 + y2 > z2:
            result["angle_type"] = "acute"
    else:
            result["angle_type"] = "obtuse"

    return result


    if __name__ == "__main__":
        print(classify_triangle(3, 4, 5))
    # {'valid': True, 'side_type': 'scalene', 'angle_type': 'right'}

        print(classify_triangle(2, 2, 3))
    # {'valid': True, 'side_type': 'isosceles', 'angle_type': 'acute'}

        print(classify_triangle(1, 2, 3))
    # {'valid': False, 'side_type': None, 'angle_type': None}

    这个函数扔到项目里也很自然:返回结构清晰、可拓展性也不错,后面你要再加个“周长”“面积”字段,直接往 dict 里塞就完事。

    真实业务里,数据往往不是你手写的,是接口传进来的,有几个小点可以顺手处理下:

    1. 非数字输入:比如从前端来的字符串 "3",你可以先 float() 一下,try/except 包住。
    2. 极端小数:像 1e-12 这种边长,可以根据业务需要直接当 0 处理。
    3. 单位问题:别一边用厘米一边用米,这种坑倒不是算法本身的,写文档的时候顺嘴强调一下就行。

    可以包一层简单的“安全版本”:

    defsafe_classify_triangle(a, b, c):
    try:
            a = float(a)
            b = float(b)
            c = float(c)
    except (TypeError, ValueError):
    return {
    "valid": False,
    "side_type": None,
    "angle_type": None,
    "error": "invalid input",
            }
    return classify_triangle(a, b, c)

    这样在接口里直接调用 safe_classify_triangle 就比较安心。

    -END-

    我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

    🔥虎哥私藏精品🔥

    虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB