在单行返回首字母的函数

时间:2015-11-05 23:01:33

标签: python python-3.x

我需要定义一个函数,其中采用名称并以此格式返回其首字母

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>

4 个答案:

答案 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做什么