Скрытые возможности Python [закрыто]

Каковы менее известные, но полезные функции языка программирования Python?

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

Быстрые ссылки на ответы:

1420
задан 24.05.2017, 01:34

93 ответа

>>> x=[1,1,2,'a','a',3]
>>> y = [ _x for _x in x if not _x in locals()['_[1]'] ]
>>> y
[1, 2, 'a', 3]


"местные жители () [' _ [1]']" "секретное название" создаваемого списка. Очень полезный, когда состояние списка, создаваемого влияние последующие решения сборки.

1
ответ дан 28.07.2019, 18:55
  • 1
    Ew. Этот ' name' из результата список зависит от слишком многих факторов для реального рассмотрения его больше, чем злоупотребление определенной реализацией (и характерный для конкретной версии, для начальной загрузки.) К тому же it' s O (n^2) алгоритм. Фу. – Thomas Wouters 20.09.2008, 03:31
  • 2
    Ну, по крайней мере, никто не будет требовать этого isn' t скрытый. – I. J. Kennedy 13.10.2010, 12:35
  • 3
    Дубликат предыдущего ответа – e-satis 25.12.2011, 04:38
  • 4
    I' ll пробуют более новой версией – wich 07.01.2020, 15:37

spam модуль в стандартном Python

Это используется для тестирования.

я выбрал его от ctypes учебное руководство . Попробуйте его сами:

>>> import __hello__
Hello world...
>>> type(__hello__)
<type 'module'>
>>> from __phello__ import spam
Hello world...
Hello world...
>>> type(spam)
<type 'module'>
>>> help(spam)
Help on module __phello__.spam in __phello__:

NAME
    __phello__.spam

FILE
    c:\python26\<frozen>
2
ответ дан 28.07.2019, 18:55

элементы Словаря Доступа как атрибуты (свойства). таким образом, если a1=AttrDict () имеет ключевое 'имя'-> вместо a1 ['имя'] мы можем легко получить доступ к атрибуту имени использования a1-> <час> a1.name

class AttrDict(dict):

    def __getattr__(self, name):
        if name in self:
            return self[name]
        raise AttributeError('%s not found' % name)

    def __setattr__(self, name, value):
        self[name] = value

    def __delattr__(self, name):
        del self[name]

person = AttrDict({'name': 'John Doe', 'age': 66})
print person['name']
print person.name

person.name = 'Frodo G'
print person.name

del person.age

print person
4
ответ дан 28.07.2019, 18:55
  • 1
    никакой заголовок или объяснение? где скрытая функция здесь? – Sanjay Manohar 08.09.2010, 18:15

Все динамично

"Нет никакого времени компиляции". Все в Python - время выполнения. Модуль 'определяется' путем выполнения источника модуля, от начала до конца, точно так же, как сценарий, и получающееся пространство имен является пространством атрибута модуля. Аналогично, класс 'определяется' путем выполнения тела класса, от начала до конца, и получающееся пространство имен является пространством атрибута класса. Тело класса может содержать абсолютно произвольный код - включая операторов импорта, циклы и другие операторы класса. При создании класса функционируйте или даже модуль 'динамично', относительно как иногда просят, не твердо; на самом деле невозможно избежать, так как все 'динамично'.

