xxnikolayxx
Дек. 31, 2011 08:33:33
Выходит ошибка, почему понять не могу
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
py.user.next
Дек. 31, 2011 10:11:32
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
Soteric
Дек. 31, 2011 12:35:23
В первом сообщении result объявлена внутри метода. Это локальная переменная, ее область видимости - метод. За пределами метода ее не существует.
В последнем сообщении все переменные объявлены и используются только в пределах метода.
xxnikolayxx
Дек. 31, 2011 16:14:13
То есть, если я во второй функции объявлю все переменные до тела функции и запишу их во входящие данные,то я смогу пользоваться значением, которое возвращает функция?
Soteric
Дек. 31, 2011 16:44:05
Такая переменная будет глобальной. Чтобы питон понял, что это именно глобальная переменная, объявленная за пределами метода, а не новая локальная с тем же именем, нужно использовать модификатор 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)
py.user.next
Дек. 31, 2011 18:11:11
xxnikolayxx
Почему это работает?
это то же самое, оно точно так же не будет ничего делать с переменной, созданной вне функции
если nota создать до вызова функции или после вызова функции, то nota вне функции будет одной переменной, а nota внутри функции будет другой переменной (две разные переменные с одинаковыми именами)
xxnikolayxx
Янв. 1, 2012 12:13:22
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)
Данные переменные я могу получить не находясь в функции простым
print bsize
Как это понимать переменная же должна была умереть по завершении функции?
Soteric
Янв. 1, 2012 12:49:47
По всей видимости эти переменные были объявлены вне функции. Лучше постить код целиком, вместе с print и результатом вывода. Сейчас непонятно как это происходит.
Переменные нужно определять там где они нужны. Если они нужны только внутри функции, то внутри функции. Если за пределами, то соответственно вне функции. Если функции требуются какие-то переменные, вычисляемые в других функциях, то, как вы правильно заметили, их необходимо передавать в качестве аргументов на вход функции. В идеальном функциональном программировании не должно быть глобальных переменных, а вся логика программы это цепочка преобразований входных параметров в выходные. То есть функция должна быть самодостаточным кусочком программы, которая может получить все необходимые ей данные либо из входных параметров, либо посредством вызова других функций.
В объектно-ориентированном программировании действует другая парадигма. У объекта (экземпляра класса) есть состояние, т.е. некоторый набор как бы глобальных для этого объекта переменных (полей), который используется и может быть изменен внутри методов (набора функций) класса. В них вы можете сохранять свои промежуточные вычисления, а вся логика программы сведется к взаимодействию объектов и их взаимного изменения состояний.
Насколько я вижу, вы, по всей видимости неосознанно, пытаетесь скрестить две парадигмы: ограничиться только использованием функций и одновременно хранить состояние. За основу лучше все-таки принять что-то одно. Либо ООП и классы, либо осознать что можно обойтись без глобальных переменных и использовать их только там где это действительно необходимо.
xxnikolayxx
Янв. 2, 2012 01:39:59
Очень приятная информация, спасибо.
Soteric
По всей видимости эти переменные были объявлены вне функции. Лучше постить код целиком, вместе с print и результатом вывода. Сейчас непонятно как это происходит.
Переменные нужно определять там где они нужны. Если они нужны только внутри функции, то внутри функции. Если за пределами, то соответственно вне функции. Если функции требуются какие-то переменные, вычисляемые в других функциях, то, как вы правильно заметили, их необходимо передавать в качестве аргументов на вход функции. В идеальном функциональном программировании не должно быть глобальных переменных, а вся логика программы это цепочка преобразований входных параметров в выходные. То есть функция должна быть самодостаточным кусочком программы, которая может получить все необходимые ей данные либо из входных параметров, либо посредством вызова других функций.
В объектно-ориентированном программировании действует другая парадигма. У объекта (экземпляра класса) есть состояние, т.е. некоторый набор как бы глобальных для этого объекта переменных (полей), который используется и может быть изменен внутри методов (набора функций) класса. В них вы можете сохранять свои промежуточные вычисления, а вся логика программы сведется к взаимодействию объектов и их взаимного изменения состояний.
Насколько я вижу, вы, по всей видимости неосознанно, пытаетесь скрестить две парадигмы: ограничиться только использованием функций и одновременно хранить состояние. За основу лучше все-таки принять что-то одно. Либо ООП и классы, либо осознать что можно обойтись без глобальных переменных и использовать их только там где это действительно необходимо.
Я завтра домой приду, выложу всю программу.
Soteric
Лучше постить код целиком, вместе с print и результатом вывода.