Python Math.sqrt(-1)上没有错误

Python Math.sqrt(-1)上没有错误,python,Python,检查下面的代码,当我输入一个负数时,似乎没有错误,但是平方根不能是负数,所以我不知道为什么会发生这种情况 import math d=[] while True: z=int(raw_input()) if (z>0 and math.sqrt(z)): d.append(int(z)) 空闲时: math.sqrt(int(-1)) Traceback (most recent call last): File "<pyshell#16>", line

检查下面的代码,当我输入一个负数时,似乎没有错误,但是平方根不能是负数,所以我不知道为什么会发生这种情况

import math
d=[]
while True:
    z=int(raw_input())
    if (z>0 and math.sqrt(z)): d.append(int(z))
空闲时:

math.sqrt(int(-1))

Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    math.sqrt(int(-1))
ValueError: math domain error

没有错误,因为您正在检查以确保值为正值。和操作员短路,这意味着如果第一个条件为假,则第二个条件不被评估。您编写了if z>0和math.sqrtz。如果z小于或等于零,则不计算平方根的第二个表达式,因此您从不尝试求平方根,因此没有错误。

没有错误,因为您正在检查以确保值为正值。和操作员短路,这意味着如果第一个条件为假,则第二个条件不被评估。您编写了if z>0和math.sqrtz。如果z小于或等于零,则不会计算第二个表达式的平方根,因此您永远不会尝试求平方根,因此没有错误

    if (z>0 and math.sqrt(z)): ...
。这意味着如果z>0为false,则不计算math.sqrtz。因此没有错误

严格地说,负数的平方根是存在的,并且是存在的。像scipy.sqrt这样的函数很乐意返回一个复数平方根:

>>> import scipy as sp
>>> sp.sqrt(-1)
1j
。这意味着如果z>0为false,则不计算math.sqrtz。因此没有错误

严格地说,负数的平方根是存在的,并且是存在的。像scipy.sqrt这样的函数很乐意返回一个复数平方根:

>>> import scipy as sp
>>> sp.sqrt(-1)
1j

你是在问为什么第一个代码示例不像第二个代码?是的,相当多,我不确定为什么第一个代码中没有错误?你是在问为什么第一个代码示例不像第二个代码?是的,相当多,我不确定为什么第一个代码中没有错误尽管负数存在平方根,对于平方根,没有好的选择。让sqrt-1计算为1j是个坏主意,因为这样会失去sqrt的某些有用的数学性质,例如乘法同态和连续性。虽然负数存在平方根,但平方根没有好的选择。让sqrt-1计算为1j是个坏主意,因为这样会失去sqrt的某些有用的数学性质,例如乘法同态和连续性。