Каковы важные языковые функции (идиомы) Python, чтобы узнать на раннем этапе [дубликат]

этот вопрос уже есть ответ здесь:

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

Python (pythonic) идиома - "выражение кода", которое является естественным или характерным для языка Python.

плюс, какие идиомы должны изучать все программисты Python на ранней стадии?

спасибо заранее

по теме:

12 ответов


Python-это язык, который можно описать как:

"правила вы можете поместить в ладони с огромной сумкой крючки."

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

возьмите, например, встроенную функцию LEN (data). len(data) работает, просто проверяя data.__len__() метода, а затем вызывает его и возвращать значение. Вот кстати, len() может работать на любом объекте, который реализует __len__() метод.


начните с изучения типов и базовый синтаксис:

  1. Динамические Строго Типизированные Языки
  2. bool, int, float, string, list, tuple, dict, set
  3. утверждения, отступы, "все есть объект"
  4. основные определения функции

затем перейдите к изучению того, как python работает:

  1. импорт и модули (очень простой)
  2. путь python (sys.путь)
  3. the dir() функции
  4. __builtins__

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

  1. итераторы
  2. переопределяет как __len__ (есть куча таких)
  3. список понимания и генераторы
  4. классы и объекты (опять же, очень просто, как только вы знаете пару правил)
  5. правила наследования python

и если у вас есть уровень комфорта с этими предметами (с акцентом на то, что делает их обновления), смотреть на более конкретные вещи:

  1. Threading в python (обратите внимание на глобальную блокировку интерпретатора)
  2. контекст-менеджеров
  3. доступ к базе данных
  4. IO
  5. розетки
  6. etc...

и никогда не забывай Дзен питона (Тим Петерс)

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

эта страница охватывает все основные идиомы python:http://python.net / ~goodger/projects/pycon/2007/idiomatic/handout.html


важной идиомой в Python является docstrings.

каждый объект имеет атрибут__ doc__, который можно использовать для получения справки по этому объекту. Атрибут _ _ doc__ можно задать для модулей, классов, методов и функций следующим образом:

# this is m.py
""" module docstring """

class c:
    """class docstring"""
    def m(self):
        """method docstring"""
        pass

def f(a):
    """function f docstring"""
    return

теперь, когда вы типа help(m), help(m.f) etc. он напечатает docstring в качестве сообщения справки.

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

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

где это становится еще более интересным для меня это, хотя doc - это атрибут только для чтения на большинстве объектов, вы можете использовать их в любом месте, как это:

x = 5
""" pseudo docstring for x """

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


декораторы получают мой голос. Где еще вы можете написать что-то вроде:

def trace(num_args=0):
  def wrapper(func):
    def new_f(*a,**k):
      print_args = ''
      if num_args > 0:
        print_args = str.join(',', [str(x) for x in a[0:num_args]])
      print('entering %s(%s)' %(f.__name__,print_args))
      rc = f(*a,**k)
      if rc is not None:
        print('exiting %s(%s)=%s' %(f.__name__,str(rc)))
      else:
        print('exiting %s(%s)' %(f.__name__))
      return rc
    return new_f
  return wrapper

@trace(1)
def factorial(n):
  if n < 2:
    return 1
  return n * factorial(n-1)
factorial(5)

и получаем результат:

entering factorial(5)
entering factorial(4)
entering factorial(3)
entering factorial(2)
entering factorial(1)
entering factorial(0)
exiting factorial(0)=1
exiting factorial(1)=1
exiting factorial(2)=2
exiting factorial(3)=6
exiting factorial(4)=24
exiting factorial(5)=120

все, что связано с использованием списка.
Генераторы, генераторы и т. д.


с более продвинутой точки зрения, понимание того, как словари используются внутри питона. Классы, функции, модули, ссылки-все это просто свойства словаря. Как только это будет понято, легко понять, как обезьяна патч и использовать мощные __gettattr__, __setattr__ и __call__ методы.


вот что может помочь. В чем разница между:

[ foo(x) for x in range(0, 5) ][0]

и

( foo(x) for x in range(0, 5) ).next()

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


лично мне очень нравится синтаксис Python, определяющий блоки кода с помощью отступ, а не словами "начало" и "конец" (как в Microsoft Basic и Visual Basic - мне это не нравится) или с помощью левых и правых скобок (как в C, C++, Java, Perl - мне это нравится).

Это действительно удивило меня, потому что, хотя отступ всегда был очень важен для меня, я не делал много "шума" об этом - я жил с ним, и это считается навыком, чтобы быть в состоянии чтобы читать другие народы, код" спагетти". Кроме того, я никогда не слышал, чтобы другой программист предлагал сделать отступ частью языка. До Питона! Жаль только, что я не догадался об этом раньше.

Мне кажется, что синтаксис Python заставляет вас писать хороший, читаемый код.


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

одержимость списком Python можно назвать LISP-y, но у него есть свой собственный уникальный вкус. Строчка вроде:

return HandEvaluator.StraightFlush, (PokerCard.longFaces[index + 4], 
  PokerCard.longSuits[flushSuit]), []

или даже

return False, False, False

просто выглядит как Python и ничего больше. (Технически, вы также увидите последнее в Lua, но Lua довольно Питонический в целом.)


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

name = "Joe"
age = 12
print "My name is %s, I am %s" % (name, age)

когда я не программирую на python, это простое использование-то, что я пропускаю больше всего.


еще одна вещь, которую вы не можете начать достаточно рано, - это, вероятно, тестирование. Здесь особенно doctests являются отличным способом тестирования кода, объясняя его в то же время.

doctests-это простой текстовый файл, содержащий сеанс интерактивного интерпретатора плюс такой текст:

Let's instantiate our class::

>>> a=Something(text="yes")
>>> a.text
yes

Now call this method and check the results::

>>> a.canify()
>>> a.text
yes, I can

если, например, a.текст возвращает что-то другое, тест завершится неудачей.

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


Я думаю, что учебники онлайн и книги говорят только о том, чтобы делать вещи, а не делать вещи наилучшим образом. Наряду с синтаксисом python я думаю, что скорость в некоторых случаях важна.

Python предоставляет способ тестирования функций, на самом деле два!!

один из способов-это использовать profile модуль, вот так:

import profile

def foo(x, y, z):
    return x**y % z # Just an example.

profile.run('foo(5, 6, 3)')

другой способ сделать это-использовать timeit модуль, вроде этого:

import timeit

def foo(x, y, z):
    return x**y % z # Can also be 'pow(x, y, z)' which is way faster.

timeit.timeit('foo(5, 6, 3)', 'from __main__ import *', number = 100) 
# timeit.timeit(testcode, setupcode, number = number_of_iterations)