2017-05-20 74 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