Python - Basic

Table of Contents

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中,赋值也称为绑定,因为赋值操作会把一个变量名绑定到一个对象上,被赋值变量名也称为被绑定变量。对一个变量(或者变量名)赋值,本质就是创建一个指向等号右边对象的引用。当把一个对象作为参数传给一个函数时,指向原始对象的新的本地变量就会被创建而无须复制。可以使用关键字 isis not 检查两个引用是否指向同一个对象或不同对象。值得注意的是,函数 list 总是创建一个新的Python列表(即一份拷贝)。

与C++、Java等大多数编译型语言不同,Python中的对象引用并不涉及类型。变量对于对象来说只是特定命名空间中的名称,类型信息是存储在对象自身里的。可以使用函数 isinstance 来检查一个对象是否是特定类型的实例,该函数可以接受一个包含类型的元组作为参数,用于检查对象的类型是否在元组中的类型中。如:

isinstance(a, int)
isinstance(a, (int, float))

在Python中,模块就是以 .py 为后缀名并包含Python代码的文件。

输入输出

  • 函数 print() 可以接受一个字符串作为参数打印输出;也可以接受以逗号分隔的多个字符串作为参数,打印输出拼接起来的字符串(参数之间的分隔逗号会转化为空格)。
  • 函数 intput() 可以将用户在终端的输入赋给字符串变量。

控制流

  • 一个 if 语句可以接多个 elif 代码块和一个 else 代码块。如果某个条件为 True ,则后面的 elifelse 代码块不会执行。当使用 andor 进行混合条件判断时,条件判断是从左到右执行的,而且在 andor 两侧的条件会有短路现象。
  • 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