2017-05-20 73 views
-1

我已經寫了一個簡單的程序,將採取字符串的第一個字母並將其大寫。理解列表vs for循環

def initials(text): 
    words = text.split() 
    a=[word[0].upper() for word in words] 
    b = '. '.join(a) + '.' 
    return b 
text = "have a good day sir" 

print(initials(text)) 

這會給我想要通過使用列表理解的結果。然而 我不能讓它通過一個典型的for循環下面工作,它會給我只有最後一次迭代:

def initials(text): 
    words = text.split() 
    for word in words: 
     a=word[0].upper() 
     b = '.'.join(a) + '.' 
    return b 
text = "have a good day sir" 

print(initials(text)) 

任何想法,爲什麼第二個示例不作爲第一個工作?

+0

因爲在你的第二個'initials'函數中,'b'中的每個單詞都會更新'b' ...你不會「跟蹤」前面的首字母。 – blacksite

+0

您需要將結果添加到新列表中,然後傳遞給'join' – pylang

+0

寫入'a + = word [0] .upper()'並採用語句'b ='。join(a)+'。 ''出於for循環 – phynfo

回答

2

b在第二種情況下每次在循環中都被重置。所以你只能得到最後的首字母,然後是.。相當於在for循環您的理解,應該是:

def initials(text): 
    words = text.split() 
    a = [] 
    for word in words: 
     a.append(word[0].upper()) 
    b = '.'.join(a) + '.' 
    return b 
+0

謝謝!!!!它的工作原理 – pythonic

1

你在每次循環迭代改寫灣嘗試:

def initials(text): 
    words = text.split() 
    for word in words: 
     a = word[0].upper() 
     b += '.'.join(a) + '.' 
    return b 
text = "have a good day sir" 
0

的問題是,str.join()需要串的迭代,但在你的第二個功能,您傳遞一個chararacter。您在循環內調用它的事實不會將其轉換爲字符列表。

你最簡單的方法是擺脫str.join()的,並使用一個簡單的字符串來積累的結果:

def initials(text): 
    words = text.split() 
    b = '' 
    for word in words: 
     a=word[0].upper() 
     b += a + '.' 
    return b 

如果您在使用str.join()堅持,你將需要一個列表來積累你的姓名縮寫:

def initials(text): 
    words = text.split() 
    b = [] 
    for word in words: 
     a=word[0].upper() 
     b.append(a) 
    return '.'.join(b) + '.' 
+0

在Python中沒有'char'類型的東西,只有長度爲1的字符串。 – augurar