Использование 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
Пояснения к спискам обеспечивают краткий способ создания списков. Обычные приложения - создавать новые списки, в которых каждый элемент является результатом некоторых операций, применяемых к каждому члену другой последовательности или итерируемым, или для создания подпоследовательности тех элементов, которые удовлетворяют определенному условию.
blockquote>
О вашем вопросе, понимание списка делает то же самое, что и следующий «простой» код 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 .
Есть список, словарь и набор понятий, но нет кортежей (хотя изучите «генераторные выражения»).
Они обращаются к проблеме, когда традиционные циклы в Python являются операторами (не возвращаются ничего), а не выражения, которые возвращают значение.
Они не являются решением каждой проблемы и могут быть переписаны как традиционные циклы. Они становятся неудобными, когда состояние должно поддерживаться и amp; обновлено между итерациями.
Они обычно состоят из:
[<output expr> <loop expr <input expr>> <optional predicate expr>]
, но могут быть перекручены множеством интересных и причудливых способов.
Они могут быть аналогичны традиционные map()
и filter()
операции, которые все еще существуют в Python и продолжают использоваться.
Когда все сделано хорошо, они имеют высокий коэффициент удовлетворения.
When done well, they have a high satisfaction quotient.
– bro-grammer
9 January 2018 в 11:37
x if cond else y
действительно не имеет ничего общего с пониманием списка - любое допустимое выражение может использоваться внутри сжатия списка - тройное выражение является одним из многих выражений python. – AChampion 17 January 2016 в 08:11[i for i in x if i else y]
, когда я изучал перечни, и это не работает. После некоторых исследований я понимаю, что вместо этого я должен использовать[i if i else y for i in x]
. Поэтому я думаю, что если я упоминаю об этом здесь, другие могут избежать вопроса, который у меня был раньше. – Kevin Guan 17 January 2016 в 08:14list
:list(<map object>)
в Python 3.x – styvane 21 January 2016 в 20:54