Найти - Пользователи
Полная версия: Области видимости, функции, помогите
Начало » Python для новичков » Области видимости, функции, помогите
1
evilempirer
Задача: Есть функция в которой данные которые пользователь вводит с клавиатуры (строка), данная строка потом переделывается в список и вот это список уже будет использоваться много раз, то есть он необходим многим функциям.
Пример:
def Input():
c = raw_input('Enter data1,data2: ')
data = c.split(',')
return data
Понятно что если я первый раз вызываю в какой то функции функцию Input, то пользователь вводит данные функция №2 их получает и все ок, но потом data нужна еще трем другим функциям, соотвественно каждый раз вводит данные пользователю не захочется.
В C++ есть переменные если не изменяет память global static, такая переменная живет весь цикл выполения программы и доступна из любой точки. Лутц говорит что такого в Питоне нет.
У Лутца как-то по этому поводу бессвязно, прочитал про фабрики, но так и не понял как пользовать, он еще предлагает в функции делать под функции, но как тогда вызывать? Или уже надо все это по классам распихивать, но я пишу не очень сложный скрипт для сис администрирования, залезать в классы больно не хочется.
Как поступить?
cutwater
Откройте для себя передачу параметров в функцию.
sp3
как это нету ?
def Input():
global data
c = raw_input('Enter data1,data2: ')
data = c.split(',')
return data

def foo():
print data

mydata = Input()
print mydata,data
foo()
но это плохой стиль программирования
evilempirer
2 sp3:
Спасибо, то что нужно. Но раз это плохой стиль, как сделать нормально, у Лутца читал про фабрики при помощи их?
sp3
все очень просто
def Input():
c = raw_input('Enter data1,data2: ')
data = c.split(',')
return data

def foo(data):
'''This function prints the argument'''
print data

def main():
mydata = Input()
foo(mydata)

if __name__ == '__main__':
main()
и если в будущем понадобится эта функция в другом проекте:
import modulename
print modulename.foo.__doc__ # смотрим нашу строчку документации: что делает эта функция
modulename.foo('trololo')
а если будете использовать глобальные переменные будет ошибка или неоднозначность: что это за переменная data и откуда она взялась
evilempirer
Не понял смысл примера. Функция main вызывает input дальше пользовательский ввод и передача объекта в функцию foo который его печатает. Но как сохранить значение data, если у меня 10 функции и всем им нужен список data, кроме как глобальной переменной ? Судя по твоему примеру каждый раз надо вызывать raw_input.
НО все равно огромное спасибо данный пример натолкнул на другую идею =)
sp3
def Input():
c = raw_input('Enter data1,data2: ')
data = c.split(',')
return data

def foo(data):
'''This function prints the argument'''
print data

def foo1(data):
'''This function prints the argument'''
print 'foo1:',data

def foo2(data):
'''This function prints the argument'''
print 'foo2:',data

def main():
mydata = Input()
foo(mydata)
foo1(mydata)
foo2(mydata)

if __name__ == '__main__':
main()
один нюанс: в питоне списки относятся к изменяемому типу, и если в какой нибудь функции вы его измените, то и на уровне выше список тоже изменится. Чтобы этого избежать вызывайте функцию с копией объекта foo(data) , для одноуровневых или с помощью модуля copy для многоуровневых.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB