Понимание двойного входа [дубликат]

Я знаю, что это очень старый. Я новичок в c и хотел проверить свой метод, который использует getchar :

  #include & lt; stdio.h & gt;  int main () {printf ("Введите свое имя \n");  char string [10];  scanf ("% s", строка);  printf ("Hello% s \n", строка);  // GetChar ();  # un комментируя эту строку, fgets отлично работает !!  printf («Пожалуйста, введите свое имя снова \n");  fgets (строка, 10, stdin);  printf («Hello again% s», строка);  GetChar ();  }  
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 17 August 2018 в 10:27
поделиться
  • 1
    Я бы назвал первое выражение в целом выражением ; если это просто x*x, он часто может быть там, а не square(x). Это делает его еще более болезненным тогда, когда я вижу, что выражение, консервированное в лямбда, например. [x**2 for x in range(5)] против map(lambda x: x**2, range(5)). – Nick T 29 August 2017 в 20:42

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

0
ответ дан Dikei 17 August 2018 в 10:27
поделиться

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

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 17 August 2018 в 10:27
поделиться
  • 1
    Этот ответ строго лучше, чем принятый ответ, но не отмечен как таковой, потому что он пришел через 4 минуты. – user1717828 27 October 2015 в 23:03

Как это должно работать, насколько я могу судить, проверяет, пуст ли пул (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 17 August 2018 в 10:27
поделиться
  • 1
    См. Пример, который я добавил в свой ответ – John La Rooy 25 June 2011 в 04:27
Другие вопросы по тегам:

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