Подтвердить что ты не робот

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

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

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

Плюс, какие идиомы должны начинать программисты на Python раньше?

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

по теме:

4b9b3361

Ответ 1

Python - это язык, который можно охарактеризовать как:

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

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

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


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

  • Динамические сильно типизированные языки
  • bool, int, float, string, list, tuple, dict, set
  • отступы, "все - объект"
  • определения основных функций

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

  • импорт и модули (действительно простые)
  • путь python (sys.path)
  • функция dir()
  • __builtins__

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

  • итераторы
  • переопределяет, как __len__ (их много)
  • список понятий и генераторов
  • классы и объекты (опять же, действительно простые, как только вы знаете пару правил)
  • правила наследования python

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

  • Threading in python (обратите внимание на блокировку Global Interpreter)
  • контекстные менеджеры
  • доступ к базе данных
  • файл IO
  • розетки
  • и т.д...

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

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 a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let do more of those!

Ответ 3

Важным идиомом в 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) и т.д., он будет печатать docstring в качестве справочного сообщения.

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

Вот тот, который может помочь. Какая разница между:

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

и

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

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

Ответ 8

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

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

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

Хорошо, я сойду с моего мыльницы.; -)

Ответ 9

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

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

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

или даже

return False, False, False

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

Ответ 10

Использование строковых подстановок:

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

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

Ответ 11

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

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

Let 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.text возвращает что-то другое, тест будет терпеть неудачу.

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

Ответ 12

Я думаю, что учебники онлайн и книги говорят только о том, чтобы делать что-то, а не делать что-то наилучшим образом. Наряду с синтаксисом 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)