Если нет ... следуют функции - PullRequest
0 голосов
/ 22 марта 2020

Я застрял с этим вопросом. Я не слишком обеспокоен тем, что делает каждая функция, но более важно, как оператор 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) не соответствуют действительности / удовлетворены. </p>

Редактировать: Когда я запускаю код, «free» = 17, что дает «False» и Usage <75, что дает «True». Таким образом, мое утверждение IF будет означать «Если не Ложь или не Истина». Что это значит и как система должна выполнять оператор «если» или «еще»? </p>

Любая помощь будет оценена!

Ответы [ 5 ]

1 голос
/ 22 марта 2020

Это некоторые операции, которые вы можете выполнять с логическими значениями.

В частности, (не a) или (не b) эквивалентно not (a и b); по крайней мере, один из двух должен быть False

Вы просто должны инвертировать свои утверждения о буксировке: если все в порядке, напечатайте ok, иначе напечатайте ошибку

if disk_check_usage("/") and check_cpu_usage():
    print("Everything is OK")
else: 
    print("Error")
0 голосов
/ 22 марта 2020

Насколько я понимаю, оператор IF .... или операторы обычно работают с условием, но для этого сценария используются только две функции без каких-либо условий?

Всегда есть условие , Код, который вы разместили, не является исключением. То, что вы называете «условием», на самом деле является просто логическим выражением в определенном c контексте. Если все выражение имеет значение True, вы вводите тело оператора if. В противном случае, если он оценивается как False, вы этого не сделаете.

Пример

Следующий код выполняет итерации по символам в строке и печатает только те символы, которые и в алфавитном порядке c, и в верхнем регистре:

string = "Hell2O]WoR3(Ld"

for char in string:
    if char.isalpha() and char.isupper():
        print(char)

Вывод:

H
O
W
R
L
>>> 

str.isalpha возвращает логическое значение - True, если строка (в данном случае строка, состоящая из один символ) содержит только буквы c символов, 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, если оба значения являются номинальными).

0 голосов
/ 22 марта 2020

Насколько я понимаю, оператор IF .... или операторы обычно работают с условием, но для этого сценария используются только две функции без каких-либо условий

if (как Кроме того, while) необходимо выражение, которое оценивается в логическое (тип bool) значение (либо True или False), либо может быть приведено к типу логического значения (например, None является приведением типа к False).

В вашем случае условия (а именно сравнения) выполняются внутри ваших функций (см. Операторы return), так что функции уже возвращают логические значения.

0 голосов
/ 22 марта 2020

Вы должны использовать операторы 'и' вместо используемых вами 'или'.

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")
0 голосов
/ 22 марта 2020

При вызове метода он исполняется и возвращает значение, которое можно использовать по-разному: напрямую или в переменной, этот код точно такой же, как и следующий, но просто не сохраняет в переменных и встроенных методов в состоянии

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...