我被这个问题卡住了。我不太关心每个函数的作用,但更重要的是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
。我所说的布尔表达式分解为单个True
或False
值仍然适用,唯一的区别是短路,我认为这与你的问题无关。
示例
这里有一些更接近你的东西。想象一个场景,你想监测某个物体的温度和辐射。如果温度或辐射水平不正常,我们就会触发警报。
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!
>>>
我任意选择了标称范围,也任意选择了参数250
和50
。有了这两个硬编码的值,在调用以下两个函数后,布尔表达式将如下所示:
not False or not True
这是另一种说法:
True or False
对于or
,只有一个操作数必须是True
,才能使整个表达式求值为True
——因此,整个表达式求值结果为True
,并且我们输入if语句的主体,触发警报(因为只有其中一个值需要不是标称值才能触发警报。如果两个值都不是标称值,它也会触发警报。我们进入else
主体的唯一方法是如果两个数值都是标称值)。
根据我的理解,IF…或语句通常与条件,但对于这种情况,它只涉及两个函数无任何条件
if
(以及while
)需要一个计算为逻辑(类型bool
)值(True
或False
)的表达式,或者可以被类型转换为逻辑值(例如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")