2015-11-05 55 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