Skip to main content
 首页 » 编程设计

python之这条 Python 语句的含义是什么

2025年05月04日9wayfarer

更具体地说,我不确定紧接着出现的“%”和“\”符号是什么意思:

return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % \ 
    (self.id, a, b, c, d, e, f) 

这个返回语句是否被认为是一个行代码?因为我原本以为“\”是为了将看起来过长的一行分成两段,以提高可读性并避免环绕。

另外,我这里的表格反射(reflect)了我的代码中的内容。说“(self.id, a, b, c, d, e, f)”的部分确实比 return 语句的开头更远。

基本上,语句是否等同于:

return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % (self.id, a, b, c, d, e, f) 

在这一个中没有涉及“\”....

请您参考如下方法:

% 符号被称为字符串格式化 或字符串插值 运算符,在String Formatting Operations 中有描述。 .另外,请注意,在我的示例中,我将 % 符号移到了下一行,而不是将其留在上一行的末尾。这两种形式都是有效的,但是将其与用于插值的数据放在同一行往往会使其更清晰易读且更易于维护。

是的,这两段代码是等价的,因为反斜杠将两个或多个物理行视为单个逻辑行,如 Python 文档中有关 Explicit Line Joining 部分中关于 \ 符号的描述.但是,我会避免使用显式行连接,而是使用称为 Implicit Line Joining 的第三种等效方式。 :

return ('guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' 
        % (self.id, a, b, c, d, e, f)) 

因为它在重新格式化时不太容易出错,并且还允许您使用注释,例如在这个重新格式化的示例中:

return ('guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }'  
        % (self.id,  
           a,  
           b,  
           # c1,  
           c2,  
           d,  
           e,  
           f)) 

尝试用反斜杠做同样的事情......不仅更费力,而且你也不能使用注释。

请注意,返回值周围的括号并非多余,正如某些人所建议的那样;它们允许使用 implicit line joining在变量插值的上下文中(它与 % 之后的元组分开,后者是隐式行连接也发生的附加上下文):

Expressions in parentheses, square brackets or curly braces can be split over more than one physical line without using backslashes.

总而言之...请尽可能避免使用反斜杠显式连接! (考虑到替代方案,它几乎从不是必要的)。

显式/隐式行连接的一个相关主题是在 String Literals 部分中讨论的三重引号字符串的使用。 .考虑到吉他示例的 C 风格 block 语法,我希望将您的返回值重新格式化为多行,如下所示:

class c(object): 
    def f(self): 
        return """ 
guitar { 
  id: %d,  
  relevant_properties: (%.02f, %.02f, %.02f), 
  irrelevant_properties: (%.02f, %.02f, %.02f) 
} 
""" % (self.id, a, b, c, d, e, f) 

我已将此示例放在类方法定义的更完整的上下文中,这样格式看起来会更清楚;多行字符串将与缓冲区的左侧齐平,任何空格都将逐字显示在输出中。

但是请注意,上面的格式可能会引入不需要的前导或尾随换行符,因此这是我偶尔推荐使用显式行连接的少数情况之一。这里的原因是消除不需要的额外换行符作为三重引号字符串为我们提供的增强的代码可读性的权衡,因为它允许我们或多或少地以我们在最终输出中看到它的方式看到完整的节;比较上面你会看到在 """ 第一次出现的末尾只添加了一个 \ 字符:

class c(object): 
    def f(self): 
        return """\ 
guitar { 
  id: %d,  
  relevant_properties: (%.02f, %.02f, %.02f), 
  irrelevant_properties: (%.02f, %.02f, %.02f) 
} 
""" % (self.id, a, b, c, d, e, f)