如果不是..然后是函数



我被这个问题卡住了。我不太关心每个函数的作用,但更重要的是IF语句如何与函数一起工作。根据我的理解,IF…或语句通常与一个条件一起工作,但对于这种情况,它只涉及两个没有任何条件的函数?

def disk_check_usage(disk):
du = shutil.disk_usage(disk)
free = du.free/du.total * 100
return free > 20 
def check_cpu_usage():
usage = psutil.cpu_percent(1)
return usage < 75 

if not disk_check_usage("/") or not check_cpu_usage():
print("ERROR!")
else: 
print("Everything is OK")

我希望它给出一个"错误!"当两个条件(免费>20和使用<75)都不是True/Satisfied时,消息。

编辑:当我运行代码时,"free"=17,这给出了"False"和Usage<75表示"真"。因此,我的IF语句的意思是"如果不是False或not True:"。这意味着什么?系统如何运行"if"或"else"语句?

任何帮助都将不胜感激!

它们是可以使用布尔值进行的一些操作。

特别地,(not a)或(not b)等同于not(a和b);两者中至少有一个必须为假

你只需要颠倒你的两个语句:如果一切正常,打印正常,否则打印错误

if disk_check_usage("/") and check_cpu_usage():
print("Everything is OK")
else: 
print("Error")

根据我的理解,IF…或语句通常与条件,但对于这种情况,它只涉及两个函数没有任何条件?

总有一个条件。你发布的代码也不例外。所谓的"条件"实际上只是特定上下文中的布尔表达式。如果整个表达式的计算结果为True,则输入If语句的正文。否则,如果它的计算结果为False,则不会。

示例

以下代码迭代字符串中的字符,并且只打印字母和大写的字符:

string = "Hell2O]WoR3(Ld"
for char in string:
if char.isalpha() and char.isupper():
print(char)

输出:

H
O
W
R
L
>>> 

如果字符串(在本例中是由单个字符组成的字符串)仅包含字母字符,则str.isalpha返回布尔值-True,否则返回False

如果字符串(在本例中仅为单个字符)仅包含大写字符,则str.isupper返回布尔值-True,否则返回False

我选择了这两个字符串方法来模拟代码中的两个函数,因为它们也返回布尔值。

让我们取第一个字符"H":

>>> char = "H"
>>> char.isalpha()
True
>>> char.isupper()
True
>>> char.isalpha() and char.isupper()
True
>>> 

您可以看到,整个布尔表达式char.isalpha() and char.isupper()的计算结果为True。为了对整个表达式进行求值,需要调用这两个函数——您可以认为它们的返回值有效地"替换"了各自的函数调用。当char"H"时,在调用函数后,表达式实际上是这样的:

True and True

其计算结果为True,因此我们输入if语句的正文。

在您的案例中,您使用了or而不是and。我所说的布尔表达式分解为单个TrueFalse值仍然适用,唯一的区别是短路,我认为这与你的问题无关。

示例

这里有一些更接近你的东西。想象一个场景,你想监测某个物体的温度和辐射。如果温度或辐射水平不正常,我们就会触发警报。

def is_temperature_nominal(temp):
return 70 <= temp <= 100
def is_radiation_nominal(rad):
return rad < 200
if not is_temperature_nominal(250) or not is_radiation_nominal(50):
print("Alarm triggered!")
else:
print("Everything is good.")

输出:

Alarm triggered!
>>> 

我任意选择了标称范围,也任意选择了参数25050。有了这两个硬编码的值,在调用以下两个函数后,布尔表达式将如下所示:

not False or not True

这是另一种说法:

True or False

对于or,只有一个操作数必须是True,才能使整个表达式求值为True——因此,整个表达式求值结果为True,并且我们输入if语句的主体,触发警报(因为只有其中一个值需要不是标称值才能触发警报。如果两个值都不是标称值,它也会触发警报。我们进入else主体的唯一方法是如果两个数值都是标称值)。

根据我的理解,IF…或语句通常与条件,但对于这种情况,它只涉及两个函数无任何条件

if(以及while)需要一个计算为逻辑(类型bool)值(TrueFalse)的表达式,或者可以被类型转换为逻辑值(例如None被类型转换成False)。

在您的情况下,条件(即比较)是在函数内部完成的(请参阅return语句),因此函数已经返回逻辑值。

当调用一个方法时,它会被执行并返回一个值,该值可以以不同的方式使用:直接或存储在变量中,此代码与以下代码完全相同,但只是不保存在变量中并在条件中内联方法

disck_check = disk_check_usage("/") # True or False
cpu_check = check_cpu_usage() # True or False
if not disk_check or not cpu_check: # Boolean conbination
print("ERROR!")
else: 
print("Everything is OK")

您必须使用'and'运算符,而不是您使用的'or'。

def disk_check_usage(disk):
du = shutil.disk_usage(disk)
free = du.free/du.total * 100
return free > 20 
def check_cpu_usage():
usage = psutil.cpu_percent(1)
return usage < 75 

if not disk_check_usage("/") and not check_cpu_usage():
print("ERROR!")
else: 
print("Everything is OK")

最新更新