Python技术迷

真的不懂,测试无能还让开发背锅,开发既开发又测试,那要测试干嘛,要么就把测试的钱给开发,开发开保证测试,服了

刚看到个贴子,说测试没测出来的 bug,结果开发要背锅。 这事在程序员圈子里真不稀奇,需求模糊、测试不足,最后总会归到“开发的问题”。

Image

我觉得关键在于,测试和开发是配合关系,不是上下级。开发写代码像造房子,测试就是验房师。验房没发现问题,难道房子本身就没瑕疵吗?不能这么简单粗暴。网友有的说干脆取消测试,钱全给开发,我觉得也不现实。写代码和找漏洞,本来就是两种思维方式,缺一不可。

不过话说回来,背锅这事职场上很普遍。锅往下甩、责任往上推,谁都想置身事外。但从程序员的角度看,与其抱怨,不如在流程里留好证据:写清代码注释,提交记录详细,问题定位明确。这样就算要背锅,也能有理有据。

总的来说,开发和测试要互相尊重,别互相甩锅。团队协作才是最优解,毕竟软件上线出 bug,客户可不会管是谁的错。【备注:文末可领最新资料】

面试题:表达式求值

昨天晚上十一点多,在公司楼下吹风,手机里有人问我“(1+2)*3-4/2 这个怎么自己写代码算?”我当时还困得不行,但脑子里第一反应就是——别慌,规则就那几个:数字、运算符、括号,按优先级来。就是那个…怎么说呢…我们不造火箭,能跑对常见表达式就够。

你们知道吧,正常人算式子也是两步:先把乘除、括号处理掉,再加减。代码里也一样,用“两栈法”,一个放数字,一个放运算符。遇到数字就压数栈,遇到运算符就看优先级,能算就先算,不能算再压栈。遇到 ( 就先搁着,遇到 ) 就把括号里的都结清。这个流程很朴素,但稳定。

还有个小插曲——一元负号。比如 -3+5 开头那个 - 不是减法,是给数字带符号。判断方法也不难:当前是 -,且前一个是开头、左括号或别的运算符,那它就是一元负号,我们临时把它当成把下一个数取反的小操作。

defeval_expr(s: str) -> float:
# 去空白
    s = s.replace(' ', '')
    nums, ops = [], []

defprec(op):
return2if op in ('*', '/') else1

defapply():
        b = nums.pop()
        a = nums.pop()
        op = ops.pop()
if op == '+': nums.append(a + b)
elif op == '-': nums.append(a - b)
elif op == '*': nums.append(a * b)
elif op == '/':
if b == 0: raise ZeroDivisionError('division by zero')
            nums.append(a / b)

    i, n = 0, len(s)
    prev = None# 上一个token类型: 'num','op','(',' )', None(开头)

while i < n:
        ch = s[i]
if ch.isdigit() or ch == '.':  # 读数字(含小数)
            j = i
while j < n and (s[j].isdigit() or s[j] == '.'):
                j += 1
            nums.append(float(s[i:j]))
            prev = 'num'
            i = j
continue

if ch in'+-*/()':
# 处理一元负号:当 '-' 出现在开头/左括号/其他运算符后
if ch == '-'and (prev in (None, 'op', '(')):
# 读取后面的数字或括号表达式:这里转化为 0 - x
# 更简单:直接压入0,再当作二元减法
                nums.append(0.0)
                ch = '-'

if ch == '(':
                ops.append(ch)
                prev = '('
elif ch == ')':
while ops and ops[-1] != '(':
                    apply()
ifnot ops: raise ValueError('mismatched parentheses')
                ops.pop()  # 弹出 '('
                prev = ')'
elif ch in'+-*/':
# 清算比我优先级高或相等的
while ops and ops[-1] in'+-*/'and prec(ops[-1]) >= prec(ch):
                    apply()
                ops.append(ch)
                prev = 'op'
            i += 1
continue

raise ValueError(f'bad char: {ch!r}')

while ops:
if ops[-1] == '(':
raise ValueError('mismatched parentheses')
        apply()

return nums[-1] if nums else0.0

我刚才在地铁上随手测了下,eval_expr("(1+2)*3-4/2") 会给 7.0,eval_expr("-2*(3+4.5)") 会是 -15.0,看着还行。有人问精度问题?浮点嘛,会有一点点尾巴,金融那种就别这么玩,换 Decimal。

有两个地方老出事:一是括号不配对,别忘了最后清算时检查;二是连点小数,比如 1..2,上面代码会报错,正常的。还有除零,直接抛异常,别默默给个无穷,那调试会疯。

扫描一遍字符串,每个元素最多入栈出栈一次,时间 O(n),空间栈的高度也就 O(n)。挺省心的。好了不说了,我到站了,回头谁要支持幂次 ^ 或函数 max(…),在优先级表上加一行就能接上。

-END-

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

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领