Для & hellip; в цикле на языке Python [дубликат]

Использование API Win32:

require 'Win32API'

# Set up some Win32 constants
GEOCLASS_NATION  = 16
GEO_ISO2         = 4
GEO_FRIENDLYNAME = 8

# Set up some API calls
GetUserGeoID = Win32API.new('kernel32', 'GetUserGeoID', ['L'], 'L')
GetGeoInfo   = Win32API.new('kernel32', 'GetGeoInfoA', ['L', 'L', 'P', 'L', 'L'], 'L')

# Get user's GEOID
geoid = GetUserGeoID.call(GEOCLASS_NATION)
=> 77

# Get ISO name
buffer = " " * 100
GetGeoInfo.call(geoid, GEO_ISO2, buffer, buffer.length, 0)
geo_iso = buffer.strip
=> "FI"

# Get friendly name
buffer = " " * 100
GetGeoInfo.call(geoid, GEO_FRIENDLYNAME, buffer, buffer.length, 0)
geo_name = buffer.strip
=> "Finland"

Документация для GetUserGeoID: http://msdn.microsoft.com/en-us/library/dd318138.aspx

Документация для GetGeoInfo: https://docs.microsoft.com/en-us/windows/desktop/api/winnls/nf-winnls-getgeoinfoa

Чтобы преобразовать GEOID в имя местоположения, вы также можете использовать эту таблицу: http://msdn.microsoft.com/en-us/library/dd374073.aspx

35
задан martineau 24 December 2016 в 19:27
поделиться

2 ответа

Из документации:

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


О вашем вопросе, понимание списка делает то же самое, что и следующий «простой» код Python:

>>> l = [] 
>>> for x in range(10):
...     l.append(x**2)
>>> l
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Как вы пишете его в одной строке? Хм ... мы можем ... возможно ... использовать map() с lambda :

