给定:
e = 'a' + 'b' + 'c' + 'd'
如何将上面的内容写成两行?
e = 'a' + 'b' +'c' + 'd'
将\放在行尾,或者将语句括在括号( .. )中。从IBM开始:
\
( .. )
b = ((i1 < 20) and(i2 < 30) and(i3 < 40))
或
b = (i1 < 20) and \(i2 < 30) and \(i3 < 40)
这一行是什么?你可以在下一行有参数,没有任何问题:
a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5,blahblah6, blahblah7)
否则,你可以这样做:
if (a == True andb == False):
或显式换行符:
if a == True and \b == False:
查看风格指南以获取更多信息。
使用括号,您的示例可以写在多行上:
a = ('1' + '2' + '3' +'4' + '5')
使用显式换行符可以获得相同的效果:
a = '1' + '2' + '3' + \'4' + '5'
请注意,样式指南说最好使用带有括号的隐式延续,但在这种特殊情况下,仅仅在表达式周围添加括号可能是错误的做法。
从马的嘴里:显式行加入 可以有两个或多个物理行连接到逻辑行使用反斜杠字符(\),如下所示:当一条物理线以不是字符串一部分的反斜杠文字或注释,它与以下形成单个逻辑行,删除反斜杠和跟随行尾字符。对于示例: if 1900 < year < 2100 and 1 <= month <= 12 \and 1 <= day <= 31 and 0 <= hour < 24 \and 0 <= minute < 60 and 0 <= second < 60: # Looks like a valid datereturn 1 以反斜杠结尾的行不能带有注释。反斜杠不会继续注释。反斜杠可以除了字符串之外,不继续令牌字面量(即除字符串文字不能分割使用反斜杠的物理行)。A反斜杠在其他地方是非法的字符串文字之外的行。
从马的嘴里:显式行加入
可以有两个或多个物理行连接到逻辑行使用反斜杠字符(\),如下所示:当一条物理线以不是字符串一部分的反斜杠文字或注释,它与以下形成单个逻辑行,删除反斜杠和跟随行尾字符。对于示例:
if 1900 < year < 2100 and 1 <= month <= 12 \and 1 <= day <= 31 and 0 <= hour < 24 \and 0 <= minute < 60 and 0 <= second < 60: # Looks like a valid datereturn 1
以反斜杠结尾的行不能带有注释。反斜杠不会继续注释。反斜杠可以除了字符串之外,不继续令牌字面量(即除字符串文字不能分割使用反斜杠的物理行)。A反斜杠在其他地方是非法的字符串文字之外的行。
从PEP 8--Python代码样式指南:
包装长行的首选方法是在括号、括号和大括号中使用Python的隐含行延续。可以通过将表达式包装在括号中来将长行分成多行。应该优先使用这些而不是使用反斜杠来继续行。
反斜杠有时可能仍然合适。例如,长的多个with语句不能使用隐式延续,所以反斜杠是可以接受的:
with open('/path/to/some/file/you/want/to/read') as file_1, \open('/path/to/some/file/being/written', 'w') as file_2:file_2.write(file_1.read())另一个这样的例子是断言语句。
with open('/path/to/some/file/you/want/to/read') as file_1, \open('/path/to/some/file/being/written', 'w') as file_2:file_2.write(file_1.read())
另一个这样的例子是断言语句。
确保适当缩进继续的行。围绕二元运算符中断的首选位置是之后运算符,而不是在它之前。一些例子:
class Rectangle(Blob): def __init__(self, width, height,color='black', emphasis=None, highlight=0):if (width == 0 and height == 0 andcolor == 'red' and emphasis == 'strong' orhighlight > 100):raise ValueError("sorry, you lose")if width == 0 and height == 0 and (color == 'red' oremphasis is None):raise ValueError("I don't think so -- values are %s, %s" %(width, height))Blob.__init__(self, width, height,color, emphasis, highlight)file_2.write(file_1.read())
PEP8现在推荐数学家和他们的出版商使用的相反的惯例(用于二进制运算)来提高易读性。
Donald Knuth打破之前二元运算符的风格垂直对齐运算符,从而减少了眼睛在确定添加和减去哪些项目时的工作量。
从PEP8:一行应该在二进制运算符之前还是之后断开?:
唐纳德·高德纳在他的《计算机与排版》系列中解释了传统规则:“虽然段落中的公式总是在二进制运算和关系之后中断,但显示的公式总是在二进制运算之前中断”[3]。
遵循数学的传统通常会产生更具可读性的代码:
# Yes: easy to match operators with operands
income = (gross_wages+ taxable_interest+ (dividends - qualified_dividends)- ira_deduction- student_loan_interest)
在Python代码中,只要约定在本地一致,就允许在二进制运算符之前或之后中断。对于新代码,建议采用Knuth的风格。
[3]:高德纳的《The TeXBook》,第195页和第196页
使用反斜杠结束一行的危险在于,如果在反斜杠之后添加空格(当然,这很难看到),反斜杠不再像你想象的那样。
有关更多信息,请参阅Python习语和反习语(python2或python3)。
您可以在括号和大括号之间断开行。此外,您可以将反斜杠字符\附加到一行以显式断开它:
x = (tuples_first_value,second_value)y = 1 + \2
这可能不是Pythonic的方式,但我通常使用带有连接函数的列表来编写长字符串,例如SQL查询:
query = " ".join(['SELECT * FROM "TableName"','WHERE "SomeColumn1"=VALUE','ORDER BY "SomeColumn2"','LIMIT 5;'])
摘自The Hitchhiker's Guide to Python(线路继续):
当逻辑代码行超过可接受的限制时,您需要将其拆分为多行物理行。如果该行的最后一个字符是反斜杠,Python解释器将连接连续行。这在某些情况下很有帮助,但通常应该避免,因为它很脆弱:在行尾添加一个空格,在反斜杠之后,会破坏代码,可能会产生意想不到的结果。更好的解决方案是在元素周围使用括号。在行尾留下一个未关闭的括号,Python解释器将加入下一行,直到括号关闭。同样的行为适用于花括号和方括号。然而,通常情况下,必须拆分很长的逻辑行是一个迹象,表明你试图同时做太多的事情,这可能会阻碍易读性。
当逻辑代码行超过可接受的限制时,您需要将其拆分为多行物理行。如果该行的最后一个字符是反斜杠,Python解释器将连接连续行。这在某些情况下很有帮助,但通常应该避免,因为它很脆弱:在行尾添加一个空格,在反斜杠之后,会破坏代码,可能会产生意想不到的结果。
更好的解决方案是在元素周围使用括号。在行尾留下一个未关闭的括号,Python解释器将加入下一行,直到括号关闭。同样的行为适用于花括号和方括号。
然而,通常情况下,必须拆分很长的逻辑行是一个迹象,表明你试图同时做太多的事情,这可能会阻碍易读性。
话虽如此,这里有一个考虑多个导入的示例(当超过行限制,在PEP-8上定义时),通常也应用于字符串:
from app import (app, abort, make_response, redirect, render_template, request, session)
如果你想因为一个长的文字字符串而断开你的行,你可以把那个字符串分成几段:
long_string = "a very long string"print("a very long string")
将被取代
long_string = ("a ""very ""long ""string")print("a ""very ""long ""string")
两个print语句的输出:
a very long string
注意装腔作势中的括号。
还请注意,将文字字符串拆分成碎片允许仅在字符串的部分上使用文字前缀并混合分隔符:
s = ('''2+2='''f"{2+2}")
还可以在多行中中断方法(obj.method())的调用。
obj.method()
将命令括在括号“()”中并跨越多行:
()
> res = (some_object.apply(args).filter().values)
例如,我发现它在链调用Pandas/Holoview对象方法时很有用。