2015-11-07 142 views
0

我的教授向我们展示了一些我们可以用来显示名字首字母的代码,但是她从未解释过它是如何工作的。教科书也没有多大帮助。我只在第二行感到困惑。这不是作业;我只想知道是什么让它显示字符串中的第一个字母。
这个Python字符串代码是如何工作的?

userName = input("Enter your name: ") 
initials = '.'.join(name[0].upper() for name in userName.split()) 
print(initials) 
+0

第二行包含字符串索引,一个生成器表达式以及对'str.join','str.upper'和'str.split'的调用。这些是你不熟悉的东西吗? – senshin

+0

此代码是越野车;最后的首字母并不是一个句点。 – user2357112

回答

1

说出输入运行后的userName = "john paul jones"

然后userName.split()拆分空白名称' '的名称,返回一个由字符串“john”,“paul”,“jones”(按该顺序)组成的列表。

移到该该for name in userName.split()部分迭代 - 因此name依次势必"john"然后"paul"然后"jones"

name与例如"paul"表达式name[0]返回第一个字符(例如'p'),然后将其转向相应的大写(如果它不是大写)。最终的结果是发电机表达

(name[0].upper() for name in userName.split()) 

陆续返回字符串'J'然后'P'然后'J'(在我们的例子)。

最后,join需要一个字符串迭代并将它们连接在一起,使用作为分隔符是联接称为弦上 - 在这种情况下'.' - 认为这定界符当保持字符串可迭代的胶水一起。如此加入 - 最终结果为"J.P.J"

你的老师可能应该在表达式的末尾加上+'.'以得到最后一段时间("J.P.J.")。

+0

其实最后的结果是在这种情况下的J.P.J'。 –

+1

@KevinGuan谢谢。 –

1
userName = input("Enter your name: ") 

首先,用户名是一个字符串,例如我的名字:kevin guan。现在

'.'.join(name[0].upper() for name in userName.split()) 

name[0].upper() for name in userName.split()是发电机理解(它给发电机):

userName.split() 

给像['kevin', 'guan']列表。

name[0].upper() for name in ['Kevin', 'Guan'] 

你会得到['K', 'G'],因为name[0]是在第一fork,然后.upper()隐蔽它K并将其保存到列表(实际上它是一个生成)。 而在第二个循环中,我们得到了G

然后,'.'.join给出K.G。欲了解更多信息,请查看有关str.join()generator comprehension的文件。

1

让我们把它拆开:

initials = '.'.join(name[0].upper() for name in userName.split()) 

有一个内环这里,for name in userName.split()。这是将userName中的字符串拆分为块或name s。 split()的文档说:

返回字符串s的单词列表。如果可选的第二个 参数sep不存在或无,则这些单词由任意 字符串的空格字符(空格,制表符,换行符,返回, 换页符)分隔。

所以,如果字符串包含空格,它会按照您的预期拆分字符串。 "my lastname"将被分成列表["my", "lastname"]。该列表成为for循环中的名称列表。在这种情况下,name将成为值"my""lastname"。我们有神秘的功能name[0].upper()。这适用于来自for循环的每个值name。第一部分name[0]name中字符串的第一个字符。第二部分,.upper()将第一个字符(实际上是一个字符的字符串)转换为大写字符。这在上面的相同文档中有描述。

继续我们的例子,name[0].upper()需要两个字符串"my""lastname",从每一个需要的第一个字母,并将其转换为大写:"M""L"。结果列表是["M", "L"]

最后,'.'.join()表达式采用join()的内部列表,并使用'.'字符将它们连接在一起。在这种情况下,结果是"M.L"

相关问题