Совет для программиста на С#, пишущий Python

Я занимаюсь разработкой С# в течение последних нескольких лет, но в последнее время начал делать немного Python (а не Iron Python). Но я не уверен, сделал ли я умный прыжок на Python... Я как бы чувствую, что я пытаюсь делать что-то, как на С#.

Любые советы о том, как я могу полностью использовать Python?

Или любые советы\трюки, вещи, о которых нужно узнать больше, о чем нужно следить?

Ответ 1

Во-первых, проверьте tgray и советы Лундстрема.

Затем, некоторые вещи, которые вы, возможно, захотите узнать:

  • Python динамически типизируется, поэтому, в отличие от С#, вы не будете тип проверки, но поведение. Вы можете захотеть google о утке типирование. Это означает, что вам не нужно иметь дело с боксом и распаковка.

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

  • Библиотека GUI с Python не может сравниться с С#. Проверьте PyQt, GTK или wxPython библиотеки.

  • У Python есть много понятий, с которыми вы, возможно, не знакомы: список, генераторы ( "yield" существует в С#, но он не используется много), декораторы, метаклассы и т.д. Не Быть испуганным; вы можете программировать на Python без них. Oни это просто умные инструменты, а не обязательные.

  • Как и в С#, стандартная библиотека Python огромна. Всегда посмотрите на это, когда вы столкнетесь с какой-либо проблемой. Это больше всего вероятно, что кто-то решил его уже.

  • Python использует привязки LATE и метки переменных. Это слишком рано для кого-то, начиная с языка, чтобы волноваться об этом, но помните, что однажды вы столкнетесь с поведение с переменными, которые SEEMS нелогичны, и вы будете должны проверить это. На данный момент:

Просто не забудьте сделать следующее:

def myfunc(my_list=[]) :
   # bla

Вместо

def myfunc(my_list=()) :
   my_list = list(my_list)

И ты будешь хорош. Для этого есть веская причина, но это не точка: -)

  • Python - это кросс-платформа, нравится писать на Mac и работайте на Linux, если хотите.

  • Python не снабжен сложной IDE (вы получили IDLE:-)). Если вы являетесь зависимым от Visual Studio, проверьте Glade. Это не такой продвинутый, как Visual Studio, но он по-прежнему является хорошим RAD.

  • Если вы хотите создать некоторое веб-приложение на Python, помните, что Python не является .NET. Вы должны добавить веб-сайт рамки, если вы хотите сравнить. Мне нравится Django.

  • Для работы с Python не требуется огромная среда IDE. SciTE, Notepad ++, IDLE, Kate, gedit... Легких редакторов действительно достаточно.

  • Python применяет отступы, используя пробелы и разрывы строк, вы не можете это изменить. Вам следует избегать использования вкладок для отступы и выбор пространства вместо этого. Эквивалент пустые браслеты {} - это ключевое слово "pass".

  • Python не применяет частные переменные. Вы можете определить private var с использованием "__" (два символа подчеркивания) в начале имя переменной, но оно все еще недоступно в некоторых сложных пути. Python обычно предполагает, что программисты взрослые взрослые которые знают, что они делают и общаются.

  • Python использует итерацию. Много. Многое. И так Модуль itertools - лучший друг.

  • У Python нет встроенных делегатов. Модуль делегата не то, что вы думаете. Для программирования, управляемого событиями, используйте GUI lib (или код шаблона самостоятельно, это не так трудно).

  • У Python есть интерпретатор: вы можете тестировать почти все, жить. Он всегда должен быть рядом с вашим текстом редактор. Базовый интерпретатор Python не много, попробуйте IPython для чего-то вкусного.

  • Питон автодокументирован: используйте docstrings в своем собственном коде и проконсультируйтесь с другими, используя "help()" в интерпретаторе python

Основы модуля:

  • sys: управлять функциями системы
  • os: установка учетных данных, управление файловыми путями, переименование, рекурсивное перемещение файлов и т.д.
  • shutil: обработка пакетного файла (например, рекурсивное удаление)
  • re: regexp
  • urllib и urllib2: HTTP¨scripting как загрузка, сообщение/получение resquests и т.д.
  • datetime: манипулировать датой, временем и продолжительностью
  • поток: вы догадываетесь об этом
  • zlib: сжатие
  • рассол: сериализация
  • xml: разбор/запись XML с помощью SAX или DOM

