Форум сайта python.su
0
Снова прошу у вас помощи , уважаемые форумчане.
У меня возникли сложности с пониманием пространства имен. Если быть точнее, то я понимаю теорию- глобальные \локальные переменные и области видимости и их взаимодействия ( то есть как из функции вызвать, например, глобальную переменную и её переназначить и\или использовать ) .если они будут заданы
например
a=1 def test(): a=2 def test_2(): a=3 print a def test_global(): global a a='global' test_2() test_global() print a print a test() print a
add global a create foo global add foo b get foo a get foo c create bar foo add bar a get bar a get bar b
[code python]
a=1
def foo()
b=2
def bar()
a=3
[/code]
- 9 - add global a - create foo global - add foo b - get foo a - get foo c - create bar foo - add bar a - get bar a - get bar b
import yaml import Queue q = Queue.Queue() spisok=yaml.load(open("b.yaml")) for i in spisok: q.put(i) l=0 #a=0 #b=0 #c=0 def add_fun (): if spase == 'global': global arg arg print spase else: arg print arg def create_fun (): if arg == 'global': global spase spase print spase else: spase print spase def get_fun (): pass k = q.get() while l < k: do, spase, arg = q.get().split() l=l+1 if do == 'add': add_fun() elif do == 'create': create_fun () elif do == 'get': get_fun () else: print ('error end') break print('good end')
global foo b bar a good end
Офлайн
253
probnikВот вы придумали свои get add. По сути вы пытаетесь сочинить еще один язык программирования. Возникает вопрос зачем? Почему вы думаете что ваш язык будет лучше чем java c++ python?
а прошу направить в правильное русло
Отредактировано doza_and (Май 1, 2016 23:42:19)
Офлайн
0
doza_and огромное спасибо , что помогаешь !
doza_andНи в коем разе так не думаю. Делаю ошибки именно от незнания .
По сути вы пытаетесь сочинить еще один язык программирования. Возникает вопрос зачем?
doza_andпо большому счету всерьез решил выучить python а так что то где то когда то читал и по delphi и по с++, но это было давно и не успешно.
Вы какой язык уже знаете?
doza_andэто задача такая (на stepic.org выложили). дословно звучит так
Опишите подробнее задачу, так вообще непонятно откуда такие потребности могли возникнуть.
Реализуйте программу, которая будет эмулировать работу с пространствами имен. Необходимо реализовать поддержку создания пространств имен и добавление в них переменных. В данной задаче у каждого пространства имен есть уникальный текстовый идентификатор – его имя. Вашей программе на вход подаются следующие запросы: create <namespace> <parent> – создать новое пространство имен с именем <namespace> внутри пространства <parent> add <namespace> <var> – добавить в пространство <namespace> переменную <var> get <namespace> <var> – получить имя пространства, из которого будет взята переменная <var> при запросе из пространства <namespace>, или None, если такого пространства не существует Рассмотрим набор запросов add global a create foo global add foo b create bar foo add bar a Структура пространств имен описанная данными запросами будет эквивалентна структуре пространств имен, созданной при выполнении данного кода a = 0 def foo(): b = 1 def bar(): a = 2 В основном теле программы мы объявляем переменную a, тем самым добавляя ее в пространство global. Далее мы объявляем функцию foo, что влечет за собой создание локального для нее пространства имен внутри пространства global. В нашем случае, это описывается командой create foo global. Далее мы объявляем внутри функции foo функцию bar, тем самым создавая пространство bar внутри пространства foo, и добавляем в bar переменную a. Добавим запросы get к нашим запросам get foo a get foo c get bar a get bar b Представим как это могло бы выглядеть в коде a = 0 def foo(): b = 1 get(a) get(c) def bar(): a = 2 get(a) get(b) Результатом запроса get будет имя пространства, из которого будет взята нужная переменная. Например, результатом запроса get foo a будет global, потому что в пространстве foo не объявлена переменная a, но в пространстве global, внутри которого находится пространство foo, она объявлена. Аналогично, результатом запроса get bar b будет являться foo, а результатом работы get bar a будет являться bar. Результатом get foo c будет являться None, потому что ни в пространстве foo, ни в его внешнем пространстве global не была объявлена переменная с. Более формально, результатом работы get <namespace> <var> является <namespace>, если в пространстве <namespace> была объявлена переменная <var> get <parent> <var> – результат запроса к пространству, внутри которого было создано пространство <namespace>, если переменная не была объявлена None, если не существует <parent>, т. е. <namespace> – это global Формат входных данных В первой строке дано число n (1 ≤ n ≤ 100) – число запросов. В каждой из следующих n строк дано по одному запросу. Запросы выполняются в порядке, в котором они даны во входных данных. Имена пространства имен и имена переменных представляют из себя строки длины не более 10, состоящие из строчных латинских букв. Формат выходных данных Для каждого запроса get выведите в отдельной строке его результат. Sample Input: 9 add global a create foo global add foo b get foo a get foo c create bar foo add bar a get bar a get bar b Sample Output: global None bar foo
class nmspc(list): names = {"global": ["None"],"None":[]} def create(self, space, parent): self.names[parent].append(space) self.names[space] = [parent] def add(self, space, var): self.names[space].append(var) def get(self, space, var): if space == "None": return if var in self.names[space]: print(space) return elif self.names[space][0] != "None": self.get(self.names[space][0], var) return else: print("None") return a = nmspc() n = int(input()) for i in range(n): s = input().split() if s[0] == "add": a.add(s[1], s[2]) elif s[0] == "create": a.create(s[1], s[2]) else: a.get(s[1], s[2])
Отредактировано probnik (Май 2, 2016 00:37:14)
Офлайн
857
probnikА stepic тут при чём? Если хочешь выучить питон, возьми книжку по питону, где всё просто рассказывается и ты это запоминаешь.
по большому счету всерьез решил выучить python
Отредактировано py.user.next (Май 2, 2016 03:37:39)
Офлайн
0
Благодарю за внимание к моему вопросу py.user.next
py.user.nextЯ полностью с вами согласен , и я читаю книгу “Python на примерах. Практический курс по программированию”. Но я считаю хорошим тоном помимо чтения текста ещё и тестовые задания выполнять (не только из примеров, но и где нужно подумать самому), для лучшего усваивания материала, наработке набора текста, понимания логики программы. И плюс ко всему есть возможность ещё и видео уроки по пройденному материалу посмотреть, что эквивалентно получению материала от ещё одного автора. Повторение- мать учения.
Если хочешь выучить питон, возьми книжку по питону, где всё просто рассказывается и ты это запоминаешь.
Офлайн
24
Эти задания это все херня - берешь реальную проблему и пытаешься её решить. Просто ты тестовое задание вроде бы сделал, но по факту у тебя в голове практически ничего не отложилось, что-то типа студента - зазубрил, сдал, забыл. А когда ты решаешь реальную проблему, у тебя есть стимул и есть чувство удовлетворения от того, что ты решил проблему.
Офлайн
857
probnikРечь о том, что питон раз в десять проще этих заданий со stepic'а, поэтому за то же время можно изучить десяток понятий из питона. А сейчас ты сидишь и трахаешься с этим алгоритмом, который к питону никакого отношения не имеет. И ты думаешь, что это поможет тебе усвоить питон. Что ты собрался усваивать, если по питону ничего не читаешь?
Но я считаю хорошим тоном помимо чтения текста ещё и тестовые задания выполнять (не только из примеров, но и где нужно подумать самому)
Отредактировано py.user.next (Май 2, 2016 08:56:19)
Офлайн