无法将函数的输出保存到列表或字符串中,函数如何在Python中返回多个值

问题描述 投票:0回答:2

我创建了一个函数,将语法特征返回到一组单词:

import nltk.tokenize
from io import StringIO

def get_pos_tag(string):
    detM =['un','le']
    nomM =['garçon','verre','chair']

    #Entréé
    test = nltk.word_tokenize(string)

    #Pos-Tag de chaque entréé
    for i in range(0,len(test)):

       #Déterminant masculin singulier
       if test[i] in detM:
           CAT = "Det"
           Nb = "Sg"
           GND = "M"
           return(test[i],":","CAT:",CAT,",","Genre:",GND,",","Nombre:",Nb)
      #Nom Masculin Singulier
      elif test[i] in nomM:
           CAT = "N"
           Nb = "Sg"
           GND = "M"
           return(test[i],":","CAT:",CAT,",","Genre:",GND,",","Nombre:",Nb)

现在在另一个脚本中,当我想将函数的输出保存到字符串或列表时,这就是我得到的:

>>>import PosTag
>>> var1=PosTag.get_pos_tag("un garçon")
un : CAT: Det , Genre: M , Nombre: Sg
garçon : CAT: N , Genre: M , Nombre: Sg
>>> print (var1)
None
>>> var2=[]
>>> var2.append(PosTag.get_pos_tag("un garçon"))
un : CAT: Det , Genre: M , Nombre: Sg
garçon : CAT: N , Genre: M , Nombre: Sg
>>> print(var2)
[None]

我需要将结果存储在变量中以便下次使用它。

python python-3.x function output
2个回答
1
投票

也许您正在寻找yield关键字。收益率实质上将您的函数转换为一个生成器,该函数将保持返回值,直到您到达终点。

def get_pos_tag(string):
    detM =['un','le']
    nomM =['garçon','verre','chair']

    #Entréé
    test = nltk.word_tokenize(string)

    #Pos-Tag de chaque entréé
    for i in range(0,len(test)):

       #Déterminant masculin singulier
       if test[i] in detM:
           CAT = "Det"
           Nb = "Sg"
           GND = "M"
           yield test[i],":","CAT:",CAT,",","Genre:",GND,",","Nombre:",Nb

       #Nom Masculin Singulier
       elif test[i] in nomM:
           CAT = "N"
           Nb = "Sg"
           GND = "M"
           yield test[i],":","CAT:",CAT,",","Genre:",GND,",","Nombre:",Nb

您可以对此进行迭代,或将其直接转换为列表:

for val in get_pos_tag(string):
    print(val)

# or

print(list(get_pos_tag(string)))

此外,文件末尾的return get_pos_tag(string)(在所有其他函数之外)实际上并没有做任何事情(我不确定它是否有效)。


问题澄清旧答案:

这是因为你没有从get_pos_tag()中返回任何东西,只是调用printprint()函数不会传输任何值,只是显示它们。

无论你有print()功能,用return替换它。


2
投票

任务的正确数据结构不是字符串列表,而是字典字典。

def get_pos_tag(s):

    def d(e):
        if e in ['un','le']:
            return {'CAT':'Det', 'Genre':'M', 'Nombre':'Sg'}
        if e in ['garçon','verre','chair']:
            return {'CAT':'N', 'Genre':'M', 'Nombre':'Sg'}

    return {entréé:d(entréé) for entréé in s.split()}

作为使用示例:

d = get_pos_tag("un garçon")

for k in d:
    print(k, d[k])

产量

un {'CAT': 'Det', 'Genre': 'M', 'Nombre': 'Sg'}
garçon {'CAT': 'N', 'Genre': 'M', 'Nombre': 'Sg'}

print(d['un']['Genre'])

产量

M

ps - 为了测试我的解决方案,我用nltk.word_tokenize替换了s.split(我没有安装)。

© www.soinside.com 2019 - 2024. All rights reserved.