【问题标题】:Return single variable (not list) multiple times to function from second function?多次返回单个变量(不是列表)以从第二个函数中运行?
【发布时间】:2019-07-21 21:53:54
【问题描述】:

我有第一个无法修改或更改的功能!它显示变量的值(main_index 字段不能是列表、元组、字典等。它很简单,只是一个变量,必须保持原样)

该函数触发第二个函数,该函数可以返回多个值,因此我们的想法是以某种方式一一显示这些多个值,但不将它们放入列表或字典中。等等。可以以任何方式更改第二个功能。

代码如下(请注意第一个函数不能以任何方式修改,我这里只是简化一下)。

def not_changeable():
    value_to_check='7.1'
    main_index=generate_index(value_to_check)
    print (main_index)

def generate_index(index):
    dictionary={'7.1.1':{'value':'1'},'7.1.2':{'value':'2'},'7.100.3':{'value':'3'}}
    filtered_dict={}
    concatanatedIndex=index+'.'
    for k in dictionary.keys():
        if concatanatedIndex in k:
            filtered_dict[k]=dictionary[k]
    print (filtered_dict)
    for indx in filtered_dict:
        return (filtered_dict.get(indx).get('value'))

not_changeable()

作为输出,我得到一个值(因为返回函数结束了脚本)

{'7.1.1': {'value': '1'}, '7.1.2': {'value': '2'}}
1

但我想获得价值

1
2

对第一个函数没有任何修改。

我知道,如果我返回列表,我将能够显示所有值,但是是否可以在不修改第一个函数的情况下显示 1 和 2?

【问题讨论】:

  • not_changeable 不会“给”你任何东西;它打印一个字符串。它对generate_index 进行one 调用,因此您将获得one 值,该值将由print 调用其__str__ 方法。

标签: python python-3.x return


【解决方案1】:

在 for 循环中返回通常不是您想要的,最好在循环中构建数据结构然后稍后返回,或者返回整个数据结构,因为它是在理解中构建的。在这里,您可以返回带有换行符的字符串而不是值,如下所示:

def generate_index(index):
    dictionary={'7.1.1':{'value':'1'},'7.1.2':{'value':'2'},'7.100.3':{'value':'3'}}
    filtered_dict={}
    concatanatedIndex=index+'.'
    for k in dictionary.keys():
        if concatanatedIndex in k:
            filtered_dict[k]=dictionary[k]
    print (filtered_dict)
    return '\n'.join(sorted(filtered_dict.get(indx).get('value') for indx in filtered_dict))

这将打印出来

{'7.1.2': {'value': '2'}, '7.1.1': {'value': '1'}}
1
2

最后一条语句的分解:'\n'.join(sorted(filtered_dict.get(indx).get('value') for indx in filtered_dict)):

  • 我们使用推导式来生成我们感兴趣的数据:filtered_dict.get(indx).get('value') for indx in filtered_dict - 这实际上是一个生成器推导式,但您可以输入 [] 使其成为列表推导式。
  • 因为我们正在遍历字典,并且字典不能保证按特定顺序排列(尽管我相信这在 Python 3.6 中有所改变),所以我添加了 sorted 调用以确保 1 出现在 @ 之前987654328@.
  • 要将可迭代对象(如列表)转换为字符串,我们可以使用字符串方法.join(),它通过将列表中的元素连接在一起并将字符串放在每个元素之间来创建字符串。所以'-hello-'.join(['a', 'b', 'c']) 会变成'a-hello-b-hello-c'

实际上,构建返回字符串的更简单方法是迭代 dict.values() 而不是实际的 dict。如果我们使用 python 版本 > 3.6,我们可以跳过 sorted 调用,因此返回简单地变为:return '\n'.join(v.get('value') for v in filtered_dict.values())

但更好的设计可能是返回字典中的值,并在一个单独的函数中以特定格式打印它们,该函数只负责显示。

【讨论】:

  • 但我仍然很困惑这是如何工作的 :-) 您能否提供额外的解释? “在这里你可以返回一个带有换行符而不是值的字符串”你能解释一下你为什么要输入换行符'\n'并进行连接以及你为什么要进行排序?我真的很困惑
  • 我会添加一些解释:)
  • 干得好!我只是对您最后一行中“filtered_dict”中留下的所有内容感到困惑 :-) 真是太棒了
  • @bananfish 你能提供额外的解释吗
【解决方案2】:

您可以调整 generate_index 函数以返回一个生成器,也就是您可以迭代的东西(注意下面代码中的最后一行)。

您可以阅读生成器here 或查看documentation

    dictionary={'7.1.1':{'value':'1'},'7.1.2':{'value':'2'},'7.100.3':{'value':'3'}}
    filtered_dict={}
    concatanatedIndex=index+'.'
    for k in dictionary.keys():
        if concatanatedIndex in k:
            filtered_dict[k]=dictionary[k]
    print (filtered_dict)
    for indx in filtered_dict:
        # change from return to yield here to create a generator
        yield filtered_dict.get(indx).get('value')

请注意,通过调用此generate_index,您已经在为生成器开枪了!然后你可以像这样在你的其他函数中调用结果:

main_index=generate_index(value_to_check)
for index in main_index:
    print(index)

希望这是你想要的

【讨论】:

  • 我提到我无法更改第一个功能。不幸的是,您的代码不起作用,因为我收到 not_changeable() ^ SyntaxError: invalid syntax
猜你喜欢
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2020-09-02
相关资源
最近更新 更多