使用 map() 函数进行迭代

iteration with map() function

我正在尝试使用 map() 函数并将列表中的所有单词大写。

my_pets = ['sisi', 'bibi', 'titi', 'carla']

def capitalizing(a):
    for item in a:
        b = item.upper()
        return b

print(list(map(capitalizing, my_pets)))

如果我运行这段代码,我得到如下输出:

['S', 'B', 'T', 'C']

这是为什么?为什么代码只是 运行 第一个字母并在每个单词处停止?

我已经知道“for” loop/iteration 获取所有单词是不正确的,我不需要它,但是为什么这个循环 运行s 每个单词的第一个字母单词?

提前感谢您的帮助。

return return 值和 退出函数 。通常你会想要使用 到 return 多个值,但你实际上根本不需要循环:

def capitalizing(a):
    return a.upper()

事实上,您甚至不需要 capitalizing,因为它只是 str.upper:

的包装器
>>> print(list(map(str.upper, my_pets)))
['SISI', 'BIBI', 'TITI', 'CARLA']

或者更好的是,改用列表理解:

>>> print([s.upper() for s in my_pets])
['SISI', 'BIBI', 'TITI', 'CARLA']

map 的作用是为您处理输入序列的迭代位,因此您提供给 map 的函数应该这样定义它只接受序列中的一个元素作为参数的方式。

按照 OP 中提供的方式,map 获取原始列表的每个元素(即名称)并依次将 capitalizing 应用于每个元素。但是,该函数在内部循环其参数(在本例中,参数是名称字符串中的字符)并且 return 是每个名称中第一个字符的大写字母。 (你能看出原因吗?)

正如其他人所建议的那样,有 simpler/cleaner 种方法可以实现这一点,但如果您想了解 map 的工作原理,请删除 for 循环并简单地 return a.upper().

更容易理解地图,

print(list(map(lambda s: s.upper(), ['sisi', 'bibi', 'titi', 'carla'])))

您将 return 放置在 for 循环内,导致它在第一次迭代后变为 return(在传递给大写的字符串的第一个字符上)。例如:
capitalizing('sisi')

for item in a:     # a = 'sisi'
  b = item.upper() # item = 's', b = 'S'
  return b         # b = 'S', return 'S' and exit function

代码可以写得更简洁一些,其他答案已经显示了。这段代码做事是多余的。

这是您的代码的固定版本,在 for 循环完成构建字符串之后 return,而不是在第一次迭代之后:

my_pets = ['sisi', 'bibi', 'titi', 'carla']

def capitalizing(a):
    b = ""
    for item in a:
        b += item.upper()
        # using return here will exit the function immediately after the first iteration
    return b # return after finishing

print(list(map(capitalizing, my_pets)))