о сферах применения питона - PullRequest
0 голосов
/ 24 апреля 2011

Я читал об областях применения Python и просматривал вопросы здесь по stackoverflow, но есть кое-что, что я хотел бы уточнить.

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

x = 5
x += 1
print x

Есть ли разница между следующим рефакторингом приведенного выше кода:

def f(x):
  x += 1
  return x

x = 5
x = f(x)
print x

и:

def f():
  x++

x = 5
f()
print x

Если нет, то является ли один из способов более распространенным или предпочтительным в питоне?

Ответы [ 2 ]

3 голосов
/ 24 апреля 2011

Желательно не использовать глобальные переменные, если это не является абсолютно необходимым. Тем не менее, во втором примере вам нужно объявить global x, прежде чем ссылаться на x.

* 1006.* Итак, первый способ:
  • f принимает аргумент x
  • Приращения x
  • возвращает x + 1
  • на глобальный x это не влияет

Второй способ:

def f():
  global x
  x += 1

x = 1
f()
  • f не имеет аргументов
  • Увеличивает глобальное x

PS В Python нет оператора ++.x += 1 используется вместо

2 голосов
/ 24 апреля 2011

Я поднимаю вопрос по двум причинам:

1)

  • импорт нотации x ++ из других языков (C ++ и Java) - простительный грех; кто никогда не был рассеянным?
  • не тестирование кодов заслуживает отрицательного ответа, это правильно, потому что это означает, что не было проведено никаких тестов, чтобы попытаться получить определенное количество наблюдений, и это baaad
  • однако я считаю, что желание понять понятия, касающиеся областей, пространств имен, глобальных / локальных, более похвально, чем упреки, которые нужно упрекнуть

2)

Это, безусловно, является неудовлетворительной ситуацией, когда нужно опускать голос из-за приблизительного вопроса при получении ответа с опротестованным голосом, который, по моему мнению, содержит в себе некоторые неадекватные термины. Терминология особенно важна для субъектов, в которых могут возникать противоречивые дебаты и запутанные описания.

Например, для

def f(x): 
    x++ 
    return x
  • Я бы не сказал, что f получает аргумент x , но f получает x в качестве аргумента.
  • x не увеличивается; скорее: создается другой объект со значением, являющимся результатом приращения значения начального x

  • f не возвращает x + 1 , возвращает новый объект с увеличенным значением

РЕДАКТИРОВАТЬ 1

# f принимает аргумент x

В вызове f(x) я бы не сказал, что f получает аргумент x , потому что x не является аргументом в абсолютном , x «становится» аргументом только относительно функции в тот момент, когда он передается функции. Поэтому я скорее говорю, что в вызове f(x) функция f получает x AS аргумент.

Может случиться так, что один раз произнесет "аргумент Y" один раз, как преуменьшение для выражения "Y, рассматриваемый в момент, когда он передается в качестве аргумента функции" . Это занижение короче; но я думаю, что в точном объяснении такой простой способ выражения должен быть запрещен.

# Приращения x

Ссылаясь на код, написанный в вопросе (случай 1), это предложение неоднозначно из-за функции, записанной с параметром x : делает x обратитесь к x в функции или к x снаружи? Вы скажете, что я придирчив, но для новичка, который плохо знает модель данных и работу функций, вопрос верен. Что означает f(x) в Python? x передается по значению или по ссылке? Возможно, что операции внутри f могут изменить x снаружи, почему бы и нет, это именно то, что обсуждается, нет? Вот почему лучше присвоить параметру f другое имя, чем любое из имен внешних объектов; Я думаю так же, как и в предыдущем предложении: в точном объяснении следует использовать только осторожные предложения и коды, чтобы избежать неясностей:

def f(N):
    N += 1
    return N
x = 5
x = f(x)
print x

И следует пояснить, что инструкция N += 1 запускает создание нового объекта с увеличенным значением и что локальный идентификатор N восстанавливается для этого нового объекта. И в этот момент глобальный идентификатор x все еще привязан к тому же объекту, что и до вызова.

# возвращает x + 1

f не возвращает x + 1 , возвращает новый объект, недавно назначенный N с увеличенным значением

# глобальный x не затронут

Что это значит?До этого глобальное x имеет значение 5. После этого глобальное x имеет значение 6. Во время выполнения операций внутри f глобальное x не затрагивается, это верно: это только когда новый объект (фактически его адрес ..) возвращается за пределы f , и что выполнение x = f(x) выполняетсяэто глобальное x затронуто.Но это предложение "глобальный x не затронут" ставится после "возвращает x + 1" .Нет, правда, я ничего не понимаю в таких объяснениях.

Конец EDIT 1

.

.

Относительно второго случая

def f():
    global x 
    x += 1
  • Я предпочитаю сказать, что f не имеет аргумента, чем не имеет параметра
  • Это не увеличивает глобальное значение x , оно вызываетновое присвоение глобального идентификатора x новому объекту с увеличенным значением.

EDIT 2

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

def f():
    global x
    x += 1
x = 5
f()
print x

# f не имеет аргументов

Какого черта я написал «Я предпочитаю сказать, что у f нет аргумента, чем у него нет параметра» , чтобы прокомментировать это?Я все еще удивляюсь.Сначала я написал «Я предпочитаю сказать, что f не имеет параметра, чем не имеет аргумента» , думая об определении f .Я не знаю почему, я «исправил», изменив предложение, и результат ничего не говорит о том, что я думаю.Я полностью озадачен.

Точно, я думаю, что правильные способы выражения:

  • в определении функции, f -> HAS нет ПАРАМЕТРА,

  • в вызове f(), f -> ПОЛУЧАЕТ нет АРГУМЕНТОВ.

# Увеличивает глобальный x

Не увеличивает глобальный x , он вызывает новое назначениеглобальный идентификатор x для нового объекта с увеличенным значением.

Конец РЕДАКТИРОВАНИЯ 2

.

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

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

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