Существуют сотни модулей. Наслаждайтесь.

Некоторые типичные способы делать вещи в Python:

Контуры:

Кодеры Python используют массово эквивалент foreach С# и предпочитаем его другим:

Основные итерации:

for item in collection:
    print str(item)

"collection" может быть строкой, списком, кортежем... Любой iterable: любой объект, определяющий метод .next(). Есть много итераций в Python. Например: типичная идиома Python для чтения файлов:

for line in open("/path/to/file") :
    print line

Ярлык для цикла for называется "понимание списка". Это способ создания новой итерации в одной строке:

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

my_list = [item for item in collection if condition]

Создание нового списка со списком:

my_list = [int(item) * 3 for item in collection]

Создание нового генератора со списком:

my_list = (int(item) * 3 for item in collection)

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

Обычный для цикла

Если вы хотите выразить обычный цикл, вы можете использовать xrange(). for (int i = 0; i < 5; i++) становится:

for i in xrange(0,5) :

сделать в то время как эквивалентный

В Python нет "Do While". Я никогда не пропустил его, но если вы должны использовать эту логику, выполните следующие действия:

while True : # Yes, this is an infinite loop. Crazy, hu?

  # Do your stuff

  if condition :
      break

Распаковка

Переменные переменных:

a, b = b, a

Несколько присваиваний:

Вышеизложенное является результатом того, что мы называем "распаковкой" (здесь применяется к кортежу). Простой способ объяснить это то, что вы может присваивать каждое значение любой последовательности непосредственно равному число переменных в одной строке:

animal1, animal2, animal3, animal4 = ["cow", "dog", "bird", "fish"]

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

agenda = [("steve", "jobs"), ("linus", "torvald"), ("bill", "gates"),("jon", "skeet")]
for person in agenda:
    print person[0], person[1]

Но при распаковке вы можете напрямую присвоить значения переменные:

agenda = [("steve", "jobs"), ("linus", "torvald"), ("bill", "gates"),("jon", "skeet")]
for name, lastname in agenda:
    print name, lastname

И поэтому, если вы хотите получить индекс во время итерации, Кодировщики Python используют следующие идиомы (enumerate() - это стандартная функция):

for index, value in enumerate(sequence) :
    print index, value

Распаковка вызовов функций

Это расширенное использование, и вы можете пропустить его, если это вас беспокоит.

Вы можете распаковать значения, используя знак "*", чтобы использовать последовательность непосредственно в вызове функции. Например:

>>> foo(var1, var1, var3) :
    print var1, var2
    print var3
>>> seq = (3.14, 42, "yeah")
>>> foo(*seq)
3.14 42
yeah

Есть даже больше. Вы можете распаковать словарь как именованные переменные и прототипы функций записи с помощью *, **, чтобы принять произвольное количество аргументов. Но это не используется достаточно, чтобы заслужить эту запись еще дольше: -).

Форматирование строки:

print "This is a %s on %s about %s" % ("post", "stackoverflow", "python")
print "This is a %(subject)s on %(place)s about %(about)s" % {"subject" : "post", "place" : "stackoverflow", "about" : "python"}

Нарезка итерации:

Вы можете получить любую часть итерации, используя очень сжатый синтаксис:

print "blebla"[2:4] # Print "eb"
last = string[:-1] # Getting last element
even = (0,1,2,3,4,5,6,7,8,9)[::2] # Getting evens only (third argument is a step)
reversed = string[::-1] # Reversing a string

Логические проверки:

Вы можете проверить, как вы работаете на С#, но есть "Pythonic" пути (короче, яснее: -)):

if 1 in (1, 2, 3, 4) : # Check en element is in a sequence

if var : # check is var is true. Var == false if it False, 0, (), [], {} or None

if not var : # Contrary of above

if thing is var: # Check if "thing" and "var" label the same content.

if thing is None : # We use that one because None means nothing in Python (almost null)

Комбо (напечатайте на одной строке все слова, содержащие "o" в верхнем регистре):

sentence = "It a good day to write some code"
print " ".join([word.upper() for word in sentence.split() if "o" in word])

