Каковы основные концептуальные различия между C # и Python? - PullRequest
3 голосов
/ 29 августа 2009

Я новичок в Python, пришёл из C # фона и пытаюсь набрать скорость. Я понимаю, что Python динамически типизирован, тогда как C # строго типизирован. -> см. Комментарии. На какие концептуальные препятствия я должен обратить внимание при попытке выучить Python? Существуют ли концепции, для которых нет аналогов в Python? Насколько важен объектно-ориентированный анализ?

Я полагаю, что ответы на эти и любые другие вопросы, которые вы могли бы придумать, ускорили бы мое понимание Python помимо менталитета Nike («просто сделай это»)?

Немного больше контекста: моя компания переходит с веб-форм ASP.NET C # на Django. Я прошел учебник по Django, и это было действительно здорово. Мне нужно набрать скорость примерно через 2 недели (может быть, смешно? LOL)

Спасибо всем за ваше время и усилия, чтобы ответить на действительно широкий вопрос (ы).

Ответы [ 5 ]

9 голосов
/ 29 августа 2009

«Я понимаю, что Python динамически типизирован, тогда как C # строго типизирован.»

Это странно неправильно.

  1. Python строго типизирован. Список, целое число или словарь всегда имеют заданный тип. Тип объекта не может быть изменен.

  2. Переменные Python не являются строго типизированными. Действительно, переменные Python - это просто метки на объектах. Переменные не объявлены; отсюда и описание Python как «динамического».

  3. C # статически типизирован. Переменные объявляются компилятору определенного типа. Код генерируется на основе определенных знаний об использовании переменных во время выполнения.

Python "интерпретируется" - все делается во время выполнения - мало что предполагается. [Технически исходный код Python компилируется в байт-код, а байт-код интерпретируется. Некоторые люди думают, что это важное различие.]

C # компилируется - компилятор генерирует код на основе заявленных предположений.


На какие концептуальные препятствия я должен обратить внимание при попытке выучить Python?

None. Если вы настаиваете, что Python должен походить на что-то другое; или вы настаиваете, что что-то еще более интуитивно , тогда вы загрязнили свое мышление неуместными понятиями.

Ни один язык программирования не имеет препятствий. Мы создаем свои собственные препятствия, когда навязываем вещи языку.

Существуют ли концепции, для которых в Python нет аналогов?

Поскольку в Python имеются объектно-ориентированные, процедурные и функциональные элементы, вам будет сложно найти что-то недостающее в Python.

Насколько важен объектно-ориентированный анализ?

OO-анализ помогает на всех этапах разработки программного обеспечения - даже если вы не выполняете OO-реализацию. Это не связано с Python и должно быть отдельным вопросом.

Мне нужно набрать скорость примерно через 2 недели (может быть, смешно?)

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

Если, с другой стороны, вы сравниваете и сравниваете Python с C #, то вам могут потребоваться годы, чтобы преодолеть предвзятость C # и изучить Python. Не переводите C # на Python. Не переводите Python на C #.

Не идите к колодцу с полным ведром.

4 голосов
/ 29 августа 2009

Утка набрав

Я думаю, что главное, что устанавливает c # / java из python, это то, что часто нет необходимости в интерфейсах. Это потому что Python имеет ducktyping .

class Duck(object):
    def quack(self):
        print "quack"

class Cat(object):
    """Cat that specializes in hunting ducks"""
    def quack(self):
        print "quack"

duck = Duck()
cat = Cat()

def quacker(something_that_quacks):
    something_that_quacks.quack()

quacker(cat) #quack
quacker(duck) #quack

Пока у объекта есть метод кряка, его ОК можно использовать для вызова крякера. Утиная печать также упрощает реализацию шаблонов проектирования Потому что вам не нужно писать интерфейсы и следить за тем, чтобы объекты были одного типа.

3 голосов
/ 29 августа 2009

Есть много различий между C # и Python; вместо того, чтобы останавливаться на индивидуальных различиях, вероятно, лучше просто посмотреть, как работает Python, используя руководство, такое как Dive Into Python . И помните, хотя Python позволяет вам очень хорошо выполнять ООП, он не ограничивает вас ООП. Бывают случаи, когда простые функции достаточно хороши (хорошим примером являются представления Django).

Существует также множество концептуальных различий между WebForms и Django. Django больше подходит для HTTP - нет ничего путаницы в том, что происходит на стороне клиента и что происходит на стороне сервера. В типичном приложении WebForms события на стороне клиента часто запускают код на стороне сервера с использованием обратных передач. Даже с помощью ASP.NET Ajax Framework это среда, которая предлагает меньше контроля, чем вам иногда нужно. В Django вы достигаете того же эффекта, используя библиотеки на стороне клиента, например, используя YUI или JQuery и сделать Ajax называет себя. Даже несмотря на то, что такой подход не держит вас так сильно, как, скажем, подход ASP.NET, вы должны быть более продуктивными с Django и Python, чтобы сделать последние в целом чистыми. ASP.NET стремится сделать вещи более знакомыми для разработчиков, привыкших к WinForms и другим средам разработки десктопов; хотя для Microsoft это вполне разумный подход (и они не единственные - например, в Java есть JSF), он не совсем соответствует HTTP и REST в одинаковой степени. Для примера рассмотрим, как ограничивают URL-адреса ASP.NET (до ASP.NET MVC) по сравнению с URL-адресами Django.

Только мои 2 цента стоит: -)

2 голосов
/ 29 августа 2009

Вы сказали, что Python динамически типизирован, а C # строго типизирован, но это не так. Сильная и слабая типизация и статическая и динамическая типизация являются ортогональными. Строгая типизация означает, что str + int не принуждает один из операндов, поэтому в этом отношении Python и C # строго типизированы (тогда как PHP или C слабо типизированы). Python динамически типизирован, что означает, что имена не имеют определенного типа во время компиляции, тогда как в C # они имеют.

1 голос
/ 29 августа 2009

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

Наиболее важными из них являются "утки". Т.е. забудь, что за вещи типа, тебе не нужно заботиться. Вам нужно только позаботиться о том, какие атрибуты и методы имеют объекты «Если это похоже на утку и ходит как утка, то это утка». Как правило, эти изменения отношения происходят естественным образом через некоторое время.

Самые большие концептуальные препятствия кажутся

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

  2. Нет компилятора и, следовательно, нет тестирования типов на этапе компиляции. Многие люди из статически типизированных языков считают, что проверка типов во время компиляции находит много ошибок. По моему опыту это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...