本章目录
- Part One:标识符
- Part Two:Python关键字
- Part Three:注释
- Part Four:行与缩进, 空行
- Part Five:多行语句
查了查资料,Python是用模块(module)和 包(package)来组织大型文件的。
模块 是一个由 变量、函数、类 等基本元素组成的功能单元,设计良好的模块通常是高内聚、低耦合、可复用、易维护的。而一个模块内部是可以包含一个或者多个类的。
包 是管理模块的容器,它具有 可嵌套性:一个包可以包含模块和其他包。从文件系统的视角来看,包就是目录,模块就是文件(之前写第一个Python程序里创建的py文件)。
标识符
标示符其实也就是命名规则,在Python里面必须要遵循以下原则:
- 第一个字符必须是字母表中字母或下划线'_';
- 标识符的其他的部分由字母、数字和下划线组成;
- 标识符对大小写敏感;
- 不能使用Python关键字作为标识符名称。
粗看下来,跟Java的命名规则一样,不过也有几点是要尽量避免的规则:
- 单字符名称, 除了计数器和迭代器;
- 包/模块名中的连字符(-);
- 双下划线开头并结尾的名称(Python保留, 例如init)。
同时呢,由于组织结构的不一样(Java是包和类,而Python是包和模块),所以在命名约定上也有一些不同:
- 所谓“内部(Internal)”表示仅模块内可用,或者,在类内是保护或私有的;
- 用单下划线(_)开头表示模块变量或函数是protected的(使用import * from时不会包含);
- 用双下划线(__)开头的实例变量或方法表示类内私有;
- 将相关的类和顶级函数放在同一个模块里。不像Java, 没必要限制一个类一个模块;
- 对类名使用大写字母开头的单词(如CapWords, 驼峰法),但是模块名应该用小写加下划线的方式(如lower_with_under.py)。 尽管已经有很多现存的模块使用类似于CapWords.py这样的命名,但现在已经不鼓励这样做,因为如果模块名碰巧和类名一致,这会让人困扰。
这些可以总结为Python之父Guido推荐的规范:
Type(模块) | Public(公有的) | Internal(内部的) |
---|---|---|
Modules(模块) | lower_with_under | _lower_with_under |
Packages(包) | lower_with_under | |
Classes(类) | CapWords | _CapWords |
Exceptions(异常) | CapWords | |
Functions(函数) | lower_with_under() | _lower_with_under() |
Global/Class Constants(常量) | CAPS_WITH_UNDER | _CAPS_WITH_UNDER |
Global/Class Variables(类变量,即静态变量) | lower_with_under | _lower_with_under |
Instance Variables(实例变量,即成员变量) | lower_with_under | _lower_with_under(protected) or __lower_with_under (private) |
Method Names(方法) | lower_with_under() | _lower_with_under() (protected) or __lower_with_under() (private) |
Function/Method Parameters(参数) | lower_with_under | |
Local Variables(局部变量) | lower_with_under |
综上所述,我们在之前写的第一个python程序其实是不规范的。
我们之前定义的模块名字是:
![](https://img.haomeiwen.com/i6879662/ee1d2fdcc5f3963c.png)
现在应该改成:
![](https://img.haomeiwen.com/i6879662/b6019298cbb17f0a.png)
Python关键字
Python中,不能使用关键字作为标识符。Python的官方API库里面提供了一个keyword模板,可以输出当前版本的所有关键字:
import keyword
var = keyword.kwlist
print(var)
当前总共有33个关键字:
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
注释
注释可以起到一个备注的作用,团队合作的时候,个人编写的代码经常会被多人调用,为了让别人能更容易理解代码的通途,使用注释是非常有效的。
Python中的注释只要有3种:单行注释,多行注释以及编码注释。
- 单行注释
单行注释是以#开头,#号后面的内容编译器会忽略掉。比如:
# 这是一条输出语句
print('Hello World') # 后面的内容会被忽略掉
可以看到,#号后面要加个空格,要不会出现警告。
- 多行注释
多行注释可以用多个# 标注
# 这是一条输出语句
# 第二行注释
print('Hello World')
也可以用''' '''或者""" """包裹
# 这是一条输出语句
# 第二行注释
"""
多行注释
多行注释
"""
'''
多行注释
多行注释
'''
print('Hello World')
同时呢,多行注释的标示也可用于多行字符串,顺道查看了一下官方的源码,发现用#和"""的比较多。
- 编码注释
编码注释在Python2.x用的比较多,因为在旧版里,文件默认使用ASKII码保存文件。而在Python3.x里,文件默认使用unicode编码,这样的话就可以识别中文了,不会让中文产生乱码。
编码注释最标准的格式是:
# -*- coding: <encoding name> -*-
例如:
# -*- coding: gbk -*-
这么写的好处是可以支持多种编辑器,移植性好。
另外,需要注意的是必须将编码注释放在第一行或者第二行。
还有其它比较简单的写法,比如官方源码使用的是:
# encoding: utf-8
还可以是:
# coding=<encoding name>
# vim: set fileencoding=<encoding name> :
总之,所有的标准是按照一个正则表达式给出的:
\%^.*\n.∗\?#.*coding[:=]\s*[0-9A-Za-z-_.]\+.*$
其中的意思就是必须包含#,且#号之前不能有字符换行等其他字符,字符串中必须包含coding后面可以跟:或者=接下来就是编码名称。
行与缩进,空行
Python是使用缩进来表示代码块的,不需要{}。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数,所以最好是用4个空格来控制缩进,例如:
if True:
print("True")
else:
print("False")
而如果缩进不一致呢,IDE工具会自动提示出错误,比如
if True:
print("True")
print("Same")
else:
print("False")
print("Blabla")
会报错:
![](https://img.haomeiwen.com/i6879662/a15b2a8874c516ab.png)
强行运行,也会报错:
![](https://img.haomeiwen.com/i6879662/7bc9ff09da40d7f9.png)
另外,空行也是Python程序的一部分。
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。
空行与代码缩进不同,空行并不是必须要遵守的Python语法。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
如果不加入空行,不会报错,不过会有警告,比如:
![](https://img.haomeiwen.com/i6879662/14c22306660ab8a4.png)
多行语句
- 分行
Python通常是用一行来写完一条语句,但是如果语句过长,可以用\来实现多行,例如:
item_one = 1
item_two = 2
item_three = 3
total = item_one + \
item_two + \
item_three
print(total)
使用Pycharm的话,我们只需要在想要分行的地方敲回车即可。
在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(),例如:
total = ['1', '2', '3'
'4', '5']
总之,使用IDE工具的话,语句的分行并不需要太过在意。
- 一行
前面说的是一行语句分多行显示,那么如果多行语句想写到一行呢,在多条语句间使用分好分割即可,例如:
import sys; x = 'runoob'; sys.stdout.write(x + '\n')
虽然语法上这么写没错,不过IDE工具会报警告,提示
![](https://img.haomeiwen.com/i6879662/15af831cf0d8951b.png)
说明这种写法并不被提倡。
- 代码组
在前面的缩进部分,有提到过代码块这个概念,不过那时候关注的主要是缩进。那么,什么是代码组?
缩进相同的一组语句构成一个代码块,我们称之代码组。
像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。
我们将首行及后面的代码组称为一个子句(clause)。
例如:
a = 3
if a == 1:
print('a')
print('A')
elif a == 2:
print('b')
print('B')
else:
print('c')
又仔细研究了下Python风格规范,貌似还有很多,回头有空再改了,具体参考Google出品的Python风格指南
网友评论