3
ответ дан 28.07.2019, 18:55
  • 1
    Это дает Python замечательную перезагрузку (). – sli 30.12.2008, 21:52
  • 2
    @Michael: Я не сказал, что это было быть всем концом весь список, ни действительно конкретно упоминало что-либо о XSRF. На самом деле каждый рекомендовать в этом списке вплоть до сих пор имеет хорошую информацию и предостережения. – prodigitalson 16.02.2010, 21:50
  • 3
    Все динамично... Кроме классов и модулей, реализованных в C, которые не являются столь же динамичными как все остальное. (попробуйте что-то как dict.x = 3, и Python won' t позволяют Вам), – Denilson Sá Maia 21.08.2010, 10:56
  • 4
    Да, модули и типы, определенные в C, определяются во время компиляции, но they' ре все еще создало во времени выполнения. Кроме того, dict.x = 3 не имеет никакого отношения к вещам, являющимся динамичным, но с dict тип, не позволяющий атрибуты быть присвоенными. Можно сделать собственные классы, в Python, это don' t позволяют это. Можно сделать собственный тип в C, который действительно позволяет его. It' s не связанный. – Thomas Wouters 10.09.2010, 11:33
  • 5
    Как это - скрытая функция? – Alexandru 24.01.2011, 05:42
  • 6
    Я часто слышу это, но это isn' t довольно верный. При импорте модуля все это сразу компилируется. Если будут какие-либо синтаксические ошибки где-нибудь в модуле, ничто не выполнится. Большая разница между Python и более традиционно скомпилированными языками - то, что класс и функциональные определения являются операторами, которые выполняются во времени выполнения (и следовательно может быть пропущен через если операторы и исключения, вложенные произвольно, и т.д.). – ncoghlan 01.02.2011, 19:22

Моделирование третичного использования оператора и и или.

и и или операторы в Python возвращают сами объекты, а не булевские переменные. Таким образом:

In [18]: a = True

In [19]: a and 3 or 4
Out[19]: 3

In [20]: a = False

In [21]: a and 3 or 4
Out[21]: 4

Однако Py 2.5, кажется, добавил явный третичный оператор

    In [22]: a = 5 if True else '6'

    In [23]: a
    Out[23]: 5

ну, это работает, если Вы уверены, что Ваш истинный пункт не оценивает ко Лжи. пример:

>>> def foo(): 
...     print "foo"
...     return 0
...
>>> def bar(): 
...     print "bar"
...     return 1
...
>>> 1 and foo() or bar()
foo
bar
1

Для разбираний в нем Вы имеете только к немного больше:

>>> (1 and [foo()] or [bar()])[0]
foo
0

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

>>> foo() if True or bar()
foo
0
3
ответ дан 28.07.2019, 18:55
  • 1
    Осторожный с этим: > > > a и " " или ": (" you' ll всегда возвращают поверхность frowny, неважно, если TRUE или FALSE – Marius Gedminas 19.06.2009, 09:00
  • 2
    Marius, Только, если ложь. Иначе U' d хотят ": (" как " " ложь. – Lakshman Prasad 19.06.2009, 17:55
  • 3
    Ваша модель хранения пароля является вызывающе неправильной. Шифр действительно стар, используйте twofish. Блочные шифры shouldn' t использоваться для паролей это - нарушение CWE-257 cwe.mitre.org/data/definitions/257.html. В настоящее время единственная сертифицированная NIST функция дайджеста сообщения для паролей является sha2 семьей. Sha256 является хорошим выбором. – rook 16.02.2010, 22:04
  • 4
    (falseValue, trueValue)[cond] инструмент для очистки (IMO) способ моделировать тернарный оператор. – Ponkadoodle 16.05.2010, 21:09
  • 5
    это - просто плохой стиль. – bukzor 24.06.2010, 15:43

Объекты в булевом контексте

Пустые кортежи, списки, dicts, строки и много других объектов эквивалентны Лжи в булевом контексте (и непустой эквивалентны Истинному).

empty_tuple = ()
empty_list = []
empty_dict = {}
empty_string = ''
empty_set = set()
if empty_tuple or empty_list or empty_dict or empty_string or empty_set:
  print 'Never happens!'

Это позволяет логическим операциям возвращать один из, его - операнды вместо Истинного/ложного, который полезен в некоторых ситуациях:

s = t or "Default value" # s will be assigned "Default value"
                         # if t is false/empty/none
3
ответ дан 28.07.2019, 18:55
  • 1
    на самом деле этому препятствуют, необходимо использовать " new" s = t, если t еще " значение по умолчанию value" – Tom 28.08.2009, 00:52
  • 2
    XSRF не имеет никакого отношения к выходу. Если Вы делаете все в этом списке you' ll может все еще быть взломан к слезам. – rook 16.02.2010, 21:49

Сокрытие закрытых методов и данных (инкапсуляция)

существует общая идиома в Python обозначения методов и других участников класса, которые не предназначаются, чтобы быть частью внешнего API класса путем давания им имен, которые запускаются с подчеркиваний. Это удобно и работает очень хорошо на практике, но это производит ложное впечатление, что Python не поддерживает истинную инкапсуляцию частного кода и/или данных. На самом деле Python автоматически дает Вам лексические закрытия , которые делают очень легким инкапсулировать данные намного большим количеством пуленепробиваемого способа, когда ситуация действительно гарантирует его. Вот изобретенный пример класса, который использует эту технику:

class MyClass(object):
  def __init__(self):

    privateData = {}

    self.publicData = 123

    def privateMethod(k):
      print privateData[k] + self.publicData

    def privilegedMethod():
      privateData['foo'] = "hello "
      privateMethod('foo')

    self.privilegedMethod = privilegedMethod

  def publicMethod(self):
    print self.publicData

И вот изобретенный пример его использования:

>>> obj = MyClass()
>>> obj.publicMethod()
123
>>> obj.publicData = 'World'
>>> obj.publicMethod()
World
>>> obj.privilegedMethod()
hello World
>>> obj.privateMethod()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute 'privateMethod'
>>> obj.privateData
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute 'privateData'

ключ - то, что privateMethod и privateData не действительно атрибуты obj вообще, таким образом, к ним нельзя получить доступ снаружи, и при этом они не обнаруживаются в dir() или подобный. Они - локальные переменные в конструкторе, абсолютно недоступном за пределами __init__. Однако из-за волшебства закрытий, они действительно на переменные экземпляра с тем же временем жизни как объект, с которым они связаны, даже при том, что нет никакого способа получить доступ к ним снаружи кроме (в этом примере) путем вызова privilegedMethod. Часто этот вид очень строгой инкапсуляции является излишеством, но иногда это действительно может быть очень удобно для хранения API или пространства имен, писклявого чистый.

В Python 2.x, единственный способ иметь изменяемое частное состояние с изменяемым объектом (таким как dict в этом примере). Многие люди отметили относительно того, насколько раздражающий это может быть. Python 3.x удалит это ограничение путем представления nonlocal ключевое слово, описанное в PEP 3104.

3
ответ дан 28.07.2019, 18:55
  • 1
    это - почти никогда хорошая идея. – Christian Oudard 03.01.2009, 06:38
  • 2
    " They' локальные переменные ре в конструкторе, абсолютно недоступном за пределами init." Не верный: > > > [c.cell_contents для c в obj.privilegedMethod.func_closure] - > [{' foo': ' привет '}, < функционируйте privateMethod в 0x65530>] – Miles 22.06.2009, 15:34
  • 3
    Очень хороший. Можно прочитать руководство по обеспечению безопасности на английском, французском, Румыния и сербском языке. – Luc M 22.07.2009, 16:17
  • 4
    Правильный способ предотвратить доступ атрибута был бы, имеют __getattribute__ или __getattr__ сигнальная метка и направляют принятые вызовы соответственно. Снова, тайна и Python не являются хорошей идеей. – Jeffrey Jose 28.05.2010, 09:35

Если Вы используете exec в функции, переменные правила поиска изменяются решительно. Закрытия больше не возможны, но Python позволяет произвольные идентификаторы в функции. Это дает Вам "модифицируемых местных жителей ()" и может привыкнуть к идентификаторам звездообразного импорта. На оборотной стороне это делает каждый поиск медленнее, потому что переменные заканчиваются в dict, а не слотах в кадре:

>>> def f():
...  exec "a = 42"
...  return a
... 
>>> def g():
...  a = 42
...  return a
... 
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_CONST               1 ('a = 42')
              3 LOAD_CONST               0 (None)
              6 DUP_TOP             
              7 EXEC_STMT           

  3           8 LOAD_NAME                0 (a)
             11 RETURN_VALUE        
>>> dis.dis(g)
  2           0 LOAD_CONST               1 (42)
              3 STORE_FAST               0 (a)

  3           6 LOAD_FAST                0 (a)
              9 RETURN_VALUE        
2
ответ дан 28.07.2019, 18:55
  • 1
    Только придраться к мелочам: то единственное относится к пустому должностному лицу. Если Вы определяете пространство имен для него для использования, например, " d = {}; должностное лицо " a=42" в d" этот won' t происходят. – Brian 22.09.2008, 12:48
  • 2
    Это работает! Сумасшедший, что это было так много работы, выясняющей, как просто прочитать паршивый файл конфигурации из указанного точного тракта, но спасибо. – neminem 13.10.2019, 14:40

Функциональная поддержка.

Генераторы и выражения генератора, конкретно.

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

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

3
ответ дан 28.07.2019, 18:55
  • 1
    Как Вы используете получающееся config.AppSettings["somekey"] (или config.AppSettings.Settings[]) без ошибок права доступа? – Brent Faust 13.10.2019, 14:39

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

>>> dict([ ('foo','bar'),('a',1),('b',2) ])
{'a': 1, 'b': 2, 'foo': 'bar'}

>>> names = ['Bob', 'Marie', 'Alice']
>>> ages = [23, 27, 36]
>>> dict(zip(names, ages))
{'Alice': 36, 'Bob': 23, 'Marie': 27}
12
ответ дан 14.09.2019, 19:22
  • 1
    self.data = {} _i = 0 для ключей сам. VDESC.split (): self.data [ключи] = _data [_i] _i + = 1 я заменил свой код этой остротой:) self.data = dict (zip (сам. VDESC.split (), _data)) спасибо за удобную подсказку. – Gökhan Sever 29.09.2009, 16:32
  • 2
    Также помогает в Python2.x, где нет никакого dict синтаксиса понимания. Су можно записать dict((x, x**2) for x in range(10)). – Marian 30.05.2010, 01:57

