python变量特性 + 命名规则
Python 需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、方法命名的符号(简单来说,标识符就是合法的名字)。
Python 语言的标识符必须以字母、下画线(_)开头,后面可以跟任意数目的字母、数字和下画线(_)。此处的字母并不局限于 26 个英文字母,可以包含中文字符、日文字符等。
由于 Python 3 支持 UTF-8 字符集,因此 Python 3 的标识符可以使用 UTF-8 所能表示的多种语言的字符。Python 语言是区分大小写的,因此 abc 和 Abc 是两个不同的标识符。
Python 2.x 对中文支持较差,如果要在 Python 2.x 程序中使用中文字符或中文变量,则需要在 Python 源程序的第一行增加“#coding:utf-8”,将源文件保存为 UTF-8 字符集。
在使用标识符时,需要注意如下规则:
- 标识符可以由字母、数字、下画线(_)组成,其中数字不能打头。
- 标识符不能是 Python 关键字,但可以包含关键字。
- 标识符不能包含空格。
例如下面变量,有些是合法的,有些是不合法的:
abc_xyz:合法。
HelloWorld:合法。
abc:合法。
xyz#abc:不合法,标识符中不允许出现“#”号。
abc1:合法。
1abc:不合法,标识符不允许数字开头。
Python 的关键字和内置函数
Python 还包含一系列关键字和内置函数,一般也不建议使用它们作为变量名:
- 如果开发者尝试使用关键字作为变量名,Python 解释器会报错。
- 如果开发者使用内置函数的名字作为变量名,Python 解释器倒不会报错,只是该内置函数就被这个变量覆盖了,该内置函数不能使用。
Python 包含了如表 所示的关键字:
Python 关键字
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 非常方便,开发者可以通过 Python 程序来查看它所包含的关键字。例如,对于如下程序:
#导入keyword 模块
import keyword
#显示所有关键字
keyword.kwlist
从上面代码可以看出,程序只要先导入 keyword 模块,然后调用 keyword.kwlist 即可查看 Python 包含的所有关键字。运行上面程序,可以看到如下输出结果:
['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 还提供了所示的内置函数。
Python内置函数
abs() | all() | any() | basestring() | bin() |
---|---|---|---|---|
bool() | bytearray() | callable() | chr() | classmethod() |
cmp() | compile() | complex() | delattr() | dict() |
dir() | divmod() | enumerate() | eval() | execfile() |
file() | filter() | float() | format() | frozenset() |
getattr() | globals() | hasattr() | hash() | help() |
hex() | id() | input() | int() | isinstance() |
issubclass() | iter() | len() | list() | locals() |
long() | map() | max() | memoryview() | min() |
next() | object() | oct() | open() | ord() |
pow() | print() | property() | range() | raw_input() |
reduce() | reload() | repr() | reversed() | zip() |
round() | set() | setattr() | slice() | sorted() |
staticmethod() | str() | sum() | super() | tuple() |
type() | unichr() | unicode() | vars() | xrange() |
Zip() | import() | apply() | buffer() | coerce() |
intern |
上面这些内置函数的名字也不应该作为标识符,否则 Python 的内置函数会被覆盖。
注意:
在 Python 2.x 中,print 是关键字而不是函数。上面这些内置函数(如 unicode())只是 Python 2.x 的内置函数,为了保证 Python 程序具有更好的兼容性,程序也不应该使用这些内置函数的名字作为标识符。
注释方法
注释是任何程序的一个组成部分,它们可以以注释块的形式或者在代码行中出现,来帮助阐明解释一个复杂的函数。
假设在以下两种情况中,程序员不对代码进行注释。
- 当阅读你自己的代码时
你花了几个小时分析你的旧代码,但你完全迷失在混乱中。您当时非常匆忙,没有正确命名变量,甚至没有在适当的控制流中设置函数。最糟糕的是,脚本中没有任何注释来告诉您什么是什么!
开发人员总是忘记他们自己的代码所做的事情,尤其是如果代码是在很久以前编写的,或者是在很大的压力下编写的。当最后期限快到了,在电脑前几个小时导致眼睛充血时,这种压力可以用比平时更混乱的代码形式反映出来。
一旦提交了项目,许多开发人员就会因太累了,根本无法回过头来注释他们的代码。当到了之后重新来用它的时候,可能要花上几个小时来分析自己所写的东西。
边写代码边写注释是防止上述情况发生的一个很好的方法,请善待未来的你!
- 当别人在阅读你的代码时
新的开发人员努力工作,以迅速投入进来,但在合作的头几天,你便会意识到他们会遇到一些麻烦。在项目代码中,您使用了一些奇怪的变量名,并使用超级简洁的语法编写。这就导致新员工会花费大量的时间逐行遍历您的代码,以试图弄清楚它是如何工作的。
在这种情况下,在代码中使用注释可以很好地帮助其他开发人员读懂你的代码,您可以通过从项目一开始就对代码进行注释来帮助与其他开发人员的合作。
注释方式
方式1:
单行注释:shift + #(在代码的最前面输入,非选中代码进行注释)
多行注释:同单行一样在每一行的前面输入shift + #(较麻烦了)
方式2:
单行和多行一样的方式:Ctr+ / (选中需要注释的代码)
方式3:
输入’’’ ‘’'或者""" “”",将要注释的代码块插在中间
‘’’
这是使用单引号的多行注释。
‘’’
“”"
这是使用双引号的多行注释。
“”"
python中“:” 的作用
1、列表中用于定义分片、步长。
a[ : n]表示从第0个元素到第n个元素(不包括n),a[1: ] 表示该列表中的第1个元素到最后一个元素。
list1[:3:2],tul1[3:6:2](注意3:6是索引第3至5,不包含6)
L[2] 读取列表中第三个元素,也即第2个元素
L[-2] 读取列表中倒数第二个元素
L[1:] 从第二个元素开始截取列表
2、像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。
dir()
dir()
函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__()
,该方法将被调用。如果参数不包含__dir__()
,该方法将最大限度地收集参数信息。
dir 语法:
dir([object])
参数说明:
object -- 对象、变量、类型。
返回值
返回模块的属性列表。
help()
help()
函数用于查看函数或模块用途的详细说明。
help 语法:
help([object])
参数说明:
object -- 对象;
返回值
返回对象帮助信息。
import使用
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
下例是个简单的模块 support.py
:
support.py 模块:
def print_func( par ):
print "Hello : ", par
return
import 语句
模块的引入
模块定义好后,我们可以使用 import 语句来引入模块,语法如下:
import module1[, module2[,... moduleN]]
比如要引用模块 math,就可以在文件最开始的地方用 import math 来引入。在调用 math 模块中的函数时,必须这样引用:
模块名.函数名
当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。
搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块 support.py,需要把命令放在脚本的顶端:
test.py
文件代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入模块
import support
# 现在可以调用模块里包含的函数了
support.print_func("Runoob")
以上实例输出结果:
Hello : Runoob
一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
from…import 语句
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:
from modname import name1[, name2[, ... nameN]]
例如,要导入模块 fib 的 fibonacci 函数,使用如下语句:
from fib import fibonacci
这个声明不会把整个 fib 模块导入到当前的命名空间中,它只会将 fib 里的 fibonacci 单个引入到执行这个声明的模块的全局符号表。
from…import* 语句
把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
from modname import *
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
例如我们想一次性引入 math 模块中所有的东西,语句如下:
from math import *
搜索路径
当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
- 1、当前目录
- 2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
- 3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
pep8介绍
pep8是一套为了使python语言代码更加规范的一套标准。
比较需要注意的:
缩进
每一级缩进使用4个空格。
续行应该与其包裹元素对齐,要么使用圆括号、方括号和花括号内的隐式行连接来垂直对齐,要么使用挂行缩进对齐3。当使用挂行缩进时,应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行。
行的最大长度
所有行限制的最大字符数为79。
没有结构化限制的大块文本(文档字符或者注释),每行的最大字符数限制在72。
空行
顶层函数和类的定义,前后用两个空行隔开。
类里的方法定义用一个空行隔开。
Imports 导入
导入通常在分开的行,例如:
推荐:
import sys
不推荐:
import sys, os
也可以:
from subprocess import Popen, PIPE
导入总是位于文件的顶部,在模块注释和文档字符串之后,在模块的全局变量与常量之前。
导入应该按照以下顺序分组:
- 标准库导入
- 相关第三方库导入
- 本地应用/库特定导入
- 你应该在每一组导入之间加入空行。