Проблема получения переменной из функции - PullRequest
0 голосов
/ 07 апреля 2020

Stackoverflow, привет.

Мне нужно взять переменную (список) из моей функции. Однако я не могу этого сделать, и в результате получается пустой [], несмотря на то, что у меня точно такой же процесс для другой функции, и я МОГУ получить оттуда переменную.

Код:

 cook_book={}
dishnumber=[]
dishnames_string = []
ingridient_names_final=[]
ingridient_quantity=[]
ingridient_measure=[]
ingridient_names = []

def dishnumbersearch():
    with open ('recipes.txt') as f:
        for line in f:
            line = line.strip()
            # print (line)
            line2=line.split()
            try:
                a=int(list(line2[0])[0])
                dishnumber.append(a)
            except ValueError:
                pass
            except IndexError:
                pass
            except ValueError:
                pass

dishnumbersearch()

def namesearch():
    with open ('recipes.txt') as f:
        dishnames = []
        for line in f:
            line = line.strip()
            # print (line)
            line2=line.split()
            if len(line2) <= 3:
                pass
                try:
                    a=(int(line2[0])/1)
                except IndexError:
                    pass
                except ValueError:
                    dishnames.append(line2)
        for i in dishnames:
            if len(i) > 1:
                j=' '.join(i)
            else:
                j = str(i[0])
            dishnames_string.append(j)

namesearch()

def search_ingridientsnames():
    with open('recipes.txt') as f:
        for line in f:
            line = line.strip()
            # print (line)
            line2 = line.split()
            try:
                i=0
                if len(line2) > 3 or len(line2)<1:
                    ingridient_names.append(line2[0])
            except IndexError:
                ingridient_names.append('_')
    from itertools import groupby
    ingridient_names_final=[list(g) for k, g in groupby(ingridient_names, key=lambda i: i != '_') if k]
    print(ingridient_names_final)

search_ingridientsnames()

print(dishnames_string)
print (ingridient_names_final)

Результат:

[['Egg', 'Milk', 'Tomato'], ['Duck', 'Water', 'Honey', 'Soy'], ['Potato', 'Garlic', 'Gouda'], ['Beef', 'Sweet', 'Pita', 'Wine', 'Tomato']]
['Omelette', 'Peking Duck', 'Baked potato', 'Fajitos']
[]

Итак, вы видите, в первом случае print(dishnames_string) Я могу взять переменную из функции, во втором случае print (ingridient_names_final) переменная может быть получена только ВНУТРИ функция.

PS Кстати, если я удаляю print (ingridient_names_final) внутри функции - тоже пустые скобки.

'recipes.txt' здесь:

Omelette
3
Egg | 2 | PCS
Milk | 100 | ml
Tomato | 2 | PCS

Peking Duck
4
Duck | 1 | PCS
Water | 2 | l
Honey | 3 | tbsp
Soy sauce | 60 | ml

Baked potato
3
Potato | 1 | kg
Garlic | 3 | cog
Gouda cheese | 100 | g

Fajitos
5
Beef | 500 | g
Sweet pepper | 1 | PCS
Pita bread | 2 | PCS
Wine Vinegar | 1 | tbsp
Tomato | 2 | PCS

1 Ответ

1 голос
/ 07 апреля 2020

Всякий раз, когда вы хотите переназначить глобальную переменную внутри функции, вам нужно определить ее локально, используя ключевое слово global.

def search_ingridientsnames():
    global ingridient_names_final
    with open('recipes.txt') as f:
        # process data
    from itertools import groupby
    ingridient_names_final=[list(g) for k, g in groupby(ingridient_names, key=lambda i: i != '_') if k]
...