__slots__ хороший способ сохранить память, но очень трудно получить dict значений объекта. Вообразите следующий объект:

class Point(object):
    __slots__ = ('x', 'y')

Теперь, когда объект, очевидно, имеет два атрибута. Теперь мы можем создать экземпляр его и создать dict из него этот путь:

>>> p = Point()
>>> p.x = 3
>>> p.y = 5
>>> dict((k, getattr(p, k)) for k in p.__slots__)
{'y': 5, 'x': 3}

Это однако не будет работать, если точка была разделена на подклассы, и были добавлены новые слоты. Однако Python автоматически реализует __reduce_ex__ для помощи copy модуль. Этим можно злоупотребить для получения dict значений:

>>> p.__reduce_ex__(2)[2][1]
{'y': 5, 'x': 3}
14
ответ дан 14.09.2019, 19:22
  • 1
    О, ничего себе, у меня могло бы на самом деле быть хорошее использование для этого! – sli 30.12.2008, 21:46
  • 2
    Остерегайтесь это __reduce_ex__ может быть переопределено в подклассах, и с тех пор it' s также используемый для соления, это часто. (Если you' ре, делающее контейнеры данных, необходимо думать об использовании его также! или it' s младшие одноуровневые элементы __getstate__ и __setstate__.) – Ken Arnold 01.07.2010, 10:53
  • 3
    Можно все еще сделать object.__reduce_ex__(p, 2)[2][1] тогда. – Armin Ronacher 01.07.2010, 13:13

Присвоение и удаление частей:

>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[:5] = [42]
>>> a
[42, 5, 6, 7, 8, 9]
>>> a[:1] = range(5)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[::2]
>>> a
[1, 3, 5, 7, 9]
>>> a[::2] = a[::-2]
>>> a
[9, 3, 5, 7, 1]

