基本上每个人学习的第一门编程语言都是C语言,对编程的基本思维方式和语句都熟悉了,所以在学习新的编程语言时,可也跳过这些(不是真的跳过,还是要粗略看点的,尤其注意它和自己掌握最好一门语言的差异),将更多的经历去理解新语言的特点和其思想。
一、特点
Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。
解释型:Python程序不进行预编译,在执行时先解释机器码在执行(由解释器完成),解释是一行一行的,所以很慢,而且每执行一次就要翻译一次,效率比较低。如Matlab、Html等。
面向对象:OOP思想这里就不多说,增加了可维护性,可扩展性,可重用性。
动态数据类型:变量不需要指定数据类型(即变量的类型是根据它所指向的内存单元中的数据类型决定的,因此不需要声明,指向什么类型,就是什么类型)。Python的变量,可变的是指向,不可通过变量名修改其指向数据单元的内容(即某个内存单元中的数据内容是固定不变的),如:
# 12的地址为0x12345672
# 13的地址为0x12345673
# 14的地址为0x12345674
# 15的地址为0x12345675
x = 12 # x指向的地址为0x12345672
y = 12 # y指向的地址为0x12345673
x = y # x指向的地址为0x12345673, x = y 的含义是让引用x指向引用y所指的那一的对象
x = 14 # x指向的地址为0x12345674
y = 15 # x指向的地址为0x12345675
x = y # x指向的地址为0x12345675
# x和y指向内存地址,类似C语言的指针;内存单元中的数据内容是固定不变的,
# 例如内存单元0x12345672 始终保存数据12,直到程序结束,释放空间
静态数据类型,如c语言,声明变量时必须指明数据类型,因为要为每个变量提前分配好固定大小的内存空间,变量一直指向内存单元,内存单元的内容一直在变。
二、基本思想
1、典型的Python文件结构:
注意:(1)表示说明解释器的路径,必须在第一行
2、Python程序的执行起点
在C/C++/Java中,main是程序执行的起点,Python中,也有类似的运行机制,但方式却截然不同:Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数。如:
#!/usr/bin/python
x = 1
y = 2
print x
print y
程序从上到下执行
每个文件(模块)都可以任意写一些没有缩进的代码,并且在载入时自动执行,为了区分主执行文件还是被调用的文件,Python引入了一个变量__name__,当文件是被调用时,__name__的值为模块名,当文件被执行时,__name__为'__main__'。如:
#!/usr/bin/python
print 'this is python'
def test():
print 'hello word'
if __name__ == '__main__':
test()
输出结果:
this is python
hello word
总结一下:
如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!
写代码不可能一个文件写下去,这样可维护性太差。为此C和C++引入头文件,Python则引入模块。
在Python中,一个.py文件就称之为一个模块(Module),abc.py文件的模块名为abc。
模块可以避免函数名和变量名冲突,相同名字的函数和变量完全可以分别存在不同的模块中,但尽量不要重名。
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
模块导入语句:
#导入test.py
import test
#从模块中导入一个指定的部分到当前命名空间
#从模块 fib 的 fibonacci 函数
from fib import fibonacci
#把一个模块的所有内容全都导入到当前的命名空间
#引入 math 模块中所有的东西
from math import *
模块使用:
# 调用support模块里包含的print_func函数
support.print_func("Runoob")
包(Package):
包其实就是文件夹,与普通文件不同的是文件下多了个空的__init__.py,如果没有__init__.py这个文件,Python就把这个目录当成普通目录,而不是一个包。引入包后abc.py模块名由abc变为packa_test.abc了。
可以有多级目录,组成多级层次的包结构,如下:
www.py的模块名为packa_test.web.www