图|源自网络
文|一张顾巷
初识交互式编程、脚本式编程
//交互式编程//
交互式编程 不需要创建脚本文件
,通过 Python 解释器的交互模式即可编写代码。
Window 上在安装 Python 时已经安装了交互式编程客户端,提示窗口如下:
在 python 提示符中输入文本“Hello, Python!”,然后按 Enter 键即可查看运行效果:
>>> print ("Hello, Python!")
,以上实例输出结果如下:
Hello, Python!
//脚本式编程//
脚本式编程是通过脚本参数调用解释器执行脚本。所有 Python 文件将以 .py 为扩展名。
让我们写一个简单的 Python 脚本程序。将上文中的print(“Hello, Python!”)拷贝至 test.py 文件中。
假设你已经按第一篇中的步骤,正确设置了 Python 解释器 PATH 变量。使用以下命令运行程序:
$ python test.py
输出结果:
Hello, Python!
基础语法
//标识符及命名规则//
- 标识符只可由字母、数字、下划线组成。但不能以数字开头。
- 标识符区分大小写。
- 命名不能占用python关键字
可以通过keyword模块的 kwlist 函数
查询所有关键字,代码如下:
import keywordprint(keyword.kwlist)
以下划线开头的标识符是有特殊意义的。
以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入。
以双下划线开头的 _foo 代表类的私有成员,以双下划线开头和结尾的 _foo 代表 Python 里特殊方法专用的标识,如 __init__()代表类的构造函数。
//命令行参数//
很多程序可以执行一些操作来查看一些基本信息,Python 可以使用 -h 参数查看各参数帮助信息:
$ python -h
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... Options and arguments (and corresponding environment variables): -c cmd : program passed in as string (terminates option list) -d : debug output from parser (also PYTHONDEBUG=x) -E : ignore environment variables (such as PYTHONPATH) -h : print this help message and exit [ etc. ]
我们在使用脚本形式执行 Python 时,可以接收命令行输入的参数,具体使用可以参照 Python 命令行参数。
//行&缩进//
Python不像其他编程语言,可以通过大括号{}来对代码块进行划分,只能通过 缩进
来对 语句
进行 分组
,所谓的缩进就是每行代码前的 空白间隙
。 相同的空白间隙表示这些语句处于同一个层级,所以正确的缩进就显得非常重要,建议使用 Tab来进行缩进。
此外,如果你想 多个语句写到同一行,
可以使用; 分号
进行分隔。 有时 语句太长
,你还可以使用 \反斜杠
来衔接,而在 []{}()里分行不需要反斜杠衔接!
注释与模块
//注释//
注释是一段 「解释性」文本,程序运行时,会跳过不做处理,一般是对代码的解释或提示,以此提高代码的可读性。写注释既方便了别人阅读代码,也方便自己日后回顾,而不用苦思冥想当初写这段代码的目的。当然注释也不是写的越多越好,应 尽量避免没用的注释或写过多的废话。
Python中提供了两种注释方式:「 单行注释
」和「 多行注释
」,单行注释通过#进行标识,多行注释则通过 两个三引号
来标识,代码示例如下:
# 一个单行注释
"""多行注释示例"""
//模块//
- 模块的基本使用
模块其实就是一个Python文件,以 .py结尾,包含了Python定义和声明。
举个简单例子,你可以把 常用的代码块抽取出来 放到一个单独的py文件中,然后在用到的地方对自己的模块进行引用,模块引用示例如下:
# 导入整个模块import sys# 导入模块中的需要用到的部分from sys import argv# 多个的时候可以用逗号隔开from urllib.error import URLError, HTTPError# 导入模块中所有不是以下划线开头的名字,不建议这样做,如果同名会覆盖# 定义过的名字;如果你硬想用这种导入方式,可以添加__all__成员来进行约束# 比如:__all__ = ['a','b']from sys import *
另外,在导入自己的模块时,可能遇到这个问题:写在模块里的测试代码都执行了???
可以通过内置属性 __name__
来区分,当此模块作为程序运行时, 值
会等于 __main__
, 而作为一个模块导入到其他程序,值则 等于文件名字
(去掉.py)。 所以可以通过判断: __name__ 是否
等于
__main__
来决定测试代码是否执行。示例如下:
if __name__ == '__main__': test()
- 模块的搜索路径与顺序
可以通过打印 sys.path
来查看模块的搜索路径。 模块的搜索顺序:
程序所在目录→标准安装目录→标准库安装目录→Python环境变量所包含的目录
所以,如果自定义的模块与内置模块重名的话,会调用自定义模块而非内置的模块,因此在命名模块时应尽量 避免重名
。如果硬是要同名且两个模块都用到,可以使用 完整路径引入
,并使用 as关键字
为模块 设置别名
。 此外,如果你的模块都不在这些搜索路径里的话,可以通过调用sys.path.append("路径") 临时把路径添加到搜索路径中。
- 重复导入一个模块后会怎样
第一次导入后就将模块名加载到内存中,后续的import只是对已加载到内存中的 模块对象增加一次引用, 不会重新执行模块里的语句
。
- __init__.py文件的作用
标识文件所在的目录是一个 python的模块包(package)
,一般是空文件,当然你也可以加点东西来控制包的导入行为,直接在__init__.py 文件中批量导入所需模块,而不用一个个导入,除此之外,还可以将一些初始化代码放入其中。
- 模块的重载
上面说了重复导入模块,只是新增一个引用,而不会重新导入。有时可能需要在同一个会话中去更新模块,可以通过 imp标准库中的reload函数
来完成。
from imp import reloadreload(模块名)