2010-09-04 4 views
1

Я только начинаю входить в Python - мой фокус заключается в использовании его с Maya и его API - и я обнаружил, что когда я что-то работаю, , как правило, по крайней мере 2 или 3 способа сделать то же самое, что я пытаюсь сделать. Например:Есть ли «лучший» способ сделать что-то в Python

for key, value in locNameConnector.iteritems(): 
    value = locNameConnector[key] 
    cmds.connectJoint(value, key, pm=True) 

или

for name in locNameConnector: 
    cmds.connectJoint(locNameConnector[name][0], name, pm=True) 

теперь код вызова конкретные вещи в Maya, но мой вопрос, какой путь является более правильным? Я чувствую себя первым, потому что он использует власть Питона, а второй - на любом языке. Есть ли более правильный путь? Быстрее, чем другой?

+0

Отступ недействителен, когда я вставил его, но вы все еще понимаете. –

+0

Индентор ненавидит вкладки, я просто заменил их пробелами – msw

+1

Два кода не эквивалентны, и первый, безусловно, неверен ('значение' присваивается в цикле' for', а затем перезаписывается сразу же после этого). – Philipp

ответ

5

Одна из философий Python является:

Там должен быть один - и желательно только один - очевидный способ сделать это.

(Вы можете увидеть список этих - известный как дзен Python - делая import this в оболочке Python.)

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

Что касается ваших реальных примеров, они не кажутся эквивалентными - первый один смотрит вверх value в l_LegJointConnectors, второй выглядит это в locNameConnector. Эта вторая строка в первом примере должна быть там? Если нет, то первый из них, безусловно, более Pythonic, чем второй.

+0

Благодарим вас за указание на ошибку в именовании. Это было неправильно. –

+0

Благодарим вас за указание на ошибку в именовании, а также на то, что я могу удалить эту вторую строку. :) Определенно, все еще ступаю по воде с Python, но мне это очень нравится. –

0

Я следую принципалу «Все, что работает, хорошо». Запрашивая себя - каким образом мне будет присваивать мне/мой код/​​приложение лучше всего.
Но программисты hardcore-python очень разозлились, если видят какой-либо код python, который не является «pythonic». Хорошим показателем для этого является here.

+0

Я понимаю, откуда вы пришли. Я просто хочу убедиться, что если я использую конкретный язык для определенной цели, я делаю это наилучшим образом, что может предложить язык. :) Спасибо за ссылку тоже. Очень интересно читать (с примерами, которые я сам использую, которые не являются питоническими, но я скоро это изменил). :) –

1

Существует, как правило, более одного способа, который соответствует спецификации, но часто только один правильный путь. Это на самом деле центральный принцип проектирования Python (в отличие от, скажем, Perl). В вашем примере, когда вам нужны пары ключ-значение, а не только ключи или только значения, используйте iteritems.

0

Ваш вопрос довольно расплывчатый. Это определенно зависит от того, что вы хотите сделать, но редко бывает только один способ сделать что-то вообще и то же самое применимо к python. Есть способы делать то, что люди называли бы pythonic, хотя это субъективно и зависит от того, кто смотрит на код. Прочитайте zen of python от Тима Петерса знаменитой питонисты и автора timsort в стандартной библиотеке, чтобы получить представление о хороших способах написания кода на Python.

Смежные вопросы