一、Python的文件类型
Python的文件类型主要分为3种,分别是源代码、字节代码和优化代码。
1、源代码
以py为扩展名
2、字节代码
Python源文件经过编译后生成扩展名为pyc的文件,pyc是编译过的字节文件。这种文件不能使用文本编辑工具打开或修改。
下面这段脚本可以把hello.py文件编译为hello.pyc文件
import py_compile py_compile compile("hello.py")
将此脚本保存为以py为扩展名的文件,运行后即可得到hello.pyc文件
3、优化代码
经过优化的源文件生成扩展名为pyo的文件。pyo类型的文件需要命令行工具生成。pyo文件也不能使用文本编辑工具打开或修改。
例子:
用下面的步骤把hello.py文件编译成hello.pyo文件
python -O -m py_compile hello.py
-O:表示生成优化代码;
-m:表示把导入的py_compile模块作为脚本运行。编译hello.pyo需要调用py_compile模块中的compile()方法。
二、Python的编码规则
1、命名规则
变量名的首字符必须是字母或下划线,首字母之外的字符可以由字母、数字或下划线组成,并且不能使用Python的保留字。
常见的规则:
(1)变量名、包名、模块名
变量名通常由字母和下划线组成,包名、模块名通常用小写字母。
#!/usr/bin/env python # -*- coding=utf-8 -*- #变量、模块名的命名规则 #Filename:ruleModule.py ‘‘‘ #Filename:ruleModule.py用于声明模块的名称,模块名用小写字母,也可以不指定模块名,以py后缀的文件就是一个模块。模块名就是文件名。 ‘‘‘ _rule = "rule infornation"#定义了一个全局变量_rule
(2)类名、对象名
类名首字母用大写,其他字母采用小写。对象名用小写字母。类的属性和方法名以对象作为前缀,对象通过操作符“.”访问属性和方法。类的私有变量、私有方法以两个下划线作为前缀。
#!/usr/bin/env python # -*- coding=utf-8 -*- #变量、模块名的命名规则 class Student: #类型用大写字母 __name = "" #私有实例变量前必须有两个下划线 def __int__(self,name): self __name = name def getName(self):#方法名首字母用小写,其后每个单词的首字母用大写 return self __name if __name__ == "__main__" student = Student("Lee")#对象名用小写字母 print student.getName()
(3)函数名
函数名通常采用小写,并用下划线或单词首字母大写来增加名称的可读性,导入的函数以模块作为前缀。
例子:
randrange()的声明如下:
randrange(start,stop[,step])
start:表示生成随机数所在范围的开始数字
stop:表示生成随机数所在方位的结束数字,但不包括数字stop
step:从start开始往后的步数。生成的随机数在[start,stop - 1]的范围内,取值等于start + step
例如:
randrange(1,9,2)随机数范围在1、3、5、7之间取得。
范例:
定义一个行数compareNum(),该函数用于比较两个字的大小,并返回对应的结果。
#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2.7 #Author: [email protected] #函数中的命名规则 import random #导入random模块 def compareNum(num1,num2):#定义函数compareNum if(num1 > num2): return 1 elif(num1==num2): return 0 else: return -1 num1 = random.randrange(1,9)#调用random模块的randrange()返回两个随机数 num2 = random.randrange(1,9) print ("num1 =",num1) print ("num2 =",num2) print (compareNum(num1,num2))
2、代码缩进和冒号
Python使用冒号和代码缩进来区分代码之间的层次。
3、模块导入的规范
模块是类或函数的集合,用于实现某个功能。在Python中,如果需要在程序中调用标准库或其他第三方库的类时,需要先用import或from...import...语句导入相关的模块。
(1)import语句
例子:
#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2.7 #Author: [email protected] import sys #sys模块是处理系统环境的函数的集合。 print (sys.path) #默认情况下会查找sys.path返回的目录列表,列表是Python内置的数据结构,定义了一组数据,通常用来作为参数或返回值 print (sys.argv) #sys.argv是存储输入参数的列表。默认情况下,argv自带的参数是文件名
输出结果:
---------- python2.7 ---------- [‘C:\\Users\\Administrator\\Desktop‘, ‘C:\\Windows\\system32\\python27.zip‘, ‘D:\\Python27\\DLLs‘, ‘D:\\Python27\\lib‘, ‘D:\\Python27\\lib\\plat-win‘, ‘D:\\Python27\\lib\\lib-tk‘, ‘D:\\Python27‘, ‘D:\\Python27\\lib\\site-packages‘] [‘Noname1.py‘] 输出完成 (耗时 0 秒) - 正常终止
(2)from...import...语句
首先解释一下命名空间的概念。命名空间是指标识符的上下文。相同名称的标识符可以在多条命名空间中定义,命名空间中可以定义任何标识符,并且保证这些标识符不会与任何已有的标识符发生冲突。
使用from...import...语句导入与import语句导入有所不同,区别是前者只导入模块中的一部分内容,并在当前的命名空间中创建导入对象的引用;而后者在当前程序的命名空间中创建导入模块的引用,从而可以使用“类名.属性”的方式调用。例如import sys后,可以在当前文件中调用sys.path
例子:
#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2.7 #Author: [email protected] #不规范导入方式 from sys import path from sys import argv print (path) print (argv)
输出结果:
---------- python2.7 ---------- [‘C:\\Users\\Administrator\\Desktop‘, ‘C:\\Windows\\system32\\python27.zip‘, ‘D:\\Python27\\DLLs‘, ‘D:\\Python27\\lib‘, ‘D:\\Python27\\lib\\plat-win‘, ‘D:\\Python27\\lib\\lib-tk‘, ‘D:\\Python27‘, ‘D:\\Python27\\lib\\site-packages‘] [‘Noname1.py‘] 输出完成 (耗时 0 秒) - 正常终止
4、使用空行分隔代码
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。
例子:
创建一个类A,并在类A中定义funX()和funY()这两个方法
#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2 #Author: [email protected] class A: def funX(self): print ("funY()") def funY(self): print ("funX()") if __name__ == "__main__": a = A() a.funX() a.funY()
输出结果:
---------- python2.7 ---------- funY() funX() 输出完成 (耗时 0 秒) - 正常终止
5、正确的注释
注释的用法及其作用
注释的用法 |
作用 |
单行注释 | 说明一行语句的作用 |
块注释 | 说明一段代码的作用或者整个程序文件的功能 |
程序的跨平台 | #!/usr/bin/python |
中文注释的支持 | # -*- coding=utf-8 -*- |
调试程序 | 注释可以帮助程序员调试程序 |
6、语句的分隔
Python主要通过换行来识别语句的结束。
Python支持多行写一条语句,Python使用“\”作为换行符。
三、变量和常量
变量是计算机内存的一块区域,变量可以存储规定范围内的值,而且值可以改变。
常量时一块只读的内存区域,常量一块只读的内存区域,常量一旦初始化就不能修改。
1、变量的命名
变量名由字母、数字或下划线组成。变量名的首字符必须是字母或下划线,首字符之外的字符可以由字母、数字或下划线组成。
例如:
#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2.7 #Author: [email protected] #正确的变量命名 var_1 = 1 print (var_1) _var1 = 2 print (_var1)
输出结果:
---------- python2.7 ---------- 1 2 输出完成 (耗时 0 秒) - 正常终止
2、变量的赋值
Python中的变量不需要声明,变量的赋值操作即是变量声明和定义的过程。每个变量在内存中创建,都包括变量的标识、名称和数据这些信息。
例如:
x = 1
如下所示:
Python中一次新的赋值,将创建一个新的变量。即使变量的名称相同,变量的标识并不相同。
例子:
演示Python的变量声明以及赋值操作。
#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2.7 #Author: [email protected] #一次新的赋值操作,将创建一个新的变量 x = 1 print (id(x)) x = 2 print (id(x))
输出结果:
---------- python2.7 ---------- 31030120 31030096 输出完成 (耗时 0 秒) - 正常终止
说明:调用函数id,输出变量x的标识。每个变量都有一个内部标识,便于变量的维护和管理。
例子:Python支持对一些变量同时赋值的操作
#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2.7 #Author: [email protected] #给多个变量赋值 a = (1,2,3) (x,y,z) = a print ("x = ",x) print ("y = ",y) print ("z = ",z)
输出结果:
---------- python2.7 ---------- (‘x = ‘, 1) (‘y = ‘, 2) (‘z = ‘, 3) 输出完成 (耗时 0 秒) - 正常终止
3、局部变量
局部变量是只能在函数或代码段内使用的变量。函数或代码段一旦结束,局部变量的生命周期也将结束。局部变量的租用范围只在局部变量被创建的函数内有效。
例子:
如果文件1的fun()中定义了一个局部变量,则该局部变量只能被fun()访问。局部变量不能被fun2()访问,也不能被文件2访问。如图所示:
例如:
#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2.7 #Author: [email protected] #局部变量 def fun(): local = 1 print local local = local - 1
输出结果:
---------- python2.7 ---------- Traceback (most recent call last): File "Noname1.py", line 9, in <module> local = local - 1 NameError: name ‘local‘ is not defined 输出完成 (耗时 0 秒) - 正常终止
注意:
Python创建的变量就是一个对象,Python会管理变量的生命周期。Python对变量的回收采用的也是垃圾回收机制。
4、全局变量
全局变量是能够被不同的函数、类或文件共享的变量,在函数之外定义的变量都可以称为全局变量。全局变量可以被文件内部的任何函数和外部文件访问。
例如,如果文件1中定义了一个全局变量,文件1中的函数fun()可以访问该全局变量。此外,该全局变量也能被文件1以外的文件访问。如下:
全局变量通常在文件的开始处定义。
例如:定义两个全局变量_a、_b和两个函数add()、sub(),这两个函数调用全局变量执行加法和减法计算。
#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2.7 #Author: [email protected] #在文件的开头定义全局变量 _a = 1 _b = 2 def add(): global _a #引用全局变量 _a = 3 #对全局变量_a重新赋值 return "_a + _b =",_a + _b def sub(): global _b _b = 4 return "_a - _b =",_a - _b print (add()) print (sub())
输出结果:
---------- python2.7 ---------- (‘_a + _b =‘, 5) (‘_a - _b =‘, -1) 输出完成 (耗时 0 秒) - 正常终止
如果不适用glocbal保留字引用全局变量,而直接对_a、_b赋值,将得到不正确的结果:
#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2 #Author: [email protected] #错误的使用全局变量 _a = 1 _b = 2 def add(): _a = 3 #对全局变量_a重新赋值 return "_a + _b =",_a + _b def sub(): _b = 4 return "_a - _b =",_a - _b print (add()) print (sub())
输出结果:
---------- python2.7 ---------- (‘_a + _b =‘, 5) (‘_a - _b =‘, -3) 输出完成 (耗时 0 秒) - 正常终止
注意:
变量名相同的两个变量可能并不是同一个变量,变量的名称只是起标识的作用。变量出现的位置不同,变量的含义也不同。
可以把全局变量放在一个专门的文件中,这样便于统一管理和修改。
例如:
创建一个名为gl.py的文件
#全局变量 _a = 1 _b = 2
再创建一个调用全局变量的文件use_global.py
# -*- coding=utf-8 -*- #Using GPL v2.7 #Author: [email protected] #调用全局变量 import gl def fun(): print (gl._a) print (gl._b) fun()
输出结果:
---------- python2.7 ---------- 1 2 输出完成 (耗时 0 秒) - 正常终止