Примечание : при присвоении расширенным частям (s[start:stop:step]), присвоенное повторяемое должно иметь ту же длину как часть.

19
ответ дан 14.09.2019, 19:22

Часть из встроенный избранное, карта (), уменьшает (), и фильтр (). Все чрезвычайно быстрые и мощные.

13
ответ дан 14.09.2019, 19:22
  • 1
    понимания списка могут достигнуть всего, что можно сделать с любой из тех функций. – recursive 01.01.2009, 21:28
  • 2
    Это может также запутать код Python при злоупотреблении их – juanjux 11.08.2009, 23:57
  • 3
    @sil: карта все еще существует в Python 3, поскольку действительно фильтрует и уменьшает, существует как functools.reduce. – u0b34a0f6ae 04.10.2009, 15:17
  • 4
    @recursive: Я игнорирую Вас для создания выражения понимания/генератора списка, которое выполняет действие reduce() – SingleNegationElimination 18.11.2009, 07:08
  • 5
    Корректный оператор является " reduce() может достигнуть всего, что можно сделать с map(), filter(), или перечислить понимания " – Kragen Javier Sitaker 12.01.2012, 17:31

Генераторы

я думаю, что много начала разработчиков Python передает по генераторам, действительно не схватывая то, что они для или получение любого смысла их питания. Только когда я считал представление PyCon David M. Beazley генераторов (это доступно здесь ), что я понял, насколько полезный (важный, действительно) они. То представление осветило то, что было для меня совершенно новым способом запрограммировать, и я рекомендую его любому, у кого нет глубокого понимания генераторов.

23
ответ дан 14.09.2019, 19:22
  • 1
    Ничего себе! Мой мозг пожарен, и это было просто первыми 6 частями. При запуске в 7 я должен был начать рисовать изображения только, чтобы видеть, понял ли я действительно то, что происходило с мультипроцессом / мультипоток / конвейеры обработки мультимашины. Удивительный материал! – Peter Rowell 11.11.2008, 07:06
  • 2
    +1 для ссылки на представление – Mark Heath 02.10.2010, 00:13
  • 3
    На самом деле процесс на 32 бита может иметь до 3 ГБ под x86 ОС и до 4 ГБ под x64 ОС. См. мой ответ ниже или msdn.microsoft.com/en-us/library/… – Ohad Schneider 12.10.2019, 10:10

Метаклассы

, конечно:-) , Что такое метакласс в Python?

24
ответ дан 14.09.2019, 19:22
  • 1
    самый темный секрет! – Jeffrey Jose 28.05.2010, 09:16
  • 2
    По моему опыту, даже при том, что ограничение - теоретически 2 ГБ, система станет нестабильной, как только Вы достигаете приблизительно 1,2 ГБ. – Tim 12.10.2019, 10:11

Первоклассные функции

Это не действительно скрытая функция, но то, что функции являются объектами первого класса, является просто большим. Можно раздать их как любая другая переменная.

>>> def jim(phrase):
...   return 'Jim says, "%s".' % phrase
>>> def say_something(person, phrase):
...   print person(phrase)

>>> say_something(jim, 'hey guys')
'Jim says, "hey guys".'
19
ответ дан 14.09.2019, 19:22
  • 1
    Это также делает обратный вызов и создание рычага (и, таким образом, сменное создание для Ваших сценариев Python) столь тривиальными, что Вы даже не могли бы знать you' ре, делающее его. – sli 30.12.2008, 21:49
  • 2
    Любой язык это doesn' t имеют функции первого класса (или по крайней мере некоторая хорошая замена, как указатели функции C) это - ошибка. Абсолютно невыносимо обойтись. – SingleNegationElimination 18.11.2009, 07:06
  • 3
    Это могло бы быть более глупым вопросом, чем я предназначаю, но isn' t это по существу указатель функции? Или мне перепутывали это? – inspectorG4dget 22.09.2010, 18:13
  • 4
    @inspectorG4dget: It' s, конечно, связанный с указателями функции, в которых это может выполнить все те же цели, но it' s немного более общий, более мощный, и более интуитивный. Особенно мощный, когда Вы комбинируете его с тем, что функции могут иметь атрибуты или то, что экземпляры определенных классов можно назвать, но это начинает становиться тайным. – eswald 10.10.2010, 07:48
  • 5
    Ограничения являются тем же в.NET 4 также. – Sam Harwell 12.10.2019, 10:11

Неявная конкатенация:

>>> print "Hello " "World"
Hello World

Полезный, когда Вы хотите сделать соответствие длинного текста на нескольких строках в сценарии:

hello = "Greaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Hello " \
        "Word"

или

hello = ("Greaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Hello " 
         "Word")
