Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 12, 2010 13:42:26

evilempirer
От:
Зарегистрирован: 2010-06-07
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Области видимости, функции, помогите

Задача: Есть функция в которой данные которые пользователь вводит с клавиатуры (строка), данная строка потом переделывается в список и вот это список уже будет использоваться много раз, то есть он необходим многим функциям.
Пример:

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



Офлайн

#2 Сен. 12, 2010 14:29:57

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Области видимости, функции, помогите

Откройте для себя передачу параметров в функцию.



Офлайн

#3 Сен. 12, 2010 14:42:34

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Области видимости, функции, помогите

как это нету ?

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()
но это плохой стиль программирования



Офлайн

#4 Сен. 12, 2010 16:26:10

evilempirer
От:
Зарегистрирован: 2010-06-07
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Области видимости, функции, помогите

2 sp3:
Спасибо, то что нужно. Но раз это плохой стиль, как сделать нормально, у Лутца читал про фабрики при помощи их?



Офлайн

#5 Сен. 12, 2010 17:42:03

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Области видимости, функции, помогите

все очень просто

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 и откуда она взялась



Отредактировано (Сен. 12, 2010 17:42:35)

Офлайн

#6 Сен. 12, 2010 18:37:18

evilempirer
От:
Зарегистрирован: 2010-06-07
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Области видимости, функции, помогите

Не понял смысл примера. Функция main вызывает input дальше пользовательский ввод и передача объекта в функцию foo который его печатает. Но как сохранить значение data, если у меня 10 функции и всем им нужен список data, кроме как глобальной переменной ? Судя по твоему примеру каждый раз надо вызывать raw_input.
НО все равно огромное спасибо данный пример натолкнул на другую идею =)



Отредактировано (Сен. 12, 2010 18:55:27)

Офлайн

#7 Сен. 12, 2010 19:00:30

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Области видимости, функции, помогите

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 для многоуровневых.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version