【问题标题】:What is this piece of code doing, python这段代码在做什么,python
【发布时间】:2015-05-03 00:00:46
【问题描述】:

我正在自学python,我正在做一个练习,其解决方案已发布在this线程中。谁能把这段代码翻译成英文?当我学习 if 语句时,我从未遇到过这种语法。

 consonants = 'bcdfghjklmnpqrstvwxz'
 return ''.join(l + 'o' + l if l in consonants else l for l in s)

【问题讨论】:

  • 这基本上获取s 中的每个字符,并在ss 之间插入一个o。例如:cat -> cocatot不包括元音

标签: python if-statement


【解决方案1】:

这是一段较长的代码,编写为生成器。这就是它的样子,更加冗长。

consonants = 'bcdfghjklmnpqrstvwxz'

ls = []
for l in s:
    if l in consonants:
        ls.append(l + 'o' + l)
    else:
        ls.append(l)

return ''.join(ls)

它遍历s 并检查l 是否在字符串consonants 中。如果是,则将l + 'o' + l 推送到列表中,如果不是,则仅将l 推送到列表中。

然后使用''.join 将结果连接成一个字符串并返回。

更准确地说(作为生成器):

consonants = 'bcdfghjklmnpqrstvwxz'

def gencons(s):
    for l in s:
        if l in consonants:
            yield l + 'o' + l
        else:
            yield l

return ''.join(gencons(s))

gencons 只是我给生成器函数的任意名称。

【讨论】:

  • 一个重要的区别是它实际上并不创建或使用列表。它只是遍历 s 并产生这些新值。
  • 什么是辅音?它是一个告诉你一个字母是否是辅音的函数吗?
  • 这是您帖子中的一个字符串。 @Aeleon
  • 好的,所以这仍然没有意义。在for循环中,l是用于执行循环的临时变量,就像c++中常用的i一样。程序如何知道它正在查看的字符是辅音还是现在?因为元音不应该发生任何事情。我刚刚意识到这个字符串完全由辅音组成,但如果不是呢?在 c++ 中,我将有一个不同的函数来检查当前字符是否为辅音,然后使用 if 语句。 python有没有办法让这个更简单,或者我解决的问题和c++一样吗
  • 如果字符在consonants字符串中,它是一个辅音。这是因为consonants 是所有英语辅音的字符串。在 Python 中,您不需要单独的函数,只需使用 in 运算符即可。例如,'a' in 'abc' 将返回 True,而 1 in [5, 6, 7] 将返回 False。 @Aeleon
【解决方案2】:

这段代码既不包含if 语句也不包含for 循环。因为语句不能嵌入到表达式中,例如作为参数传递给 join 的语句,所以您可以很容易地分辨出来。

consonants = 'bcdfghjklmnpqrstvwxz'
return ''.join(l + 'o' + l if l in consonants else l for l in s)

if条件表达式 的一部分,其形式为 x if y else z。与if 语句不同,else 是强制性的,因为无论y 是否为真,表达式都必须有一个值。如果y 为真,则值为x;否则,值为z。在这种情况下,该值为 l + 'o' + l(当 l 是辅音时)或 l 本身。

for 关键字用于指示生成器表达式,您可以将其视为本质上基于另一个序列生成值序列的一种方式。在这里,我们从某个序列s 开始,并为该序列中的每个字符l 生成另一个值。 join 使用生成的序列来生成一个新字符串。

(有点跑题了,但是将列表而不是生成器显式传递给join 会更有效,因为无论如何它都需要先构建一个列表以确定为结果字符串分配多少空间。

return ''.join([l + 'o' + l if l in consonants else l for l in s])

)

【讨论】:

  • 并非所有形式的条件表达式都需要else
  • 请举一个可以省略else的例子。
  • 突然想到:list(c for c in 'abc123' if c.isalpha())。但是,当用于lambda 时,需要else
  • 那不是条件表达式;它是生成器表达式的 if 子句。它们都使用if 关键字,但它们是语法的不同部分。
猜你喜欢
  • 1970-01-01
  • 2016-02-17
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多