22
ответ дан 14.09.2019, 19:22
  • 1
    Чтобы заставить длинный текст соответствовать на нескольких строках, можно также использовать тройные кавычки. – Rafał Dowgird 20.09.2008, 03:48
  • 2
    Ваш пример является неправильным и вводящим в заблуждение. После выполнения его, " Word" часть won' t быть на конце привет представляют в виде строки. Это won' t конкатенируют. Для продолжения следующей строки как этот Вам были бы нужны неявное продолжение строки и конкатенация строк и который только происходит, если Вы используете некоторый разделитель как () или []. – nosklo 20.09.2008, 15:26
  • 3
    Любой, кто когда-либо забывал запятую в списке строк, знает как злой этот ' feature'. – Terhorst 22.09.2008, 19:13
  • 4
    Ну, PEP был установлен избавиться от него, но Guido, решенный наконец для хранения его. Я предполагаю it' s более полезный, чем ненавистный. На самом деле недостатки не так опасны (никакие проблемы безопасности) и для длинных строк, это помогает много. – e-satis 23.09.2008, 06:30
  • 5
    Это - вероятно, моя любимая функция Python. Можно забыть правильный синтаксис и it' s все еще правильный синтаксис. – sli 30.12.2008, 21:47

Используя аргументы ключевого слова как присвоения

Иногда каждый хочет создать диапазон из функций в зависимости от одного или нескольких параметров. Однако это могло бы легко привести к закрытиям все обращение к тому же объекту и значению:

funcs = [] 
for k in range(10):
     funcs.append( lambda: k)

>>> funcs[0]()
9
>>> funcs[7]()
9

Этого поведения можно избежать путем превращения лямбда-выражения в функцию, зависящую только от ее аргументов. Ключевой параметр хранит текущее значение, которое связывается с ним. Вызов функции не должен быть изменен:

funcs = [] 
for k in range(10):
     funcs.append( lambda k = k: k)

>>> funcs[0]()
0
>>> funcs[7]()
7
21
ответ дан 14.09.2019, 19:22
  • 1
    Меньше hackish способа сделать это (по моему скромному мнению), должно только использовать отдельную функцию для производства лямбд это don' t закрываются на переменной цикла. Как это: def make_lambda(k): return lambda: k. – Jason Orendorff 29.01.2010, 09:03
  • 2
    " меньше hackish"?.... it' s персональное предпочтение, я предполагаю, но это - базовый материал Python - не действительно взлом. Конечно, можно структурировать его (использующие функции) так, чтобы читатель не должен был понимать как Python' s работа параметров по умолчанию - но если Вы действительно понимаете, как параметры по умолчанию работают, Вы будете читать "lambda: k=k:k" и сразу поймете, что это - " saving" текущее значение " k" (поскольку лямбда создается), и присоединение его к самой лямбде. Это работает то же с нормальным " def" функции, также. – Nick Perkins 21.09.2011, 10:34
  • 3
    Jason Orendorff' s ответ корректно, но это - то, как мы раньше эмулировали закрытия в Python, прежде чем Guido наконец согласился, что вложенными объемами была хорошая идея. – Kragen Javier Sitaker 12.01.2012, 17:23
  • 4
    It' s не, что Вы получаете больше памяти в XP (т.е. больше тех 4 ГБ RAM) it' s, что можно выполнить процесс до 3 ГБ RAM msdn.microsoft.com/en-us/library/ms791558.aspx – Tom Kidd 12.10.2019, 10:11

Тернарный оператор

>>> 'ham' if True else 'spam'
'ham'
>>> 'ham' if False else 'spam'
'spam'

Это было добавлено в 2,5, до которого Вы могли использовать:

>>> True and 'ham' or 'spam'
'ham'
>>> False and 'ham' or 'spam'
'spam'

Однако, если бы значения Вы хотите работать с, считался бы ложью, существует различие:

>>> [] if True else 'spam'
[]
>>> True and [] or 'spam'
'spam'
19
ответ дан 14.09.2019, 19:22
  • 1
    That' s " ternary". – recursive 01.01.2009, 21:29
  • 2
    До 2,5, " нечто = панель и ' ham' или ' spam' " – a paid nerd 11.05.2009, 18:30
  • 3
    @a заплатил компьютерному фанату - не совсем: 1 == 1 и 0 или 3 = > 3. И короткие замыкания на 0 (как он эквивалентный Лжи - то же соглашение с " " и Ни один). – hbn 24.01.2011, 09:45

Объединение в цепочку операторов сравнения:

>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20 
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True

В случае, если Вы думаете, что это делает 1 < x, который выходит как True, и затем сравнение True < 10, который является также True, тогда не, это действительно не, что происходит (см. последний пример.) Это действительно переводит в 1 < x and x < 10, и x < 10 and 10 < x * 10 and x*10 < 100, но с меньшим количеством ввода и каждым термином только оценен однажды.

