Как сделать это Ruby if-with-and в Python и не получить индекс списка вне диапазона - PullRequest
2 голосов
/ 16 октября 2019

В Ruby я могу сделать что-то вроде:

irb(main):001:0> x = []
=> []
irb(main):003:0> puts "hi ho" if x.count > 0 and x[0]
=> nil

Сначала Ruby оценивает x.count >0 как ложное и не удосуживается оценить x[0].

В Python я могу дляПример файла с:

x = []
if x.count > 0 and x[0]:
  print "hi ho" 

Когда я запускаю:

[onknows:/tmp] $ python test-if.py 
Traceback (most recent call last):
  File "test-if.py", line 2, in <module>
    if x.count > 0 and x[0]:
IndexError: list index out of range
[onknows:/tmp] 1

Таким образом, Python также оценивает x[0], хотя нет причин для его оценки. Есть ли способ использовать только один, если и не прибегать к вложенным, если в Python? Я не хочу делать что-то вроде:

if x.count > 0:
  if x[0]:
     print "hi ho" 

Ответы [ 4 ]

3 голосов
/ 16 октября 2019

Похоже, вам нужно len.

x = []
if len(x) > 0 and x[0]:
    print("hi ho")
2 голосов
/ 16 октября 2019

Таким образом, Python также оценивает x [0], хотя нет причин для его оценки.

Я предполагаю, что это сработает для вас, в его самой простой форме:

if len(x) > 0: 
    print("Hi Ho!")

Это оценивает длину X и (если больше 0) отвечает True,

Однако, если переменная "x" не существует, произойдет ошибка. Оценка того, существует ли вообще «x» и содержит ли он хотя бы один элемент, - это (я полагаю) то, чего вы пытаетесь достичь с помощью ...

if x[0]:
    print("Hi Ho!")

Python оценивает True, еслипеременная существует и содержит любое значение. Он оценивает False, если переменная существует , но не содержит значения . Python выдаст ошибку, если переменная не существует.

Итак, это может быть то, что вы ищете ...

try:
    if len(x) > 0:
        print("Hi Ho!")
    else:
        print("Variable does not seem to contain a value!")
except (NameError, AttributeError, ValueError): 
    print("Variable does not exist!")

РЕДАКТИРОВАТЬ:

Обратите внимание, что если xсуществует в виде списка, но не содержит значений, len(x) будет иметь значение 0. Однако, если вы попытаетесь оценить x[0], вы все равно получите ошибку, но это ошибка IndexError, а не ошибка «Переменная не существует».

0 голосов
/ 16 октября 2019

Python выполняет ленивое вычисление для логического выражения при использовании and или or.

Из документов:

Выражения x и y сначала оценивают x;если x равен false, возвращается его значение;в противном случае вычисляется y и возвращается результирующее значение.

Выражение x или y сначала оценивает x;если x истинно, возвращается его значение;в противном случае вычисляется y и возвращается результирующее значение.

Метод списка Python count () возвращает количество повторений obj в списке.

Вы должны использовать len(x)чтобы получить длину списка.

x = []
if len(x) > 0 and x[0]:
  print "hi ho" 
0 голосов
/ 16 октября 2019

Python поддерживает короткое замыкание на and, поэтому, если первый аргумент равен False, второй не оценивается.

x.count > 0 всегда имеет значение:

In [12]: [].count > 0
Out[12]: True

Вы должны заменить его на len(x), и он будет работать правильно:

if len(x) > 0 and x[0]:
  # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...