2015-11-05 14 views
0

我需要定义一个函数,其中一个名字取及其缩写都是这种格式返回返回缩写功能,在单行

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> 
+1

像'回报intials添加一个显式的'list'(列表(缩写) )'或者把'[]'括号放在你的列表解析中而不是'()'中,然后调用'''.join(initials)'返回一个字符串,而不是一个列表 –

回答

1

当你说,它initials = (letter [0].upper() for letter in names) evaluat最终产生所有首字母的迭代器。要明确地制作一个字符串,请使用''.join(letter[0].upper() for letter in names)

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 
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迭代生成器。

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