741
ответ дан 04.10.2019, 10:37
  • 1
    That' s очень полезный. Это должно быть стандартно для всех языков. К сожалению, это isn' t. – stalepretzel 17.10.2008, 16:23
  • 2
    необходимо добавить некоторые примеры, которые возвращают false также. такой как > > > 10 < x < 20 Лжи – ShoeLace 22.11.2008, 02:34
  • 3
    Это относится к другим операторам сравнения также, который является, почему люди иногда удивляются, почему код как (5 в [5] Верно) является Ложью (но it' s unpythonic для явного тестирования против булевских переменных как этот для начала). – Miles 03.03.2009, 06:35
  • 4
    +1 btw, так как Вы действительно указывали на проблему со смещением права подписанный ints. – Noldorin 01.05.2009, 19:43
  • 5
    Хороший, но не упускают равный prcedence, как ' in' и ' = '. ' в B == C в D' средства ' (В B) и (B == C) и (C в D) ' который мог бы быть неожиданным. – Charles Merriam 10.02.2010, 22:28
  • 6
    Azafe: Lisp' s сравнения естественно прокладывают себе путь. It' s не особый случай, потому что there' s никакой другой (разумный) способ интерпретировать (< 1 x 10). Можно даже применить их к отдельным аргументам, как (= 10): cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/… – Ken 27.05.2010, 10:31

Вложенные понимания списка и выражения генератора:

[(i,j) for i in range(3) for j in range(i) ]    
((i,j) for i in range(4) for j in range(i) )

Они могут заменить огромные блоки кода вложенного цикла.

91
ответ дан 04.10.2019, 10:37
  • 1
    " для j в диапазоне (i) " - действительно ли это - опечатка? Обычно you' d хотят зафиксированные диапазоны поскольку я и j. Если you' ре, получающее доступ к 2-му массиву, you' d пропускают половину Ваших элементов. – Peter Gibson 29.03.2009, 16:27
  • 2
    I' m не получающий доступ к любым массивам в этом примере. Единственная цель этого кода состоит в том, чтобы показать, что выражения от внутренних диапазонов могут получить доступ к тем от внешних. Побочный продукт является списком пар (x, y) таким образом что 4> x> y> 0. – Rafał Dowgird 30.03.2009, 22:23
  • 3
    вид подобной двойной интеграции в исчислении или двойного суммирования. – Yoo 30.09.2009, 10:57
  • 4
    Ключевой пункт для запоминания здесь (который взял меня долгое время для понимания) - то, что порядок эти for операторы состоит в том, чтобы быть записан в порядке you' d ожидают, что они будут записаны в стандарте для цикла с внешней стороны внутрь. – sykora 26.01.2010, 23:17
  • 5
    Прибавлять к sykora' s комментарий: вообразите you' ре, запускающееся со стека for с и if с с yield x внутренняя часть. Для преобразования этого в выражение генератора переместите x первый, удалите все двоеточия (и yield) и окружите все это в круглых скобках. Для создания понимания списка вместо этого, замените внешний parens квадратными скобками. – Ken Arnold 14.06.2011, 15:30
  • 6
    Спасибо за XPath путь. I' ve, с помощью ConfigurationManager в течение приблизительно двух дней теперь с Конфигурацией. AppSettings. Настройки. Количество = 0. Ваш метод, по крайней мере, устанавливает правильное значение для меня. – TamusJRoyce 13.10.2019, 14:38

Оператор, перегружающийся для set встроенный:

>>> a = set([1,2,3,4])
>>> b = set([3,4,5,6])
>>> a | b # Union
{1, 2, 3, 4, 5, 6}
>>> a & b # Intersection
{3, 4}
>>> a < b # Subset
False
>>> a - b # Difference
{1, 2}
>>> a ^ b # Symmetric Difference
{1, 2, 5, 6}
[еще 114] деталь из стандартного справочного руководства по библиотеке: Типы Набора

91
ответ дан 04.10.2019, 10:37

Интерактивное заполнение клавишей Tab Интерпретатора

try:
    import readline
except ImportError:
    print "Unable to load readline module."
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")


>>> class myclass:
...    def function(self):
...       print "my function"
... 
>>> class_instance = myclass()
>>> class_instance.<TAB>
class_instance.__class__   class_instance.__module__
class_instance.__doc__     class_instance.function
>>> class_instance.f<TAB>unction()

необходимо будет также установить переменную среды PYTHONSTARTUP.

105
ответ дан 04.10.2019, 10:37
  • 1
    Это - очень полезная функция. Так так I' ve простой сценарий для включения его (плюс несколько других улучшений самоанализа): pixelbeat.org/scripts/inpy – pixelbeat 13.10.2008, 12:49
  • 2
    IPython дает Вам это плюс тонны другого аккуратного материала – akaihola 10.01.2009, 15:47
  • 3
    @akaihola читают основной qn. – Sriram 04.11.2009, 05:43
  • 4
    @haridsv - easy_install ipdb - тогда можно использовать import ipdb; ipdb.set_trace() – Doug Harris 21.05.2010, 12:03
  • 5
    На osx [и я воображаю другие системы, которые используют libedit], необходимо сделать readline.parse_and_bind ("bind ^I rl_complete") – Foo Bah 11.02.2011, 03:20
  • 6
    Все же, когда я поместил файл, названный app.config в каталоге dll, с помощью " app" как exePath параметр, я должен был изменить имя файла к приложению, прежде чем это работало... – tobbenb3 13.10.2019, 14:38

Основные сообщения:)

import this
# btw look at this module's source :)
<час>

Расшифрованный :

Дзэн Python, Tim Peters

Красивый лучше, чем ужасный.
Явный лучше, чем неявный.
Простой лучше, чем комплекс.
Комплекс лучше, чем сложный.
Плоский лучше, чем вложенный.
Редкий лучше, чем плотный.
количества Удобочитаемости.
Особые случаи не являются достаточно особенными для нарушения правил.
, Хотя практичность бьет чистоту.
Ошибки никогда не должны передавать тихо.
, Если явно не заставлено замолчать.
Перед лицом неоднозначности, откажитесь от искушения предположить. Должны быть один - и предпочтительно только один - очевидный способ сделать это.
, Хотя тот путь не может быть очевидным сначала, если Вы не голландцы.
Теперь лучше, чем никогда.
, Хотя никогда не часто лучше, чем [1 120] право теперь.
, Если реализацию трудно объяснить, это - плохая идея.
, Если реализацию легко объяснить, это может быть хорошая идея.
Пространства имен являются одной гудящей прекрасной идеей - давайте сделаем больше из тех!

