Python的优缺点
优点
- 开源免费,解释型语言跨平台,可扩展性强
- 简单易用,学习成本低,看起来非常优雅干净
- 标准库和第三库众多,开发的时间短,胶水语言
1) 语法简单
和传统的 C/C++、Java、C#等语言相比,Python 对代码格式的要求没有那么严格,这种宽松使得用户在编写代码时比较舒服,不用在细枝末节上花费太多精力。我来举两个典型的例子:
Python 不要求在每个语句的最后写分号,当然写上也没错;
定义变量时不需要指明类型,甚至可以给同一个变量赋值不同类型的数据。
这两点也是PHP 、
MATLAB
等常见脚本语言都具备的特性。
Python 是一种代表极简主义的编程语言,阅读一段排版优美的 Python 代码,就像在阅读一个英文段落,非常贴近人类语言,所以人们常说,Python 是一种具有伪代码特质的编程语言。
伪代码(Pseudo Code)是一种算法描述语言,它介于自然语言和编程语言之间,使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。
如果你学过数据结构,阅读过严蔚敏的书籍,那你一定知道什么是伪代码。
为什么说简单就是杀手锏?一旦简单了,一件事情就会变得很纯粹;我们在开发 Python 程序时,可以专注于解决问题本身,而不用顾虑语法的细枝末节。在简单的环境中做一件纯粹的事情,那简直是一种享受。
2) Python 是开源的
开源,也即开放源代码,意思是所有用户都可以看到源代码。
Python 的开源体现在两方面:
① 程序员使用 Python 编写的代码是开源的。
比如我们开发了一个 BBS 系统,放在互联网上让用户下载,那么用户下载到的就是该系统的所有源代码,并且可以随意修改。这也是解释型语言本身的特性,想要运行程序就必须有源代码。
② Python 解释器和模块是开源的。
官方将 Python 解释器和模块的代码开源,是希望所有 Python 用户都参与进来,一起改进 Python 的性能,弥补 Python 的漏洞,代码被研究的越多就越健壮。
这个世界上总有那么一小撮人,他们或者不慕名利,或者为了达到某种目的,会不断地加强和改善 Python。千万不要认为所有人都是只图眼前利益的,总有一些精英会放长线钓大鱼,总有一些极客会做一些炫酷的事情。
3) Python 是免费的
开源并不等于免费,开源软件和免费软件是两个概念,只不过大多数的开源软件也是免费软件;Python 就是这样一种语言,它既开源又免费。
用户使用 Python 进行开发或者发布自己的程序,不需要支付任何费用,也不用担心版权问题,即使作为商业用途,Python 也是免费的。
4) Python 是高级语言
这里所说的高级,是指 Python 封装较深,屏蔽了很多底层细节,比如 Python 会自动管理内存(需要时自动分配,不需要时自动释放)。
高级语言的优点是使用方便,不用顾虑细枝末节;缺点是容易让人浅尝辄止,知其然不知其所以然。
5) Python 是解释型语言,能跨平台
解释型语言一般都是跨平台的(可移植性好),Python 也不例外,我们已经在《
编译型语言和解释型语言的区别》中进行了讲解,这里不再赘述。
5) Python 是面向对象的编程语言
面向对象是现代编程语言一般都具备的特性,否则在开发中大型程序时会捉襟见肘。
Python 支持面向对象,但它不强制使用面向对象。Java 是典型的面向对象的编程语言,但是它强制必须以类和对象的形式来组织代码。
6) Python 功能强大(模块众多)
Python 的模块众多,基本实现了所有的常见的功能,从简单的字符串处理,到复杂的 3D 图形绘制,借助 Python 模块都可以轻松完成。
Python 社区发展良好,除了 Python 官方提供的核心模块,很多第三方机构也会参与进来开发模块,这其中就有 Google、Facebook、Microsoft 等软件巨头。即使是一些小众的功能,Python 往往也有对应的开源模块,甚至有可能不止一个模块。
7) Python 可扩展性强
Python 的可扩展性体现在它的模块,Python 具有脚本语言中最丰富和强大的类库,这些类库覆盖了文件 I/O、GUI、网络编程、数据库访问、文本操作等绝大部分应用场景。
这些类库的底层代码不一定都是 Python,还有很多 C/C++ 的身影。当需要一段关键代码运行速度更快时,就可以使用 C/C++ 语言实现,然后在 Python 中调用它们。Python 能把其它语言“粘”在一起,所以被称为“胶水语言”。
Python 依靠其良好的扩展性,在一定程度上弥补了运行效率慢的缺点。
缺点
- 运行速度慢(解释型语言的通病)
Python 速度慢不仅仅是因为一边运行一边“翻译”源代码,还因为 Python 是高级语言,屏蔽了很多底层细节。这个代价也是很大的,Python 要多做很多工作,有些工作是很消耗资源的,比如管理内存。
Python 的运行速度几乎是最慢的,不但远远慢于 C/C++,还慢于 Java。
但是速度慢的缺点往往也不会带来什么大问题。首先是计算机的硬件速度运来越快,多花钱就可以堆出高性能的硬件,硬件性能的提升可以弥补软件性能的不足。
代码加密困难(对于普通人来说,仅用于提高效率,便捷生活,并不需要加密)
VSCode
VScode是一个相当优秀的IDE,具备开源、跨平台、模块化、插件丰富、轻量化、启动时间快、颜值高的特质
软件准备
下载地址如下:
Python:Download Python | Python.org
VSCode:CSDN21天学习挑战赛
VSCode配置可自行搜素哦。
Python第三方库安装
- 首先检查下python是否安装成功
1、打开cmd,输入python,点击回车。
2、退出、输入pip list,检查第三库安装信息(安装默认自带的库)
安装第三方的包
通过python自带的pip工具,配置VScode需要的常用的库 flake8和yapf
flake8会检查编写代码时的不规范的地方和语法错误。
yapf是一个代码格式化工具,可以一键美化代码。
安装过程如下:
1、在cmd输入pip list检查是否已存在需要的包
2、输入pip install flake8下载安装flake8
3、输入pip install yapf下载安装yapf
编码规范
我们想要写好python代码,必须了解python相关编码规范,有了这个的加持,编写的代码不仅可以实现相应的功能,而且简单易读,逻辑清晰。本节技能树主要分享相应的python编码规范,学习python的小伙伴们请仔细阅读,对你的python代码的编写肯定有质的提高!!!不会报错。
1 代码编码格式
- 一般来说,声明编码格式在脚本中是必需的。
- 国际惯例,文件编码和 Python 编码格式全部为 utf-8 。例如:在 Python 代码的开头,要统⼀加上如下代码:
# -- coding: utf-8 --
- 如果Python源码文件没有声明编码格式,Python解释器会默认使用ASCII编码。但出现非ASCII编码的字符,Python解释器就会报错,因此非 ASCII 字符的字符串,请需添加u前缀。
- 若出现 Python编码问题,可按照以下操作尝试解决:
import sys reload(sys) sys.setdefaultencoding('utf-8')
2 分号
不要在行尾加分号,也不要用分号将两条命令放在同一行。
3 行的最大长度
每行不超过80个字符
以下情况除外:
长的导入模块语句
注释里的URL
不要使用反斜杠连接行。
Python会将 圆括号, 中括号和花括号中的行隐式的连接起来。
圆括号、方括号或花括号以内的表达式允许分成多个物理行,无需使用反斜杠。
式的行拼接可以带有注释。后续行的缩进不影响程序结构。后续行也允许为空白行。
如果需要,可以在表达式外围增加一对额外的圆括号。
如果一个文本字符串在一行放不下, 可以使用圆括号来实现隐式行连接
4 缩进规则
Python 采用代码缩进和冒号( : )来区分代码块之间的层次。
在 Python 中,对于类定义、函数定义、流程控制语句、异常处理语句等,行尾的冒号和下一行的缩进,表示下一个代码块的开始,而缩进的结束则表示此代码块的结束。
Python 中实现对代码的缩进,可以使用空格或者 Tab 键实现。但无论是手动敲空格,还是使用 Tab 键,通常情况下都是采用 4 个空格长度作为一个缩进量(默认情况下,一个 Tab 键就表示 4 个空格)。
对于 Python 缩进规则,初学者可以这样理解,Python 要求属于同一作用域中的各行代码,它们的缩进量必须一致,但具体缩进量为多少,并不做硬性规定。
建议使用 Emacs 的 Python-mode 默认值:4 个空格一个缩进层次。不要用tab,也不要tab和空格混用
正确示例代码:
if a==0: print("正确") # 缩进4个空白占位 else: # 与if对齐 print("错误") # 缩进4个空白占位 或者 # 4 个空格缩进,第一行不需要 foo = long_function_name( var_one, var_two, var_three, var_four)
5 注释
Python中使用 # 进行注释,# 号后面要空一格。
最需要写注释的是代码中那些技巧性的部分:对于复杂的操作,应该在其操作开始前写上若干行注释.;对于不是一目了然的代码,应在其行尾添加注释。
为了提高可读性,注释和代码隔开一定的距离,注释应该至少离开代码2个空格,块注释后面最好多留几行空白再写代码。
当代码更改时,优先更新对应的注释。
如果一个注释是一个短语或者句子,它的第一个单词应该大写,除非它是以小写字母开头的标识符(永远不要改变标识符的大小写!)。
如果注释很短,结尾的句号可以省略。块注释一般由完整句子的一个或多个段落组成,并且每句话结束有个句号。
在句尾结束的时候应该使用两个空格。
Python中有三种形式的注释:行注释、块注释、文档注释
行注释:注释应解释自己做了什么,而不是对代码本身的解释
有节制地使用行内注释
行内注释是与代码语句同行的注释
行内注释和代码至少要有两个空格分隔
注释由#和一个空格开始。
n = input() m = input() t = n / 2 # t是n的一半 # 循环,条件为t*m/n 小于n while (t * m / (n + 1) < n): t = 0.5 * m + n / 2 # 重新计算t值 print(t)
块注释:
- 块注释通常适用于跟随它们的某些(或全部)代码,并缩进到与代码相同的级别
- 块注释的每一行开头使用一个 # 和一个空格(除非块注释内部缩进文本)。
- 块注释内部的段落通常只有一个 # 的空行分隔。
def FuncName(parameter1,parameter2): """ 描述函数要做的事情 :param parameter1: 参数一描述(类型、用途等) :param parameter2: 参数二描述 :return: 返回值描述 """
# We use a weighted dictionary search to find out where i is in # the array. We extrapolate position based on the largest num # in the array and the array size and then do binary search to # get the exact number. if i & (i-1) == 0: # true if i is a power of 2
文档注释:
- 要为所有的公共模块,函数,类和方法编写文档说明
- 非公共的方法没有必要,但是应该有一个描述方法具体作用的注释。这个注释应该在def那一行之后
- 多行文档注释使用的结尾三引号应该是自成一行
class SampleClass(object): """Summary of class here. Longer class information.... Longer class information.... Attributes: likes_spam: A boolean indicating if we like SPAM or not. eggs: An integer count of the eggs we have laid. """ def __init__(self, likes_spam=False): """Inits SampleClass with blah.""" self.likes_spam = likes_spam self.eggs = 0 def public_method(self): """Performs operation blah."""
6 空行
- 顶层函数和类定义,前后用两个空行隔开
- 编码格式声明、模块导入、常量和全局变量声明、顶级定义和执行代码之间空两行
- 类里面方法定义用一个空行隔开
- 在函数或方法内部,可以在必要的地方空一行以增强节奏感,但应避免连续空行
class Class01: pass class Class02: def function_01(self): pass def function_02(self): pass
使用必要的空行可以增加代码的可读性,通常在顶级定义(如函数或类的定义)之间空两行,而方法定义之间空一行,另外在用于分隔某些功能的位置也可以空一行。
7 制表符还是空格
不要混用制表符和空格,因为如果混用了,虽然在编辑环境中显示两条语句为同一缩进层次,但因为制表符和空格的不同会导致 Python 解释为两个不同的层次。
在调用 Python 命令行解释器时使用 -t 选项,可对代码中不合法的混合制表符和空格发出警告,使用 -tt 时警告将变成错误,这些选项是被高度推荐的。但是强烈推荐仅使用空格而不是制表符。
空格使用规则:
在二元运算符两边各空一格,比如赋值(=)、比较(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔(and, or, not),算术操作符两边的空格可灵活使用,但两侧务必要保持一致
不要在逗号、分号、冒号前面加空格,但应该在它们后面加(除非在行尾)
函数的参数列表中,逗号之后要有空格
函数的参数列表中,默认值等号两边不要添加空格
左括号之后,右括号之前不要加添加空格
参数列表, 索引或切片的左括号前不应加空格
当'='用于指示关键字参数或默认参数值时,不要在其两侧使用空格
正确示例代码:
spam(ham[1], {eggs: 2}, []) if x == 4: print x, y x, y = y, x dict['key'] = list[index] def complex(real, imag=0.0): return magic(r=real, i=imag)
8 命名规范
模块名命名
- 模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)
# 正确 import decoder import html_parser # 不推荐 import Decoder
变量命名
- 不要使用字母I (小写的L), O (大写的O), I (大写的I)作为单字符的变量名。在有些字体里面,这些字符无法与数字0和1区分。如果想用I, 可使用L代替。
- 变量名尽量小写, 如有多个单词,用下划线隔开。
count = 0 this_is_var = 0
常量或者全局变量命名
- 全部大写,如有多个单词,用下划线隔开
- 全⼤写+下划线式驼峰
MAX_CLIENT = 100
函数命名
- 函数名应该小写,如有多个单词,用下划线隔开。
- 大小写混合仅在为了兼容原来主要以大小写混合风格的情况下使用,保持向后兼容。
- 私有函数在函数前加一个下划线_。
def run(): pass def run_with_env(): pass class Person(): def _private_func(): pass
类命名
类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头。
在接口被文档化并且主要被用于调用的情况下,可以使用函数的命名风格代替。
对于内置的变量命名有一个单独的约定:大部分内置变量是单个单词(或者两个单词连接在一起),首字母大写的命名法只用于异常名或者内部的常量。
class Farm(): pass class AnimalFarm(Farm): pass class _PrivateFarm(Farm): pass
类里面函数和方法参数
- 始终要将self作为实例方法的第一个参数。
- 始终要将cls作为类方法的第一个参数。
- 如果函数的参数名和已有关键字冲突,在最后加大意下划线比缩写或者随意拼写更好。因此class_比clss更好。
特别注意:
不要中英文混编
不要有a、b、c这种没有意义的命名
不要怕名字长就随便缩写,比如person_info 缩写成pi
不要用大小写区分变量类型,比如a是int类型,A是String类型
不要使用容易引起混淆的变量名
bool变量⼀般加上前缀 is_ 如:is_success
变量名不要用系统关键字,如 dir type str等等
以下用下画线作前导或结尾的特殊形式是被公认的:
_single_leading_underscore(以一个下画线作前导):例如,“from M import *”不会导入以下画线开头的对象。
single_trailing_underscore_(以一个下画线结尾):用于避免与 Python 关键词的冲突,例如“Tkinter.Toplevel(master, class_='ClassName')”。
__double_leading_underscore (双下画线):从 Python 1.4 起为类私有名。
__double_leading_and_trailing_underscore__:特殊的(magic) 对象或属性,存在于
用户控制的(user-controlled)名字空间,例如:__init__、__import__ 或 __file__。
9 引号用法规则
- 自然语言使用双引号
- 机器标识使用单引号
- 正则表达式使用双引号
- 文档字符串 (docstring) 使用三个双引号
字符串引号规则:
- 单引号和双引号字符串是相同的。当一个字符串中包含单引号或者双引号字符串的时候,使用和最外层不同的符号来避免使用反斜杠,从而提高可读性。
- 在同一个文件中,保持使用字符串引号的一致性。在字符串内可以使用另外一种引号,以避免在字符串中使用。
正确使用示例:
Tim('Why are you hiding your eyes?') Bob("I'm scared of lint errors.") Juy('"Good!" thought a happy Python reviewer.')
- 当且仅当代码中使用单引号'来引用字符串时,才可能会使用三重'''为非文档字符串的多行字符串来标识引用
- 文档字符串必须使用三重双引号"""
10 模块导入规则
导入应该放在文件顶部,位于模块注释和文档字符串之后,模块全局变量和常量之前。
导入应该按照从最通用到最不通用的顺序分组:标准库导入、第三方库导入、应用程序指定导入,分组之间空一行。
模块名称要短,使用小写,并避免使用特殊符号, 比如点和问号。
尽量保持模块名简单,以无需分开单词最佳(不推荐在两个单词之间使用下划线)。
每个导入应该独占一行。
正确使用例子:
import os import numpy import sys from types import StringType, ListType
从一个包含类的模块中导入类时,通常可以写成这样:
1. from MyClass import MyClass 2. from foo.bar.YourClass import YourClass
模块导入建议
11 Main
主功能应该放在一个main()函数中。
在Python中,pydoc以及单元测试要求模块必须是可导入的。代码应该在执行主程序前总是检查 if __name__ == '__main__', 这样当模块被导入时主程序就不会被执行。
def main(): ... if __name__ == '__main__': main()
12 函数设计规范
函数设计的主要目标就是最大化代码重用和最小化代码冗余。精心设计的函数不仅可以提高程序的健壮性,还可以增强可读性、减少维护成本。
函数设计要尽量短小,嵌套层次不宜过深。 所谓短小, 就是尽量避免过长函数, 因为这样不需要上下拉动滚动条就能获得整体感观, 而不是来回翻动屏幕去寻找某个变量或者某条逻辑判断等。 函数中需要用到 if、 elif、 while 、 for 等循环语句的地方,尽量不要嵌套过深,最好能控制在3层以内。不然有时候为了弄清楚哪段代码属于内部嵌套, 哪段属于中间层次的嵌套, 哪段属于更外一层的嵌套所花费的时间比读代码细节所用时间更多。
尽可能通过参数接受输入,以及通过return产生输出以保证函数的独立性。
尽量减少使用全局变量进行函数间通信。
不要在函数中直接修改可变类型的参数。
函数申明应该做到合理、 简单、 易于使用。 除了函数名能够正确反映其大体功能外, 参数的设计也应该简洁明了, 参数个数不宜太多。 参数太多带来的弊端是: 调用者需要花费更多的时间去理解每个参数的意思,测试的时候测试用例编写的难度也会加大。
函数参数设计应该考虑向下兼容。
13 版本注记
如果要将 RCS 或 CVS 的杂项包含在你的源文件中,按如下格式操作:
__version__ = "$Revision: 1.4 $"
# $Source: E:/cvsroot/python_doc/pep8.txt,v $
对于 CVS 的服务器工作标记更应该在代码段中明确出它的使用说明,如在文档最开始的版权声明后应加入如下版本标记:
# 文件:$id$
# 版本:$Revision$
这样的标记在提交给配置管理服务器后,会自动适配成为相应的字符串,如:
# 文件:$Id: ussp.py,v 1.22 2022/08/02 04:47:41 hd Exp $
# 版本:$Revision: 1.4 $
这些应该包含在模块的文档字符串之后,所有代码之前,上下用一个空行分割。
到这里,python的预备知识讲差不多了。