【问题标题】:For loop function that returns f-string返回 f 字符串的 for 循环函数
【发布时间】:2019-07-11 02:11:22
【问题描述】:

我是 python 新手,正在尝试编写一个函数,该函数接受一个字典列表并返回一个新的字符串列表,其中每个字典中的名字和姓氏键连接在一起。

names = [{'first': 'John', 'last': 'Smith'}, {'first': 'Jessie', 'last': 'Snow'}]


 def name_function(lst):     
     for name in lst:       
         return f"{name['first']} {name['last']}" 

 names_function(names)
 'John Smith'

我编写了一个 for 循环,它遍历字典列表并返回一个 f 字符串,该字符串连接每个字典中的名字和姓氏键,但是,循环无法迭代超过第一个键,我希望有人可以指出我的问题。

【问题讨论】:

  • a return 立即退出函数并返回值。您需要将字符串存储在列表中,并在最后返回列表。 (或选择其他替代品,例如产量)
  • 因为你return在第一次迭代中。
  • 只是return [f"{name['first']} {name['last']}" for name in lst] 没有循环。

标签: python for-loop f-string


【解决方案1】:

虽然您有一个循环,但循环内还有一个return。在列表的第一次迭代中,return 将被命中,函数的执行将在此处停止,仅返回该行上的值(即字符串),而不是预期的列表。

您要么需要在函数中添加一个列表以用作累加器,然后再返回 —

def names_function(lst):  
    names = []      
    for name in lst:       
        names.append(f"{name['first']} {name['last']}")
    return names   

或者使用列表推导

def names_function(lst):  
    return [f"{name['first']} {name['last']}" for name in lst]

names_function(names)

两者都会输出

['John Smith', 'Jessie Snow']

您还可以将 return 替换为 yield 以将其变成生成器。要获取您需要迭代生成器的所有值(或在其上调用 list

def names_function(lst):     
    for name in lst:       
        yield f"{name['first']} {name['last']}" 

list(names_function(names))

结果相同

['John Smith', 'Jessie Snow']

【讨论】:

    【解决方案2】:

    如果你想得到所有的名字:

    def names_function(lst):
        ret=""
        for name in lst:
            ret += f"{name['first']} {name['last']}\n"
        return ret
    

    def names_function(lst):
        return [f"{name['first']} {name['last']}" for name in lst]
    

    如果你想创建一个生成器对象:

    def names_function(lst):
        return (f"{name['first']} {name['last']}" for name in lst)
    

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 2020-03-30
      • 2019-02-20
      • 2022-01-18
      • 1970-01-01
      • 2015-01-15
      • 2021-01-06
      • 2021-12-03
      • 2020-12-25
      相关资源
      最近更新 更多