我需要定义一个函数,其中采用名称并以此格式返回其首字母
assert initials('John Smith') == 'JS'
assert initials('Jason Ralph Jacobs') == 'JRJ'
到目前为止,我有这个......
def initials(name: str):
names = name.split()
initials = (letter [0].upper() for letter in names)
return(initials)
但我在运行时不断收到此消息
initials('John Smith')<generator object initials.<locals>.<genexpr> at 0x000000000349F620>
答案 0 :(得分:1)
当你说,initials = (letter [0].upper() for letter in names)
它会评估一个最终会产生所有首字母的迭代器。要明确地从中创建一个字符串,请使用''.join(letter[0].upper() for letter in names)
。
答案 1 :(得分:1)
你得到这个的原因是因为你实际上是用这种语法创建generator expression(特别是括号):
(letter [0].upper() for letter in names)
这也不正确。如果您迭代返回的内容,您将获得数据。
但是,如果您只想获得一个列表,请将表达式更改为:
[letter [0].upper() for letter in names]
按原样运行代码并迭代结果:
J
S
现在,看到您可能希望将其作为字符串返回,那么您可能希望在函数中执行以下操作:
如果您想使用列表:
''.join([letter [0].upper() for letter in names])
或者使用生成器表达式,同样的事情:
''.join((letter [0].upper() for letter in names))
输出结果为:
JS
答案 2 :(得分:0)
喜欢这个
def initials(name):
return ''.join(letter[0].upper() for letter in name.split())
assert initials('John Smith') == 'JS'
assert initials('Jason Ralph Jacobs') == 'JRJ'
您返回的是生成器表达式对象,必须对其进行迭代才能生成结果。这可以通过将其传递给list
来实现。
由于您需要字符串而不是列表,因此您只需使用join
来迭代生成器。
答案 3 :(得分:0)
我的意思是什么意思:
def initials(name: str):
names = name.split()
initials = ''.join(letter [0].upper() for letter in names)
return(initials)
或:
def initials(name: str):
names = name.split()
initials = (letter [0].upper() for letter in names)
return(''.join(initials))
或:
def initials(name: str):
names = name.split()
initials = [letter [0].upper() for letter in names]
return(''.join(initials))
他们都做同样的事情。
您获得输入的原因是,如果您使用()
括号进行列表理解,实际上您会获得generator object
而非列表,因此在您打印时,repr()
在生成器上调用,这就是它输出的内容。
您还需要更进一步,然后将生成器/列表转换回字符串,这就是''.join
做什么