一、基本概念 {#一、基本概念}
Python 是一种面向对象的、动态的解释型编程语言,无需编译即可执行,相比于 C++、Java 等高级语言更加轻量化。Python 追求和遵循极简、优雅主义,编码风格受 Linux、C 语言影响较深,官方编程规范中比较推荐使用 小写字母+下划线 来给标识符命名。
二、编码规范 {#二、编码规范}
Python 语言中语句间不使用英文 ~~分号";"~~ 来分割,用行+回车来替代,回车 表示的是一个逻辑行的结束或者代码块的开始。
Python 语言通过 代码缩进 来表示层次关系,和 C++、Java 等语言通过 ~~花括号{}~~ 来表示层次结构有明显不同。Python 中花括号 {} 仅用来表示字典数据类型或者集合数据类型。
Python 中英文 冒号":" 表示代码块的开始,方法、类的定义,或者 if、for、while 等结构体都会使用到。
Python 对大小写敏感,如 A 和 a 代表两个不同的变量。
1、命名规范 {#1、命名规范}
(1)标识符由数字、字母和下划线组成;
(2)不能以数字开头;
(3)不能是系统关键字。
2、命名原则 {#2、命名原则}
(1)用英文或中文拼音,尽量不使用特殊字符; # Python 支持中文字符,但不推荐使用
(2)见名知意,单词缩写时要规范; #如单词 button,缩写为 btn 是比较易于理解的
(3)变量、方法使用全小写字母+下划线的方式; #如 get_name()
(4)类名每个单词首字母大写,对象首个单词首字母小写;
#如 class NetConnInstance、objNetConnInstance = NetConnInstance(url,UA,post)
(5)类中的变量 一般以双下划线/单下划线+全小写字母表示,双下划线+小写字母 表示私有变量 ,类外无法访问;单下划线+小写字母 表示保护变量,本模块、类、对象或子类对象可以访问,但被导入时该变量不能引用;
(6)常量使用全大写字母。
Python 中没有常量的概念,只能使用全大写字母的变量进行模拟,如 PI = 3.14、G = 9.8 ,PI 在 Python 解释器中还是被当做变量处理
Python 中,所有以"__"双下划线包起来的方法,统称为"Magic Method"魔术方法,是python底层已经定义和实现的方法,可以直接访问。如"init(self,name)"。
3、代码风格 {#3、代码风格}
(1)以 4 个空格作为一个代码缩进量;
(2)使用逗号分割的序列中,应该在逗号后添加一个空格;
(3)二元运算符的两侧应该各添加一个空格。
注意,tuple、list、dict 等数据类型内如有二元运算符,运算符两侧不要添加空格。
#第(3)项意义不大,就是阅读起来更舒服而已,Python 这该死的刻在骨子里的优雅。
4、代码注释 {#4、代码注释}
Python 中以"#"号标识注释行,注释应解释方法、类、代码块的作用和关键参数的来源。
5、异常处理 {#5、异常处理}
在编码实现 文件打开与读写、文件下载、网络连接、数据库连接 等不确定性操作时,应尽量使用 try-except 语句,对可能发生的异常进行捕获和处理,避免一个小问题导致整个程序崩溃。
应该捕获尽可能小的异常,并正确处理,而不是简单的抛出、捕获、忽略。
更多 Python 编程规范信息,可参考官方 PEP8 规范指引。
三、数据类型和变量 {#三、数据类型和变量}
Python 中每个变量必须赋值后才会被创建,才能使用;赋值使用"=",赋值"="左侧为变量名,右侧为值。和 C++、Java 语言不一样的是,定义一个变量不需要显式的指定数据类型,变量类型由变量值动态决定。
#给变量直接赋不同类型的值,test = 'this is a string type'、test = 3、test = [1,2,3,4]、test = True 等等。
Python 支持的数据类型可分为数字型和非数字型:
1、数字型: {#1、数字型}
(1)整型(int);
(2)浮点型(float);
(3)布尔型(bool):True or False,可进行 and
,or
,not
运算; #True 默认可转换为整型 1;False 默认可转换为整型 0
2、非数字型: {#2、非数字型:}
(1)字符串(string): 和 C++、Java 中类似,Python 中字符串可用单引号、双引号表示,推荐使用单引号。
当字符串中同时存在单引号、双引号时,双引号会被当做普通字符输出,如 print('this is a "string"'),输出结果是:this is a "string"
(2)元组(tuple): 是一种不可变序列,和 list 列表数据类型正好相反,使用小括号表示,通过下标(从 0 开始)来获取元组中的某个元素。如 tup = (1,2,3,4)、tup[3] 即表示数值 "4"
值得注意的是,元组中所谓的不可变是指引用不可变,如果元组中有 list 列表数据时,还是可以进行修改的。如下图:
修改 change_tup[3][0],即 [4,5] 中"4″的值为 444,可以修改成功;
但是如果直接修改 tup[3],即 (1,2,3,4) 中"4″的值为 444 时,会提示报错:TypeError: 'tuple' object does not support item assignment
(3)列表(list): 是一种可变的序列,使用中括号表示,可通过索引/负数索引来灵活取值、设置。负数索引用 -1 表示最后一个元素或逆序。list 数据类型支持各种操作,如插入(insert)、POP弹出(pop)、附加(append)、负数索引([-1][1])等等。
(4)集合(set): 和接下来要介绍的 Dict 字典数据类型一样,使用花括号{}表示,但集合数据类型要求花括号内的元素不能重复。如果花括号中有重复值时,只会输出第一个重复值,后续的被自动折叠。集合数据类型也支持比较多的操作,如添加(add)、POP弹出(pop)等。
特别说明,集合/字典数据类型中可以加入元组,但不能有列表元素,如 ~~{1,2,3,[1,2,3]}~~ ,这样是不允许的,会提示错误:TypeError: unhashable type: 'list'。
(5)字典(dict): 使用花括号{}表示,花括号内是空的或者键值对。键和值使用英文冒号":"分开,分组间用英文逗号","分开。dict 数据的键 keys 必须是不可变对象(hashable),dict 内部存放的顺序和 keys 放入的顺序无关。
#定义一个字典类型数据,如 user = {'height':'180cm','weight':'75kg','age':'20'}
字典(Dict)是 Python 语言中最经典,也是使用最频繁的一种数据类型了。以下简单列举一些常用操作:
判断一个键是否在字典中:'name' in user #返回布尔类型True/False
添加一个新键或更新键值: user['name'] = 'xiaoming'
批量更新修改多个键值: user.update({'name':'xiaoming','score':'90'})
查询一个键值: user['age']
#更稳妥的用法是使用 get 方法,如 user.get('age',18),如果字典中没有'age'键,则直接给一个default 键值 18。
获取所有键、值、键值对: user.keys()、user.values()、user.items()
遍历字典(键和值): for key in user:
print(key,user[key])
元组、列表、集合和字典数据类型比较:
除列表外,元组、集合、字典数据类型都是可哈希(hashable)的,即其内的元素不会动态改变;
元组的速度和性能高于列表,同等条件下优先使用元组。
四、运算符及格式化输出 {#四、运算符及格式化输出}
1、运算符及数值表示: {#1、运算符及数值表示:}
Python 支持单一赋值、统一赋值和对称赋值; 如 a = 1、a = b = c = 1、a,b = 1,2
Python 中给变量赋整型数值时,支持 16 进制(0x)、8 进制(0o)、2 进制(0b)和 10 进制(默认)形式; #如 a = 0x11,输出打印变量 a 时,值自动转换成 10 进制数 17
浮点数支持使用科学计数法进行表示,如 a = 1.1e-9; #1.1e-9=1.1×10^-9(10的-9次方)
转义字符使用"\",r"(r+单引号)表示单引号范围内的字符不转义; #如print(r'\abc*?""'),输出 \abc*?""
通用运算符和日常使用习惯或者其他编程语言一致,Python中 除法 运算符需要注意一下:
1、"/" 计算结果是浮点数;
2、"//"计算结果是整数;
3、"%"取余数/取模。
如:
4 / 3 = 1.3333333333333333
4 // 3 = 1
4 % 3 = 1
2、格式化输出: {#2、格式化输出:}
类似 C、C++ 中格式化输出,在 print() 中使用格式化操作符%。
%s:表示字符串;
%d:表示有符号十进制整数,%05d 表示输出 5 位的整数,不足部分用 0 补全
%f:表示浮点数,%.2f 表示小点数后显示两位
%%:输出 % 符号。
使用示例:
五、__main__与Python主函数 {#五、__main___与python主函数}
首先,需要强调的是,Python 中没有主函数的概念。我们运行哪个 .py 文件,哪个 .py 文件就是"主函数",它可以正常导入和引用其他 .py 文件或模块上定义的类和方法,它的运行逻辑和 bat、bashshell、powershell 等其他任何语言编写的脚本一样,从上到下执行。if name = "main" 更多的是照顾 C++、Java 等编程人员的使用习惯,是辅助性质的,而不是必须项。
如上图所示,注释掉 NoMainTest.py 文件中的 if name == "main" 语句,python 脚本文件照常能够调用其他 python 文件上的方法、也照常能够运行。
if __name__是一个条件判断语句,如果条件满足,就执行结构体内的语句。在Python中,__name__是个很有意思的变量,当本 .py 被当做脚本运行时,本 .py 文件的__name__的值被设置为"main";而当文件被当做Module被import的时候,它的___name___值就不再是"main"了,而是 .py 文件名称。
这个很好验证,在主运行文件 NoMainTest.py 和被导入文件 main.py 中都定义一个print(name),执行一下,就会发现 main.py 上的__name__是 main,即文件名称(去除文件后缀);而主运行文件 NoMainTest.py 此时的__name__的值为"main"。
总之,"main"并不是Python中主函数的概念,在任意 .py 文件上都可以定义 if name = "main",但是只有主执行文件上的"main"才会生效。所以,日常使用中,应该尽量避免在 if name 结构体中写一些比较关键核心的代码,甚至直接抛弃掉这种写法。干一行爱一行,我们应该接受 Python 与 C++、Java 在编程逻辑和规范上的不同。
六、Python执行 {#六、python执行}
1、Linux 平台上:
python 脚本文件首先需要指定python程序所在路径,即在文件首行添加类似 "#!/usr/bin/python3" 这样的说明信息;
通过 chmod u+x XXX.py 给 python 脚本文件添加可执行权限;
在脚本所在位置, ./XXX.py 运行;或者在任意位置,通过完整路径运行。
2、Windows 平台上:
先安装 python 程序,cmd 中输入 python -V 命令,确认 python 是否可用;
cmd 切换到 python 脚本位置,输入 python XXX.py 命令运行。在任意位置,python [path:]XXX.py 使用完整路径也是可以正常执行的。
另外,python 还支持交互模式,windows 平台 cmd 中输入 python 后回车、Linux 平台输入 python3 后回车,即进入交互模式。交互模式下,可以测试一些简单的输入输出、类型转换等,输入的语句不会被保存,当退出交互环境后立即消失。