Идиома Python для возврата первого объекта или Ни одного

Ничего не видно. Страница пуста и белая.

Также известна как Белая страница смерти или Белый экран смерти . Это происходит, когда отчет об ошибках отключен, и произошла фатальная ошибка (часто синтаксическая ошибка).

Если вы включили протоколирование ошибок, вы найдете конкретное сообщение об ошибке в своем журнале ошибок. Обычно это будет в файле php_errors.log, либо в центральном месте (например, /var/log/apache2 во многих средах Linux), либо в самом каталоге самого скрипта (иногда используется в среде совместного размещения).

Иногда может быть более простым временно отображать ошибки. На белой странице отобразится сообщение об ошибке. Будьте осторожны, потому что эти ошибки видны всем, кто посещает веб-сайт.

Это легко сделать, добавив в начале скрипта следующий код PHP:

ini_set('display_errors', 1); error_reporting(~0);

Код включит отображение ошибок и установит отчетность на самый высокий уровень.

Поскольку во время выполнения ini_set() он не влияет на синтаксические ошибки синтаксиса. Эти ошибки появятся в журнале. Если вы хотите также отобразить их на выходе (например, в браузере), вам необходимо установить директиву display_startup_errors на true. Сделайте это либо в php.ini, либо в .htaccess или любом другом методе, который влияет на конфигурацию перед временем выполнения .

Вы можете использовать те же методы для установки параметра log_errors и error_log , чтобы выбрать ваше собственное место в файле журнала.

Если вы посмотрите в журнале или используете дисплей, вы получите гораздо лучшее сообщение об ошибке и строка кода, где ваш скрипт останавливается.

Похожие вопросы:

Связанные ошибки:

240
задан Elias Zamaria 19 February 2015 в 16:32
поделиться

14 ответов

Python 2.6 +

next(iter(your_list), None)

, Если your_list может быть None:

next(iter(your_list or []), None)

Пример Python 2.4

def get_first(iterable, default=None):
    if iterable:
        for item in iterable:
            return item
    return default

:

x = get_first(get_first_list())
if x:
    ...
y = get_first(get_second_list())
if y:
    ...

Другая опция состоит в том, чтобы встроить вышеупомянутую функцию:

for x in get_first_list() or []:
    # process x
    break # process at most one item
for y in get_second_list() or []:
    # process y
    break

Для предотвращения break Вы могли записать:

for x in yield_first(get_first_list()):
    x # process x
for y in yield_first(get_second_list()):
    y # process y

, Где:

def yield_first(iterable):
    for item in iterable or []:
        yield item
        return
170
ответ дан jfs 23 November 2019 в 03:17
поделиться

не идиоматический Python, эквивалентный тернарным операторам C-стиля

cond and true_expr or false_expr

т.е.

list = get_list()
return list and list[0] or None
-3
ответ дан Jimmy 23 November 2019 в 03:17
поделиться

Используя и - или прием:

a = get_list()
return a and a[0] or None
-1
ответ дан titaniumdecoy 23 November 2019 в 03:17
поделиться

Вы могли использовать Метод Извлечения . Другими словами, извлечение, которые кодируют в метод, который Вы тогда назвали бы.

я не попытался бы сжать его намного больше, лайнеры кажутся более твердыми читать, чем подробная версия. И если Вы используете Метод Извлечения, это - один лайнер;)

-1
ответ дан Stephane Grenier 23 November 2019 в 03:17
поделиться

Несколько человек предложили делать что-то вроде этого:

list = get_list()
return list and list[0] or None

, Который работает во многих случаях, но это будет только работать, если список [0] не будет равен 0, Ложь или пустая строка. Если список [0] будет 0, Ложь или пустая строка, метод неправильно не возвратит Ни один.

я создал эту ошибку в своем собственном коде слишком много раз!

-1
ответ дан Kenly 23 November 2019 в 03:17
поделиться
def head(iterable):
    try:
        return iter(iterable).next()
    except StopIteration:
        return None

