Python - Basic
Python解释器
Python程序运行时,需要Python解释器去执行 .py
文件。下面是一些常见的Python解释器。
CPython
当Python安装好之后,CPython解释器就已经安装好了。该解释器是用C语言开发的,所以被称为CPython。在终端执行 python
命令后启动的就是该解释器。
PyPy
PyPy解释器采用JIT技术对Python程序代码进行动态编译,所以PyPy以执行速度见长。
Jython
Jython解释器可以将Python程序代码转换为Java字节码,在Java平台上运行。
IPython
IPython是基于CPython之上的一个交互式(interactive)Python解释器,所以被称为IPython。
- 没有内建到Python自身中的IPython特殊命令称为魔术命令,可以看作是IPython系统内部的命令行程序。魔术命令的前缀符号是百分号
%
。使用魔术命令也可以不加百分号,只要没有变量被定义与魔术函数名字相同即可。这种特性称为自动魔术,通过%automagic
进行启动禁用。
命令 | 描述 |
---|---|
%quickref |
显示IPython快速参考卡。 |
%magic |
显示所有可用魔术命令的详细文档。 |
%debug |
从最后发生报错的底部进入交互式调试器。 |
%hist |
打印历史命令输入。 |
%pdb |
出现任意报错后自动进入调试器。 |
%paste |
从剪贴板中执行已经预先格式化的Python代码。 |
%cpaste |
打开一个特殊提示符,手动粘贴待执行的Python代码。 |
%reset |
删除交互式命名空间中所有的变量、名称。 |
%page OBJECT |
通过分页器更美观地打印显示一个对象。 |
%run SCRIPT.py |
在IPython中运行一个Python脚本。 |
%prun STATEMENT |
使用 CProfile 执行语句,并报告输出。 |
%time STATEMENT |
报告单个语句的执行时间。 |
%timeit STATEMENT |
多次运行单个语句计算平均执行时间(在估算代码最短执行时间时有用)。 |
%who , %who_ls , %whos |
根据不同的详细程度,展示交互命名空间中定义的变量。 |
%xdel VARIABLE |
在IPython内部删除一个变量,清除相关的引用。 |
- 在IPython会话中,可以使用
%run
命令运行任意的Python文件。IPython会在同一个进程内执行指定文件中的代码,确保在执行完成时可以立即得到结果。如果一个Python脚本需要命令行提供参数(通过sys.argv
获得),那么则需要在命令行的文件路径后面加上参数进行传递。如果想让运行的脚本使用交互式IPython命名空间中已有的变量,需要使用%run -i
替代%run
。 %paste
会获得剪贴板中的所有文本,并作为代码块在命令行中执行;%cpaste
与之类似,只不过它会给出一个特殊的提示符提示粘贴代码。%matplotlib
魔术函数可以设置matplotlib与IPython命令行或Jupyter notebook的集成。- 在任意代码运行时按下
Ctrl-C
,无论脚本是通过%run
或是其他长命令运行的,都将引起KeyboardInterrupt
,导致所有的Python程序立即停止运行(某些特殊情况除外)。 - IPython中大多数Python对象会被格式化为更可读、更美观的形式。
- IPython还提供执行任意代码块(通过复制粘贴)和整个Python脚步的功能。
- 在一个变量名的前后使用问号(
?
)可以显示一些关于该对象的概要信息。使用双问号(??
) 可以显示函数的源代码。?
可以像Unix命令行一样搜索IPython命名空间。把一些字符和通配符(*
)结合在一起,会显示所有匹配通配符表达式的命令。
需要启动Jupyter时,可以在终端中运行如下命令。
jupyter notebook
在很多平台上,Jupyter会自动默认网络浏览器(除非启动Jupyter时使用了 --no-browser
命令)。
Python语法
基础
Python采用缩进(tab或者空格)来组织代码,而不是像其他语言(如C++、R、Java和Perl)那样采用大括号。一个冒号代表一个缩进的开始,单个代码块中所有的代码必须保持相同的缩进,知道代码块结束。Python不需要以分号结尾,但是可以用于分隔一行内的多条语句。
Python语言的一个重要特征就是对象模型的一致性。每一个数值、字符串、数据结构、函数、类、模块以及所有存在于Python解释器中的事物,都是Python对象。每个对象都会关联到一种类型(例如字符串、函数)和内部数据。
所有写在 #
之后的文本都会被Python解释器自动忽略。因此,通常使用 #
在代码中添加注释。
几乎所有的Python对象都有内部函数,称为方法,可以访问到对象内部的内容。
在Python中,赋值也称为绑定,因为赋值操作会把一个变量名绑定到一个对象上,被赋值变量名也称为被绑定变量。对一个变量(或者变量名)赋值,本质就是创建一个指向等号右边对象的引用。当把一个对象作为参数传给一个函数时,指向原始对象的新的本地变量就会被创建而无须复制。可以使用关键字 is
和 is not
检查两个引用是否指向同一个对象或不同对象。值得注意的是,函数 list
总是创建一个新的Python列表(即一份拷贝)。
与C++、Java等大多数编译型语言不同,Python中的对象引用并不涉及类型。变量对于对象来说只是特定命名空间中的名称,类型信息是存储在对象自身里的。可以使用函数 isinstance
来检查一个对象是否是特定类型的实例,该函数可以接受一个包含类型的元组作为参数,用于检查对象的类型是否在元组中的类型中。如:
isinstance(a, int) isinstance(a, (int, float))
在Python中,模块就是以 .py
为后缀名并包含Python代码的文件。
输入输出
- 函数
print()
可以接受一个字符串作为参数打印输出;也可以接受以逗号分隔的多个字符串作为参数,打印输出拼接起来的字符串(参数之间的分隔逗号会转化为空格)。 - 函数
intput()
可以将用户在终端的输入赋给字符串变量。
控制流
- 一个
if
语句可以接多个elif
代码块和一个else
代码块。如果某个条件为True
,则后面的elif
和else
代码块不会执行。当使用and
和or
进行混合条件判断时,条件判断是从左到右执行的,而且在and
和or
两侧的条件会有短路现象。 for
循环用于遍历一个集合(如列表或元组)或一个迭代器。使用关键字continue
可以跳出本次循环(跳过其后面的代码)进入下一次循环。关键字break
可以跳出整个for
循环。对于多重循环,break
只能跳出最内层的for
循环,外层的其他for
循环会继续执行。while
循环会在条件符合时一直执行代码块,知道判断条件为False
或显式地通过关键字break
跳出循环。pass
表示不执行任何操作。range
函数返回一个迭代器,该迭代器生成一个等差整数序列。产生的整数包含起始但不包含结尾。- Python的三元表达式可以将一个
if-else
联合起来,在一行代码或一个语句中生成数据。其语法为:
value = true-expression if condition else false-expression
其结果与如下代码块的结果相同:
if condition: value = true-expression else: value = false-expression