106
ответ дан 04.10.2019, 10:37

Переповышение исключений :

# Python 2 syntax
try:
    some_operation()
except SomeError, e:
    if is_fatal(e):
        raise
    handle_nonfatal(e)

# Python 3 syntax
try:
    some_operation()
except SomeError as e:
    if is_fatal(e):
        raise
    handle_nonfatal(e)

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

, Если Вы хотите распечатать, сохраните или играйте с исходным traceback, можно получить его с sys.exc_info (), и печать его как Python была бы делаться с 'traceback' модулем.

114
ответ дан 04.10.2019, 10:37
  • 1
    Извините, но это - известная и типичная функция почти всех языков. – Lucas S. 20.09.2008, 04:04
  • 2
    Я соглашаюсь с Lucas S. – Cristian Ciupitu 06.10.2008, 05:27
  • 3
    Отметьте курсивный текст. Некоторые люди сделают raise e вместо этого, который doesn' t сохраняют исходный traceback. – habnabit 27.01.2009, 15:14
  • 4
    Возможно, более волшебный, exc_info = sys.exc_info(); raise exc_info[0], exc_info[1], exc_info[2] эквивалентно этому, но можно менять те значения (например, изменить тип исключительной ситуации или сообщение), – ianb 06.05.2009, 10:27
  • 5
    @Lucas S. Ну, я didn' t знают это, и I' m довольный it' s записанный здесь. – e-satis 24.06.2010, 02:32
  • 6
    Не позволенный: " установка свойства FirstName влияла бы на свойство FullName только для чтения, которое составило имя +, свойства фамилии подразумевают такой dependency" О, это плохо мне знакомо. Я использую эту бабку много. Как Диапазон Свойства только для чтения = получают Max - Минута. Я думаю, что это - достаточно быстрая/простая операция, которая будет использоваться в качестве свойства. Таким образом, я отчасти не соглашаюсь с этой точкой. – Pedro77 08.01.2014, 16:42

Для добавления большего количества модулей Python (espcially сторонние) большинство людей, кажется, использует переменные среды PYTHONPATH, или они добавляют символьные ссылки или каталоги в их каталогах пакетов сайта. Иначе, должен использовать *.pth файлы. Вот официальное объяснение документа Python:

"Наиболее удобный способ [для изменения пути поиска Python] состоит в том, чтобы добавить конфигурационный файл пути к каталогу, это уже находится на пути Python, обычно к.../site-packages/каталог. Конфигурационные файлы пути имеют расширение .pth, и каждая строка должна содержать единственный путь, который будет добавлен к sys.path. (Поскольку новые пути добавляются к sys.path, модули в добавленных каталогах не переопределят стандартные модули. Это означает, что Вы не можете использовать этот механизм для установки исправленных версий стандартных модулей.)"

132
ответ дан 04.10.2019, 10:37
  • 1
    Я никогда не устанавливал связь между этим .pth файл в каталоге пакетов сайта от setuptools и этой идеей. потрясающий. – dave paola 14.07.2010, 16:07

проход () может взять вызываемый аргумент

, Например:

def seek_next_line(f):
    for c in iter(lambda: f.read(1),'\n'):
        pass

Эти iter(callable, until_value) функция неоднократно называет callable и приводит к своему результату, пока until_value не возвращается.

353
ответ дан 04.10.2019, 10:37
  • 1
    Как новичок к Python, можно ли объяснить, почему lambda ключевое слово необходимо здесь? – SiegeX 13.08.2011, 10:29
  • 2
    @SiegeX без лямбды, f.read (1) был бы оценен (возврат строки) прежде чем быть переданным функции прохода. Вместо этого лямбда создает анонимную функцию и передачи это к проходу. – jmilloy 01.01.2012, 05:43

объекты генераторов Создания

, Если Вы пишете

x=(n for n in foo if bar(n))

, можно вынуть генератор и присвоить его x. Теперь это означает, что можно сделать

for n in x:

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

x = [n for n in foo if bar(n)]

В некоторых случаях, это может привести к значительной скорости.

можно добавить многих если операторы до конца генератора, в основном копируя вложенный для циклов:

>>> n = ((a,b) for a in range(0,2) for b in range(4,6))
>>> for i in n:
...   print i 

