我的教授向班级展示了一些我们可以用来显示名字缩写的代码,但她从未解释过它的工作原理。教科书也没有多大帮助。我只对第二行感到困惑。这不是作业;我只是想知道是什么让它显示字符串中的第一个字母。
userName = input("Enter your name: ")
initials = '.'.join(name[0].upper() for name in userName.split())
print(initials)
答案 0 :(得分:1)
userName = input("Enter your name: ")
首先,userName是一个字符串,例如我的名字: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]
在k
循环中为for
,然后.upper()
将其转换为K
并将其保存到列表中(实际上它是一个生成器)。
在第二个循环中,我们得到G
。
然后,'.'.join
给出K.G
。有关详细信息,请查看有关str.join()
和generator comprehension。
答案 1 :(得分: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."
以获得最后一段时间(@Entity
public class Cat {
@Column(name = "OWNER_ID")
private Long ownerId;
@ManyToOne
@JoinColumn(name = "OWNER_ID", insertable = false, updatable = false)
private Owner owner;
}
)。
答案 2 :(得分:1)
让我们把它拆开:
initials = '.'.join(name[0].upper() for name in userName.split())
这里有一个内环,for name in userName.split()
。这会将userName中的字符串拆分为块或name
s。 split()的文档说:
返回字符串s的单词列表。如果是可选的第二个 参数sep不存在或None,单词由任意分隔 空格字符串(空格,制表符,换行符,返回, 换页)。
因此,如果字符串包含空格,它将按预期分割字符串。 "my lastname"
将被分为["my", "lastname"]
列表。此列表将成为for
循环中的名称列表。在这种情况下,name
将成为"my"
和"lastname"
的值。
接下来,我们有神秘的功能name[0].upper()
。这适用于name
循环中for
的每个值。第一部分name[0]
获取name
中字符串的第一个字符。第二部分.upper()
将第一个字符(实际上是一个字符的字符串)转换为大写字符。这与上面相同的文档中描述。
继续我们的示例,name[0].upper()
获取两个字符串"my"
和"lastname"
,从每个字符串中取出第一个字母并将其转换为大写:"M"
和{{1 }}。结果列表为"L"
。
最后,["M", "L"]
表达式获取'.'.join()
内的列表,并使用join()
字符将它们连接在一起。在这种情况下,结果为'.'
。