Выход: "ХОРОШИЙ К НЕКОТОРОМУ КОДУ"

Легче просить прощения, чем разрешение

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

try :
    f = open(file)
except IOerror :
    print "no file here !"

Конечно, Чак Норрис никогда не использует исключений, так как он никогда не терпит неудачу.

Предложение else

"Else" - это мир многих применений в Python. Ты найдешь "else" после "if", но после "except" и "for".

for stuff in bunch :
    # Do things
else :
    # This always happens unless you hit "break" in the loop

Это работает для цикла while, даже если мы не используем этот петля.

   try :
      # A crazy stuff
   except ToCrazyError :
      # This happens if the crazy stuff raises a ToCrazyError Exception
   else :
      # This will happen if there is no error so you can put only one line after the "try" clause
   finally :
      # The same as in C#

Если вам интересно, вот куча передовых быстрых и грязный (но красивый) фрагменты Python.

Ответ 2

  • Воздерживаться от использования классов. Используйте словари, наборы, список и кортежи.
  • Сеттеры и получатели запрещены.
  • У вас нет обработчиков исключений, если вам действительно не нужно - пусть он разбивается по стилю.
  • Pylint может быть вашим другом для более стильного стиля написания питонов.
  • Когда вы будете готовы - ознакомьтесь со списком, генераторами и лямбда-функциями.

Ответ 3

Если вы не новичок в программировании, я бы рекомендовал книгу "Погружение в Python" от Mark Pilgrim. Он объясняет Python таким образом, который позволяет легко понять, как методы и идиомы Python могут применяться для создания практических приложений.

Ответ 4

Начните с чтения Zen of Python

Вы можете прочитать его по ссылке выше или просто ввести import this в командной строке Python. =)

Воспользуйтесь преимуществами функций Python, которые не предлагаются * на С#

Такие, как утиная печать, метаклассы, понимание списка и т.д. *

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

Посмотрите Стандартную библиотеку Python

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


* Я знаю, что у С# уже есть некоторые из этих функций, но из того, что я вижу, они либо довольно новые, либо не широко используются разработчиками С#. Пожалуйста, поправьте меня, если я ошибаюсь.

Ответ 6

Если вы - тот, кто лучше изучает новый язык, делая небольшие инкрементные шаги, я бы рекомендовал использовать IronPython. В противном случае используйте обычный CPython и не делайте больше кода на С#, пока не почувствуете, что у вас есть понимание Python.

Ответ 7

Я бы предложил получить хороший редактор, чтобы вы не укусили пробелы. Для простоты я просто использую пакеты ActivePython Ссылка, которые включают в себя редактор и все библиотеки win32api. Они очень забавны, если вы используете С#. Win32api в Python может быть немного проще. Вам не нужно делать всю вещь DDLImport. Загрузите ActivePython (который поставляется с CPython), откройте его и начните вводить некоторые вещи на консоли. После использования С# вы легко поймете это. Для некоторых более интересных Python лакомых кусочков, попробуйте код ActiveState, в котором есть всевозможные рецепты, которые могут позволить вам очень просто увидеть разные вещи, которые вы может работать с Python.

Ответ 8

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

@e-satis, вероятно, знает наизнанку Python, и все его советы являются первоклассными. С моей точки зрения, что имело для меня наибольшее значение, было следующее:

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

Переводчик. Это похоже на ближайшее окно, кроме 10 ^ 10 лучше. Из-за того, как работает Python, вам не нужен весь багаж и дерьмо С# заставляет вас встать, прежде чем вы сможете запускать вещи; вы можете просто вбить несколько строк и посмотреть, как все работает.

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

И, наконец, любя в многословии Python, и я не имею в виду, что в длинном ведомом значении многословия, но, как указывал e-satis, использование глаголов типа "in", "is", "for", и т.д.

Если вы много работали над размышлениями на С#, вы почувствуете, что плачете, когда видите, как просто один и тот же материал находится на Python.

Удачи вам.

Ответ 10

И затем что-то, что вы можете извлечь из:

IPython shell: автозаполнение в оболочке. Он выполняет пакетные операции, добавляет массу функций, протоколирует и т.д. → > Играйте с оболочкой - всегда!

easy_install/pip: такой приятный и простой способ установить стороннее приложение Python.