def calculate_variance(number_list):
sum_list = 0
for number in number_list:
sum_list = sum_list + number
mean = sum_list / len(number_list)
sum_squares = 0
for number in number_list:
sum_squares = sum_squares + number**2
mean_squares = sum_squares / len(number_list)
return mean_squares - mean**2
如果仔细使用垂直空白,可以大大提高代码的可读性。它有助于读者直观地理解你的代码如何分成几个部分,以及这些部分如何相互关联。
最大行长度和换行
PEP 8建议行数限制为79个字符。当然,将语句保持在79个字符以内并不总是可行的。 PEP 8给出了允许语句在多行上运行的方法。
如果代码包含在括号,方括号或大括号中,Python将假定行继续:
def function(arg_one, arg_two,
arg_three, arg_four):
return arg_one
如果不能使用按规则继续,那么你可以使用反斜杠来代替换行:
from mypkg import example1,
example2, example3
如果需要在二元运算符周围换行,例如 + 和 *,则它应该在运算符之前发生。数学家认为在二元运算符之前换行可提高可读性。比较以下两个例子。
下面是在二元运算符之前换行的示例:
# Recommended
total = (first_variable
+ second_variable
- third_variable)
你可以立刻看到正在添加或减去的变量,因为操作符紧挨着正在操作的变量。 现在,让我们看一个在二元运算符之后换行的示例:
# Not Recommended
total = (first_variable +
second_variable -
third_variable)
在这里,很难看出哪个变量被添加,哪个变量被减去。
缩进
缩进或前导空格在Python中非常重要。Python中代码行的缩进级别决定了语句如何组合在一起。 请看以下示例:
x = 3
if x > 5:
print('x is larger than 5')
缩进的print语句让Python知道只有if语句返回True才能执行它。相同的缩进会告诉Python在调用函数或代码属于给定类时要执行的代码。 PEP 8给出的关键缩进规则如下:
- 使用4个连续的空格来表示缩进;
- 首选使用空格,再使用Tab;
Tab键与空格
如上所述,在缩进代码时应首先使用空格而不是Tab键。你可以在文本编辑器中调整Tab设置:当你按Tab键时,输出4个空格而不是Tab符号。
如果你使用的是Python 2,并且混合使用了Tab和空格来缩进代码,那么在运行它时将不会看到错误。为了帮助你检查一致性,可以在从命令行运行Python 2代码时添加 -t 标志。当你使用的Tab和空格不一致时,解释程序将发出警告:
$ python2 -t code.py
code.py: inconsistent use of tabs and spaces in indentation
如果使用 -tt 标志,则解释器将发出错误而不是警告,并且你的代码将不会运行。使用此方法的好处是解释器会告诉你不一致的位置:
$ python2 -tt code.py
File "code.py", line 3
print(i, j)
^
TabError: inconsistent use of tabs and spaces in indentation
Python 3不允许混合Tab和空格。因此,如果你使用的是Python 3,则会自动发出以下错误:
$ python3 code.py
File "code.py", line 3
print(i, j)
^
TabError: inconsistent use of tabs and spaces in indentation
你可以使用Tab或空格来编写Python代码,以表示缩进。但是,如果你使用的是Python 3,则必须与你的选择保持一致。否则,代码将无法运行。PEP 8建议始终使用4个连续空格来表示缩进。
换行后的缩进
当使用换行将行保持在79个字符以下时,使用缩进来提高可读性是很有用的。它允许读者区分两行代码和跨越两行的单行代码。你可以使用两种缩进样式。
第一个是将缩进块与开口分隔符对齐:
def function(arg_one, arg_two,
arg_three, arg_four):
return arg_one
有时你会发现只需要4个空格就可以与开口分隔符对齐。这通常发生在跨越多行的if语句中,因为if,space和opening括号恰巧组成4个字符。在这种情况下,可能很难确定if语句中嵌套代码块的开始位置:
x = 5
if (x > 3 and
x < 10):
print(x)
在这种情况下,PEP 8提供了两种替代方案来帮助提高可读性:
- 在条件之后添加注释
x = 5
if (x > 3 and
x < 10):
# Both conditions satisfied
print(x)
- 在换行中添加额外的缩进
x = 5
if (x > 3 and
x < 10):
print(x)
第二个换行符后缩进方式是悬挂缩进:
这意味着除了段落或语句中的第一行之外的每一行都是缩进的。你可以使用悬挂缩进来直观地表示代码行延续。下面一个例子:
var = function(
arg_one, arg_two,
arg_three, arg_four)
使用悬挂缩进时,添加额外的缩进以区分连续行与函数内包含的代码。以下示例很难阅读,因为函数内部的代码与连续行的缩进级别相同:
# Not Recommended
def function(
arg_one, arg_two,
arg_three, arg_four):
return arg_one
因此,最好在下一行使用双缩进。这有助于区分函数参数和函数体,从而提高可读性:
def function(
arg_one, arg_two,
arg_three, arg_four):
return arg_one
总结一下,换行后缩进有两种方法,**第一种是将缩进块与开口分隔符对齐,第二种是使用悬挂缩进。**你可以自由选择在换行符后使用哪种缩进方法。
在哪里放置右括号
换行允许你断开括号,方括号或大括号内的行。PEP 8为右中括号的位置提供了两个选项:
- 使用前一行的第一个非空白字符排列右括号:
list_of_numbers = [
1, 2, 3,
4, 5, 6,
7, 8, 9
]
- 将右括号与构造开始行的第一个字符对齐:
list_of_numbers = [
1, 2, 3,
4, 5, 6,
7, 8, 9
]
可以自由选择使用的选项,但一致性是关键,所以尽量坚持上述方法之一。
注释
注释代码非常重要,这样你和任何协作者都可以理解它。当你或其他人阅读评论时,他们应该能够轻松理解注释所对应的代码以及它与其余代码的匹配程度。
以下是在为代码添加注释时要记住的一些要点:
- 将注释和文档字符串的行长限制为72个字符;
- 使用完整的句子,以大写字母开头;
- 如果更改代码,请务必更新注释;
块注释
**使用块注释来标注一小部分代码。**当你必须编写多行代码来执行单个操作(例如从文件导入数据或更新数据库条目)时,它们非常有用。它们很重要,因为它们可以帮助其他人理解给定代码块的用途和功能。
PEP 8为编写块注释提供了以下规则:
- 将块注释缩进到与它们描述的代码相同的级别;
- #后面加单个空格后开始注释;
- 用包含单个#的行分隔段落;
这是一个解释for循环功能的块注释。请注意,句子换行到新行以保留79个字符行限制:
for i in range(0, 10):
# Loop over i ten times and print out the value of i, followed by a
# new line character
print(i, '
')
有时,如果代码是非常技术性的,那么有必要在块注释中使用多个段落:
def quadratic(a, b, c, x):
# Calculate the solution to a quadratic equation using the quadratic
# formula.
#
# There are always two solutions to a quadratic equation, x_1 and x_2.
x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)
x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)
return x_1, x_2
如果你对使用哪种注释类型更适合存在疑问,那么块注释通常是可行的方法。尽可能在整个代码中使用它们,但如果你对代码进行了更改,也请务必更新它们。
行注释
行注释解释了一段代码中的单个语句。它们有助于提醒你,或向其他人解释为什么需要某行代码。以下是PEP 8对它们的建议:
- 与代码写在同一行;
- 使用两个或多个空格将代码与行注释分开;
- #后加单个空格,然后进行行注释;
- 不要用它们来解释已经很明显的问题;
以下是行注释的示例:
x = 5 # This is an inline comment
有时,行注释似乎是必要的,但你可以使用更好的命名规则。比如,这是一个例子:
x = 'John Smith' # Student Name
这里,行注释确实提供了额外的信息。但是,使用x作为人名的变量名是不好的做法。如果重命名变量,则无需行注释:
student_name = 'John Smith'
最后,像这样的行注释是不好的做法,因为它们注释了明显且混乱的代码:
empty_list = [] # Initialize empty list
x = 5
x = x * 5 # Multiply x by 5
行注释比块注释更具体,但很容易在不需要时添加它们,这会导致混乱,而你可以总是使用块注释,而不必担心这些。因此,除非确定需要使用行注释,否则更多使用块注释,则代码更可能符合PEP 8。
文档字符串
文档字符串是用双(“”")或单引号(‘’')括起来的字符串,它们出现在任何函数,类,方法或模块的第一行。你可以使用它们来解释和记录一个特定的代码块。
适用于文档字符串的最重要规则如下:
- 环绕文档字符串,两边都有三个双引号,如 “”" 这是一个文档字符串 “”";
- 为所有公共模块,函数,类和方法编写它们;
- 将单行结束多行文档字符串的 “”" 放在一行上:
def quadratic(a, b, c, x):
"""Solve quadratic equation via the quadratic formula.
A quadratic equation has the following form:
ax**2 + bx + c = 0
There always two solutions to a quadratic equation: x_1 & x_2.
"""
x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)
x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)
return x_1, x_2
- 对于单行文档字符串,请将 “”" 保留在同一行:
def quadratic(a, b, c, x):
"""Use the quadratic formula"""
x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)
x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)
return x_1, x_2
表达式和语句的空格
空格在表达式和语句中正确使用时非常有用。如果没有足够的空白,那么代码可能难以阅读,因为它们都聚集在一起。如果空白太多,那么在语句中可能难以在视觉上组合相关术语。
二元运算符两边的空白
以下二元运算符两边都有一个空格:
- 赋值运算符(=,+=, -=)
- 比较运算符(==,=!,>,<,>=,<=)和(is,is not,in,not in)
- 布尔运算法(and,not,or)
如果语句中有多个运算符,则在每个运算符之前和之后添加单个空格可能会让人感到困惑。相反,最好只在优先级最低的运算符两边添加空格,尤其是在执行数学运算时。以下是几个例子:
# Recommended
y = x**2 + 5
z = (x+y) * (x-y)
# Not Recommended
y = x ** 2 + 5
z = (x + y) * (x - y)
你还可以将此应用于有多个条件的if语句:
# Not recommended
if x > 5 and x % 2 == 0:
print('x is larger than 5 and divisible by 2!')
在上面的示例中,and 运算符具有最低优先级。因此,可以更清楚地表达if语句如下:
# Recommended
if x>5 and x%2==0:
print('x is larger than 5 and divisible by 2!')
你可以自由选择哪个更清晰,但需要注意的是必须在运算符的任何一侧使用相同数量的空格。以下是不可接受的:
# Definitely do not do this!
if x >5 and x% 2== 0:
print('x is larger than 5 and divisible by 2!')
在切片中,冒号充当二元运算符。因此,上面所说的规则同样适用,任何一方都应该有相同数量的空白。以下列表切片示例:
list[3:4]
# Treat the colon as the operator with lowest priority
list[x+1 : x+2]
# In an extended slice, both colons must be
# surrounded by the same amount of whitespace
list[3:4:5]
list[x+1 : x+2 : x+3]
# The space is omitted if a slice parameter is omitted
list[x+1 : x+2 :]
何时避免添加空格
在某些情况下,添加空格会使代码更难以阅读。太多的空格会使代码过于稀疏而难以理解。PEP 8总结了空白不合适的非常明显的例子。
避免添加空格的最重要的地方是在一行的末尾,这称为尾部空格。它是不容易察觉的,可能产生难以追踪的错误。
以下总结了一些应避免添加空格的情况:
- 紧靠括号,括号或大括号内:
# Recommended
my_list = [1, 2, 3]
# Not recommended
my_list = [ 1, 2, 3, ]
- 在逗号,分号或冒号之前:
x = 5
y = 6
# Recommended
print(x, y)
# Not recommended
print(x , y)
- 在打开函数调用的参数列表的开括号之前:
def double(x):
return x * 2
# Recommended
double(3)
# Not recommended
double (3)
- 在开始索引或切片的开括号之前:
# Recommended
list[3]
# Not recommended
list [3]
- 在末尾逗号和右括号之间:
# Recommended
tuple = (1,)
# Not recommended
tuple = (1, )
- 要对齐赋值运算符:
# Recommended
var1 = 5
var2 = 6
some_long_var = 7
# Not recommended
var1 = 5
var2 = 6
some_long_var = 7
确保代码中的任何位置都没有尾部空格。在其他情况下,PEP 8不鼓励添加额外的空格,例如立即在括号内,以及逗号和冒号之前。你也应该永远不要添加额外的空格为了对齐运算符。
编程建议
你经常会发现有几种方法可以在Python中执行相同的操作(以及任何其他编程语言)。下面你将看到PEP 8提供的一些建议,以消除这种歧义并保持一致性。
**1. 不要使用等价运算符==将布尔值与True或False进行比较。**你经常需要检查布尔值是True还是False。
# Not Recommended
my_bool = 6 > 5
if my_bool == True:
return '6 is bigger than 5'
这里不需要使用等价运算符==,bool只能取值True或False,因此写下面的内容就足够了,这种使用布尔值执行if语句的方法需要更少的代码并且更简单。
# Recommended
if my_bool:
return '6 is bigger than 5'
**2. 在if语句中直接判断空序列是否为假。**如果要检查列表是否为空,则可能需要检查列表的长度。如果列表为空,则其长度为0,在if语句中使用时等于False。这是一个例子:
# Not Recommended
my_list = []
if not len(my_list):
print('List is empty!')
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
* * *
**(1)Python所有方向的学习路线(新版)**
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/8fc093dcfa1f476694c574db1242c05b.png)
**(2)Python学习视频**
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)
**(3)100多个练手项目**
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)
**(4)200多本电子书**
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
**(5)Python知识点汇总**
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
![在这里插入图片描述](https://img-blog.csdnimg.cn/c741a91b05a542ba9dc8abf2f2f4b1af.png)
**(6)其他资料**
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
![在这里插入图片描述](https://img-blog.csdnimg.cn/9fa77af248b84885a6ec779b2ead064d.png)
**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**