Форум сайта python.su
0
Выходит ошибка, почему понять не могу
def size():
result = 'n'
path = 'back_up/config.xml'
bsize = os.path.getsize(path)
path = 'ideal/config.xml'
isize = os.path.getsize(path)
path = 'config.xml'
csize = os.path.getsize(path)
if bsize == 0:
result = 'b'
else:
result = 'n'
if isize == 0:
result = result + 'i'
else:
result = result + 'n'
if csize == 0:
result = result + 'c'
else:
result = result + 'n'
return(result)
print result
Traceback (most recent call last):
File "/home/nikola/wingwork0.4/wingwork_isp.py", line 45, in <module>
print result
NameError: name 'result' is not defined
Офлайн
857
result - локальная переменная
def size(p1, p2, p3):
result = ''
result += ('n', 'b')[os.path.getsize(p1) != 0]
result += ('n', 'i')[os.path.getsize(p2) != 0]
result += ('n', 'c')[os.path.getsize(p3) != 0]
return result
res = size('back_up/config.xml', 'ideal/config.xml', 'config.xml')
print resОтредактировано (Дек. 31, 2011 10:21:23)
Офлайн
0
Почему это работает?
def here():
nota = 0
path = 'back_up/config.xml'
if os.path.exists(path):
nota = 1
else:
nota = 0
path = 'config.xml'
if os.path.exists(path):
nota = nota + 2
else:
nota = nota + 0
return(nota)
Офлайн
20
В первом сообщении result объявлена внутри метода. Это локальная переменная, ее область видимости - метод. За пределами метода ее не существует.
В последнем сообщении все переменные объявлены и используются только в пределах метода.
Офлайн
0
То есть, если я во второй функции объявлю все переменные до тела функции и запишу их во входящие данные,то я смогу пользоваться значением, которое возвращает функция?
Офлайн
20
Такая переменная будет глобальной. Чтобы питон понял, что это именно глобальная переменная, объявленная за пределами метода, а не новая локальная с тем же именем, нужно использовать модификатор global:
result = ''
def size():
global result
result = 'some result to return' # результат можно даже не возвращать
def size():
result = ''
result = 'some result to return'
return result
result = size()
print(result)
Отредактировано (Дек. 31, 2011 16:46:49)
Офлайн
857
xxnikolayxxэто то же самое, оно точно так же не будет ничего делать с переменной, созданной вне функции
Почему это работает?
Офлайн
0
py.user.nextЕсли не написать в функцииxxnikolayxxэто то же самое, оно точно так же не будет ничего делать с переменной, созданной вне функции
Почему это работает?
если nota создать до вызова функции или после вызова функции, то nota вне функции будет одной переменной, а nota внутри функции будет другой переменной (две разные переменные с одинаковыми именами)
Soteric
global result
SotericТак где мне определять переменные вторичные - доноры для расчетов и прочих?
def size():
result = ‘'
result = ’some result to return'
return result
result = size()
print(result)
xxnikolayxxДанные переменные я могу получить не находясь в функции простым
path = ‘back_up/config.xml’
bsize = os.path.getsize(path)
path = ‘ideal/config.xml’
isize = os.path.getsize(path)
path = ‘config.xml’
csize = os.path.getsize(path)
Отредактировано (Янв. 1, 2012 12:15:06)
Офлайн
20
По всей видимости эти переменные были объявлены вне функции. Лучше постить код целиком, вместе с print и результатом вывода. Сейчас непонятно как это происходит.
Переменные нужно определять там где они нужны. Если они нужны только внутри функции, то внутри функции. Если за пределами, то соответственно вне функции. Если функции требуются какие-то переменные, вычисляемые в других функциях, то, как вы правильно заметили, их необходимо передавать в качестве аргументов на вход функции. В идеальном функциональном программировании не должно быть глобальных переменных, а вся логика программы это цепочка преобразований входных параметров в выходные. То есть функция должна быть самодостаточным кусочком программы, которая может получить все необходимые ей данные либо из входных параметров, либо посредством вызова других функций.
В объектно-ориентированном программировании действует другая парадигма. У объекта (экземпляра класса) есть состояние, т.е. некоторый набор как бы глобальных для этого объекта переменных (полей), который используется и может быть изменен внутри методов (набора функций) класса. В них вы можете сохранять свои промежуточные вычисления, а вся логика программы сведется к взаимодействию объектов и их взаимного изменения состояний.
Насколько я вижу, вы, по всей видимости неосознанно, пытаетесь скрестить две парадигмы: ограничиться только использованием функций и одновременно хранить состояние. За основу лучше все-таки принять что-то одно. Либо ООП и классы, либо осознать что можно обойтись без глобальных переменных и использовать их только там где это действительно необходимо.
Отредактировано (Янв. 1, 2012 13:09:41)
Офлайн
0
Очень приятная информация, спасибо.
SotericЯ завтра домой приду, выложу всю программу.
По всей видимости эти переменные были объявлены вне функции. Лучше постить код целиком, вместе с print и результатом вывода. Сейчас непонятно как это происходит.
Переменные нужно определять там где они нужны. Если они нужны только внутри функции, то внутри функции. Если за пределами, то соответственно вне функции. Если функции требуются какие-то переменные, вычисляемые в других функциях, то, как вы правильно заметили, их необходимо передавать в качестве аргументов на вход функции. В идеальном функциональном программировании не должно быть глобальных переменных, а вся логика программы это цепочка преобразований входных параметров в выходные. То есть функция должна быть самодостаточным кусочком программы, которая может получить все необходимые ей данные либо из входных параметров, либо посредством вызова других функций.
В объектно-ориентированном программировании действует другая парадигма. У объекта (экземпляра класса) есть состояние, т.е. некоторый набор как бы глобальных для этого объекта переменных (полей), который используется и может быть изменен внутри методов (набора функций) класса. В них вы можете сохранять свои промежуточные вычисления, а вся логика программы сведется к взаимодействию объектов и их взаимного изменения состояний.
Насколько я вижу, вы, по всей видимости неосознанно, пытаетесь скрестить две парадигмы: ограничиться только использованием функций и одновременно хранить состояние. За основу лучше все-таки принять что-то одно. Либо ООП и классы, либо осознать что можно обойтись без глобальных переменных и использовать их только там где это действительно необходимо.
Soteric
Лучше постить код целиком, вместе с print и результатом вывода.
Офлайн