>>> list(map(lambda x: x**2, range(10)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Но это не проще и проще просто использовать понимание списка?

>>> [x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

В принципе, мы можем делать все с помощью x. Не только x**2. Например, запустите метод x:

>>> [x.strip() for x in ('foo\n', 'bar\n', 'baz\n')]
['foo', 'bar', 'baz']

Или используйте x в качестве аргумента другой функции:

>>> [int(x) for x in ('1', '2', '3')]
[1, 2, 3]

Мы также можем использовать x в качестве ключа объекта dict. Давайте посмотрим:

>>> d = {'foo': '10', 'bar': '20', 'baz': '30'}
>>> [d[x] for x in ['foo', 'baz']]
['10', '30']

Как насчет комбинации?

>>> d = {'foo': '10', 'bar': '20', 'baz': '30'}
>>> [int(d[x].rstrip('0')) for x in ['foo', 'baz']]
[1, 3]

И так далее.


Вы также можете использовать if или if...else в понимании списка. Например, вам нужны только нечетные числа в range(10). Вы можете сделать:

>>> l = []
>>> for x in range(10):
...     if x%2:
...         l.append(x)
>>> l
[1, 3, 5, 7, 9]

Ах, это слишком сложно. Что касается следующей версии?

>>> [x for x in range(10) if x%2]
[1, 3, 5, 7, 9]

Чтобы использовать тернарное выражение if...else, вам нужно поместить if ... else ... после x, а не после range(10):

>>> [i if i%2 != 0 else None for i in range(10)]
[None, 1, None, 3, None, 5, None, 7, None, 9]

Вы слышали о понимании вложенного списка ? Вы можете поместить два или более for s в одно понимание списка . Например:

>>> [i for x in [[1, 2, 3], [4, 5, 6]] for i in x]
[1, 2, 3, 4, 5, 6]

>>> [j for x in [[[1, 2], [3]], [[4, 5], [6]]] for i in x for j in i]
[1, 2, 3, 4, 5, 6]

Давайте поговорим о первой части, for x in [[1, 2, 3], [4, 5, 6]], которая дает [1, 2, 3] и [4, 5, 6]. Затем for i in x дает 1, 2, 3 и 4, 5, 6.

Предупреждение: вам всегда нужно поставить for x in [[1, 2, 3], [4, 5, 6]] до for i in x:

>>> [j for j in x for x in [[1, 2, 3], [4, 5, 6]]]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'x' is not defined

У нас также есть набор понятий , dict и генераторные выражения .

Установленные опознавания и понимание списка в основном одинаковы, но первый возвращает набор вместо a list :

>>> {x for x in [1, 1, 2, 3, 3, 1]}
{1, 2, 3}

Это то же самое, что:

>>> set([i for i in [1, 1, 2, 3, 3, 1]])
{1, 2, 3}

Понимание dict выглядит определение набора, но вместо {i for i in ...} оно использует {key: value for key, value in ...} или {i: i for i in ...}.

Например:

>>> {i: i**2 for i in range(5)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

И это равно:

>>> d = {}
>>> for i in range(5):
...     d[i] = i**2
>>> d
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Предоставляет ли (i for i in range(5)) кортеж ? Нет !, это выражение генератора . Который возвращает генератор:

>>> (i for i in range(5))
<generator object <genexpr> at 0x7f52703fbca8>

Это то же самое, что:

>>> def gen():
...     for i in range(5):
...         yield i
>>> gen()
<generator object gen at 0x7f5270380db0>

И вы можете использовать его как генератор:

>>> gen = (i for i in range(5))
>>> next(gen)
0
>>> next(gen)
1
>>> list(gen)
[2, 3, 4]
>>> next(gen)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
StopIteration

Примечание : Если вы используете понимание списка внутри функции , вам не понадобится [], если эта функция может зацикливаться на генераторе. Например, sum() :

>>> sum(i**2 for i in range(5))
30

Связанный (об генераторах): Понимание генераторов в Python .

69
ответ дан Community 16 August 2018 в 05:26
поделиться
  • 1
    Тернарное выражение x if cond else y действительно не имеет ничего общего с пониманием списка - любое допустимое выражение может использоваться внутри сжатия списка - тройное выражение является одним из многих выражений python. – AChampion 17 January 2016 в 08:11
  • 2
    @AChampion: Да, я упомянул об этом в своем ответе, потому что пытался [i for i in x if i else y], когда я изучал перечни, и это не работает. После некоторых исследований я понимаю, что вместо этого я должен использовать [i if i else y for i in x]. Поэтому я думаю, что если я упоминаю об этом здесь, другие могут избежать вопроса, который у меня был раньше. – Kevin Guan 17 January 2016 в 08:14
  • 3
    Стоит упомянуть, что вам нужно использовать конструктор list: list(<map object>) в Python 3.x – styvane 21 January 2016 в 20:54
  • 4
    это плохая практика, чтобы поставить 2 или более для понимания в списке – tinySandy 2 February 2016 в 03:19
  • 5
    он становится менее читаемым – tinySandy 2 February 2016 в 05:20

Есть список, словарь и набор понятий, но нет кортежей (хотя изучите «генераторные выражения»).

Они обращаются к проблеме, когда традиционные циклы в Python являются операторами (не возвращаются ничего), а не выражения, которые возвращают значение.

Они не являются решением каждой проблемы и могут быть переписаны как традиционные циклы. Они становятся неудобными, когда состояние должно поддерживаться и amp; обновлено между итерациями.

Они обычно состоят из:

[<output expr> <loop expr <input expr>> <optional predicate expr>]

, но могут быть перекручены множеством интересных и причудливых способов.

Они могут быть аналогичны традиционные map() и filter() операции, которые все еще существуют в Python и продолжают использоваться.

Когда все сделано хорошо, они имеют высокий коэффициент удовлетворения.

7
ответ дан Kevin Guan 16 August 2018 в 05:26
поделиться
  • 1
    Это сделало мой день: When done well, they have a high satisfaction quotient. – bro-grammer 9 January 2018 в 11:37
Другие вопросы по тегам:

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