(0, 4)
(0, 5)
(1, 4)
(1, 5)
419
ответ дан 04.10.2019, 10:37
  • 1
    Вы могли также использовать вложенное понимание списка для этого, да? – shapr 06.05.2009, 06:53
  • 2
    Особо значимый память служебные сбережения. Значения вычисляются по запросу, таким образом, у Вас никогда нет всего результата понимания списка в памяти. Это особенно желательно, если Вы позже выполняете итерации только по части понимания списка. – saffsd 17.05.2009, 16:41
  • 3
    Это не особенно " hidden" imo, но также и стоящий замечания является тем, что Вы не могли перемотать объект генератора, тогда как можно повторить по списку любое количество раз. – susmits 16.04.2010, 06:26
  • 4
    " никакой rewind" функция генераторов может вызвать некоторый беспорядок. А именно, если Вы печатаете generator' s содержание для отладки, затем используйте его позже для обработки данных, это doesn' t работа. Данные производятся, используются печатью (), затем не доступны для нормальной обработки. Этот doesn' t применяются к пониманиям списка, с тех пор they' ре полностью сохранено в памяти. – johntellsall 29.05.2010, 06:01
  • 5
    Подобный (дубликат?) ответ: stackoverflow.com/questions/101268/hidden-features-of-python/… Примечание, однако, который ответ я связал здесь, упоминает ДЕЙСТВИТЕЛЬНО хорошую презентацию о питании генераторов. Действительно необходимо проверить его. – Denilson Sá Maia 05.08.2010, 10:21
  • 6
    Полностью согласитесь. Дизайн для расширяемости, не в настоящий момент... половина испеченного задания взлома. И выполнение этого является простой вещью, it' s не переусердствовавший что-либо, you' вещи разделения ре, делая их, которых никогда не знает DRY, и даже если код, который Вы переместились в метод, не СНОВА ИСПОЛЬЗУЕТСЯ ТЕПЕРЬ... Вы, когда кто-то другой, чем себя или текущий бизнес-процесс или требование, возможно, должен использовать тот же самый код ПОЗЖЕ. That' s качественный дизайн. Взломы бесполезны. Наличие того кода из Вашего свойства и в метод делает его более читаемым как, а также удобный в сопровождении и открытый для легкого повторного использования позже... никакая потребность осуществить рефакторинг – PositiveGuy 29.09.2010, 19:02

Быть осторожными с изменяемыми параметрами по умолчанию

>>> def foo(x=[]):
...     x.append(1)
...     print x
... 
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]

Вместо этого необходимо использовать значение сигнальной метки, обозначающее "не данный" и замена изменяемым, которое Вы хотели бы как значение по умолчанию:

>>> def foo(x=None):
...     if x is None:
...         x = []
...     x.append(1)
...     print x
>>> foo()
[1]
>>> foo()
[1]
339
ответ дан 04.10.2019, 10:37
  • 1
    That' s определенно одна из более противных скрытых функций. I' ve время от времени сталкиваются с ним. – Torsten Marek 24.09.2008, 07:42
  • 2
    Я нашел это намного легче понять, когда я узнал, что параметры по умолчанию живут в кортеже that' s атрибут функции, например, foo.func_defaults. Который, будучи кортежем, неизменно. – Robert Rossney 06.11.2009, 08:43
  • 3
    @grayger: Поскольку оператор определения выполняется, его аргументы оценены интерпретатором. Это создает (или снова переплетает), имя к объекту кода (комплект функции). Однако параметры по умолчанию инстанцируют как объекты во время определения. Это верно для любого времени принявшего значение по умолчанию объекта, но только значительный (представление видимой семантики), когда объект изменяем. There' s никакой способ снова переплести то имя параметра по умолчанию в function' s закрытие, хотя это может, очевидно, быть переопределено для любого вызова или целой функции, может быть переопределен). – Jim Dennis 24.06.2010, 18:20
  • 4
    @Robert, конечно, кортеж аргументов мог бы быть неизменным, но объекты, на которые это указывает, не обязательно неизменны. – poolie 23.07.2010, 04:59
  • 5
    Один быстрый взлом для создания инициализации немного короче: x = x или []. Можно использовать это вместо 2 строк если оператор. – dave mankoff 27.08.2010, 16:58

Передающие значения в функции генератора . Например, наличие этой функции:

def mygen():
    """Yield 5 until something else is passed back via send()"""
    a = 5
    while True:
        f = (yield a) #yield a and possibly get f in return
        if f is not None: 
            a = f  #store the new value

Вы можете:

>>> g = mygen()
>>> g.next()
5
>>> g.next()
5
>>> g.send(7)  #we send this back to the generator
7
>>> g.next() #now it will yield 7 until we send something else
7
317
ответ дан 04.10.2019, 10:37
  • 1
    На других языках я полагаю, что это волшебное устройство называют " variable". – finnw 06.05.2009, 07:49
  • 2
    сопрограммы должны быть сопрограммами, и genenerator должен быть собой также без смешивания. Мегабольшая ссылка и разговор и примеры об этом здесь: dabeaz.com/coroutines – u0b34a0f6ae 24.08.2009, 11:39
  • 3
    Это - нескрытая функция – Justin 29.05.2010, 05:26
  • 4
    @finnw: пример реализует что-то that' s подобный переменной. Однако функция могла быть использована многими другими способами... в отличие от переменной. Должно также быть очевидно, что подобная семантика может быть реализована с помощью объектов (класс implemting Python' вызов s метод, в особенности). – Jim Dennis 24.06.2010, 18:07
  • 5
    Это - слишком тривиальный пример для людей who' ve никогда не замечен (и вероятно won' t понимают), сопрограммы. Примером, который реализует рабочее среднее число без риска переполнения переменной суммы, является хороший. – Prashant Kumar 11.06.2011, 20:16