python: как понять это для цикла в одной строке [duplicate]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
53
задан Greg Flynn 25 June 2011 в 02:58
поделиться

4 ответа

Текущие ответы хороши, но не говорите о том, как они представляют собой синтаксический сахар для некоторого шаблона, к которому мы так привыкли.

Давайте начнем с примера, скажем, у нас есть 10 чисел, и мы хотим подмножество тех, которые больше, чем, скажем, 5.

>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]

. Для вышеупомянутой задачи нижеприведенные подходы полностью идентичны друг другу и идут от большинства дословных до кратких, читаемых и pythonic :

Подход 1

result = []
for index in range(len(numbers)):
    if numbers[index] > 5:
        result.append(numbers[index])
print result  #Prints [12, 34, 67, 37, 9, 81]

Подход 2 (Слегка чистые, для включения)

result = []
for number in numbers:
    if number > 5:
        result.append(number)
print result  #Prints [12, 34, 67, 37, 9, 81]

Подход 3 (ввод списка)

result = [number for number in numbers if number > 5]

или в более общем смысле:

[function(number) for number in numbers if condition(number)]

где:

  • function(x) принимает x и преобразует его во что-то полезное (например, x*x)
  • , если condition(x) возвращает любое значение False-y (False, None, empty string, empty list , и т. д.), то текущая итерация будет пропущена (подумайте continue). Если функция возвращает значение, отличное от False-y, то текущее значение переходит к окончательному результирующему массиву (и проходит этап преобразования выше).

Чтобы понять синтаксис в слегка по-разному посмотрите в разделе «Бонус» ниже.

Для получения дополнительной информации следуйте руководству, которое все другие ответы связали: List Consrehension


Бонус

(Немного непитонический, но поставив его здесь для полноты)

Пример выше может быть записан как:

result = filter(lambda x: x > 5, numbers)

Общее выражение выше, может быть записано как:

result = map(function, filter(condition, numbers)) #result is a list in Py2
41
ответ дан UltraInstinct 25 August 2018 в 21:18
поделиться

Это возвращает список, содержащий все элементы в баре, которые имеют обитателей> 1.

0
ответ дан Dikei 25 August 2018 в 21:18
поделиться

Это понимание списка

foo будет отфильтрованным списком bar, содержащим объекты с атрибутом, обитающим в нем> 1

bar может быть list, set, dict или любым другим итерируемым

. Вот пример, чтобы прояснить

>>> class Bar(object):
...   def __init__(self, occupants):
...     self.occupants = occupants
... 
>>> bar=[Bar(0), Bar(1), Bar(2), Bar(3)]
>>> foo = [x for x in bar if x.occupants > 1]
>>> foo
[<__main__.Bar object at 0xb748516c>, <__main__.Bar object at 0xb748518c>]

. Таким образом, foo имеет 2 Bar объектов, но как мы можем проверить, какие из них они есть? Давайте добавим метод __repr__ к Bar, чтобы он был более информативным

>>> Bar.__repr__=lambda self:"Bar(occupants={0})".format(self.occupants)
>>> foo
[Bar(occupants=2), Bar(occupants=3)]
24
ответ дан John La Rooy 25 August 2018 в 21:18
поделиться

Как это должно работать, насколько я могу судить, проверяет, пуст ли пул (0) списка или состоит из singleton (1) через x.occupants, где x - определенный элемент в пределах и может иметь характеристику обитателей. Таким образом, foo получает вызов, перемещается по списку и затем возвращает все элементы, которые передают условие проверки, которое является x.occant.

На языке, подобном Java, вы должны создать класс с именем «x», x 'затем присваиваются массиву или тому подобное. X будет иметь поле, называемое «оккупантами», и каждый индекс будет проверяться с помощью метода x.occupants, который возвращает номер, присвоенный оккупанту. Если этот метод возвращается больше 1 (мы предполагаем, что int здесь, поскольку частичный пассажир был бы нечетным). Метод foo (вызывается в массиве или аналогичном в вопросе.) Затем возвращал массив или аналогичный, как определено в методе foo для этого контейнера или того, что у вас есть. Элементы возвращаемого массива будут объектами «x» в первом массиве thingie, которые соответствуют критериям «Больше чем 1».

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

0
ответ дан World Engineer 25 August 2018 в 21:18
поделиться
Другие вопросы по тегам:

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