print head(xrange(42, 1000)  # 42
print head([])               # None

BTW: я переделал бы Ваш общий процесс выполнения программы во что-то вроде этого:

lists = [
    ["first", "list"],
    ["second", "list"],
    ["third", "list"]
]

def do_something(element):
    if not element:
        return
    else:
        # do something
        pass

for li in lists:
    do_something(head(li))

(Предотвращение повторения каждый раз, когда возможный)

0
ответ дан ttepasse 23 November 2019 в 03:17
поделиться
try:
    return a[0]
except IndexError:
    return None
0
ответ дан limscoder 23 November 2019 в 03:17
поделиться

Из любопытства я выполнил синхронизации на двух из решений. Решение, которое использует оператор возврата для преждевременного окончания для цикла, является немного более дорогостоящим на моей машине с Python 2.5.1, я подозреваю, что это имеет отношение к установке повторяемого.

import random
import timeit

def index_first_item(some_list):
    if some_list:
        return some_list[0]


def return_first_item(some_list):
    for item in some_list:
        return item


empty_lists = []
for i in range(10000):
    empty_lists.append([])

assert empty_lists[0] is not empty_lists[1]

full_lists = []
for i in range(10000):
    full_lists.append(list([random.random() for i in range(10)]))

mixed_lists = empty_lists[:50000] + full_lists[:50000]
random.shuffle(mixed_lists)

if __name__ == '__main__':
    ENV = 'import firstitem'
    test_data = ('empty_lists', 'full_lists', 'mixed_lists')
    funcs = ('index_first_item', 'return_first_item')
    for data in test_data:
        print "%s:" % data
        for func in funcs:
            t = timeit.Timer('firstitem.%s(firstitem.%s)' % (
                func, data), ENV)
            times = t.repeat()
            avg_time = sum(times) / len(times)
            print "  %s:" % func
            for time in times:
                print "    %f seconds" % time
            print "    %f seconds avg." % avg_time

Это синхронизации, которые я получил:

empty_lists:
  index_first_item:
    0.748353 seconds
    0.741086 seconds
    0.741191 seconds
    0.743543 seconds avg.
  return_first_item:
    0.785511 seconds
    0.822178 seconds
    0.782846 seconds
    0.796845 seconds avg.
full_lists:
  index_first_item:
    0.762618 seconds
    0.788040 seconds
    0.786849 seconds
    0.779169 seconds avg.
  return_first_item:
    0.802735 seconds
    0.878706 seconds
    0.808781 seconds
    0.830074 seconds avg.
mixed_lists:
  index_first_item:
    0.791129 seconds
    0.743526 seconds
    0.744441 seconds
    0.759699 seconds avg.
  return_first_item:
    0.784801 seconds
    0.785146 seconds
    0.840193 seconds
    0.803380 seconds avg.
1
ответ дан gotgenes 23 November 2019 в 03:17
поделиться

Откровенно говоря, я не думаю, что существует лучшая идиома: Ваш является ясным и кратким - никакая потребность в чем-либо "лучше". Возможно, но это - действительно вопрос вкуса, Вы могли измениться if len(list) > 0: с if list: - пустой список будет всегда оценивать ко Лжи.

На связанной ноте, Python не Perl (никакая предназначенная игра слов!), Вы не должны получать самый прохладный возможный код.
На самом деле, худший код я видел в Python, был также очень прохладный:-), и абсолютно неудобный в сопровождении.

Между прочим, большая часть решения, которое я видел здесь, не учитывает, когда список [0] оценивает ко Лжи (например, пустая строка или нуль) - в этом случае, они все не возвращают Ни один а не корректный элемент.

2
ответ дан rob 23 November 2019 в 03:17
поделиться
for item in get_list():
    return item
2
ответ дан A. Coady 23 November 2019 в 03:17
поделиться

Решение OP почти там, существует всего несколько вещей сделать его большим количеством Pythonic.

Для одного, нет никакой потребности получить длину списка. Пустые списки в Python оценивают ко Лжи в если проверка. Просто скажите

if list:

Кроме того, это - очень Плохая Идея присвоить переменным то перекрытие с зарезервированными словами. "список" является зарезервированным словом в Python.

Так позволяют нам изменить это на

some_list = get_list()
if some_list:

действительно важный момент А, который здесь пропускает много решений, то, что все функции/методы Python не возвращают Ни один значением по умолчанию . Попробуйте следующее ниже.

def does_nothing():
    pass

foo = does_nothing()
print foo

, Если Вы не должны возвращать Ни один для завершения функции рано, является ненужным явно не возвратить Ни один. Вполне кратко просто возвратите первую запись, должен она существовать.

some_list = get_list()
if some_list:
    return list[0]

И наконец, возможно, это подразумевалось, но только быть явным (потому что явный лучше, чем неявный ), у Вас не должно быть своей функции, получают список от другой функции; просто передайте его в в качестве параметра. Так, конечный результат был бы

def get_first_item(some_list): 
    if some_list:
        return list[0]

my_list = get_list()
first_item = get_first_item(my_list)

, Как я сказал, OP был почти там, и всего несколько касаний дают ему разновидность Python, которую Вы ищете.

10
ответ дан gotgenes 23 November 2019 в 03:17
поделиться
(get_list() or [None])[0]

, Который должен работать.

BTW я не использовал переменную list, потому что это перезаписывает встроенное list() функция.

Редактирование: у Меня была немного более простая, но неверная версия здесь ранее.

67
ответ дан recursive 23 November 2019 в 03:17
поделиться

Лучший способ - это:

a = get_list()
return a[0] if a else None

Вы могли также сделать это в одной строке, но программисту намного более трудно читать:

return (get_list()[:1] or [None])[0]
200
ответ дан efotinis 23 November 2019 в 03:17
поделиться

my_list[0] if len(my_list) else None

0
ответ дан 23 November 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: