Python 的运行机制

怎么运行写好的 Python 脚本呢?

一般都是用 IDE 来执行写好的代码, 那 IDE 是用什么来执行 Python 代码呢?

IDE 是用 Python 来运行代码。什么?用 Python 来运行 Python?这背后又是怎么运行的呢?

其实在安装 python 的过程中,还会安装一个解释器,实际上是这个解释器在运行代码,刚好这个解释器也叫Python,按理说,这个应该叫 Python 解析器,但很多时候都没有对这两者有什么区分,因此也就习惯了。

所以,Python 实际上是用 Python 解释器运行 Python 代码。

如果使用过 Java 语言,可能会想问,Python 解析器是不是就像是 Java VM

是,也不是。说它是,是因为解释器会运行代码,说它不是则是因为运行的方式不同。在 Python 中,没有将原地啊吗编译为“可自行代码”的概念。与 Java VM 不同,解释器并不运行 .class 文件,它会直接运行你的代码。

那是怎么完成编辑的呢?

Python 的解释器不会把编译过程展示出来。所有的细节都由它负责,不需要程序员操心。我们看到的只有代码在运行,因为 IDE 会完成所有的具体工作,代表你与解释器交互。

Python 的标准库

Python 提供了非常丰富的标准库模块,几乎能满足绝大多数的编程场景。那怎么知道有哪些标准库呢,这些标准库又有哪些功能呢,python 文档有完整的介绍,地址在这里 https://docs.python.org/3/library/index.html

当然,除了丰富的标准库,Python 社区还提供了非常丰富的第三方库,地址在这里 https://pypi.org/

Python 的缩进

Python 一条语句的结束不是用大括号{}来结束的,而是一行就是一条语句(当然多行也可以是一条一句,但需要由特定的规则包围),也就是说,Python 的执行是一行接着一行执行的。

而缩进,则是标示着这是代码块,每一个缩进都代表着一个代码块。通俗说,Python 用缩进来确认几行是“一起的”,是在一个 {} 内的,冒号: 引入一个缩进的代码组

for i in range(5):
    if i/2 == 0:	# 这是一个代码组
        print("这是偶数")	# 这也是一个代码块
    else:	# 和if是同一个代码组
        pirnt("这是奇数")	# 这是又是一个代码块
    

Python 的缩进是非常严格的,一般情况下 IDE 会帮助代码自动缩进,因此运行时基本不会有缩进的语法错误。但 Python 的缩进并不严格等于 1个 Tab 或者4个空格,虽然多数情况下用1个 Tab 或者4个空格,IDE 并不会提示语法错误,而多数情况下代码运行也不会报错,但可能在特别的运行环境下,就有可能带来这种缩进语法错误。

>>>IndentationError: unexpected indent
  

Python 的导入机制

当编写代码需要使用该文件外的模块或者库模块(标准库和第三方库,暂时这么叫吧)时,就需要使用 Python 的导入机制来完成了。

Python 的导入机制有另种形式:

  • import time
  • from time import sleep

等等?Python 有两种带入机制?

其实不是,Python 只有一种导入机制,因为只有一个 import 语句,不过,这个 import 语句有两种用法。那这两种用法有什么区别呢?

第一种用法,也就是(import time),采用这种方式导入时,必须使用点记法语法来访问模块的功能,比如 time.sleep()。

而第二种用法,也就是(from time import sleep),采用这种方式导入时,会把一个指定的函数导入到程序的命名空间,这允许我们在必要时直接调用这个函数。(命名空间的概念在 Python 中很重要,因为它定义了运行代码的上下文)

有没有使用 import 的正确方法呢?

用法因人而异,全凭个人喜好,使用哪种用法都是正确的,在使用时时情况而定就好,不会影响程序的运行。但特殊情况下,可能需要使用合适的用法,比如:同时有两个不同的模块,定义的方法名是相同的,如果同时都使用 from x import y 导入,那程序怎么区分调用 y() 是那个 x 的呢,此时使用 import x1、import x2 导入,调用时可以使用 x1.y()、x2.y() 来区分不同的 y() 方法。

Python 解释器的使用小技巧

有时候,如果想快速知道一个库里面有什么模块方法可以提供使用时,该怎么办呢?

  1. 查官方文档或者其他网上文档
  2. 使用 Python shell

使用 Python shell 可以更加快速的得知一个库有什么模块方法,以及该模块方法的具体用法,那怎么使用呢?

首先,需要进入 Python shell 环境,在 cmd 输入 Python 或者 Python3 分别进入 Python2 和 Python3 的 Python shell,导入对应的库,则可以使用不同的方法获取相关信息了:

>>>import time
>>>dir(time)
['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'monotonic_ns', 'perf_counter', 'perf_counter_ns', 'process_time', 'process_time_ns', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'time_ns', 'timezone', 'tzname', 'tzset']

>>>help(time.sleep)
Help on built-in function sleep in module time:

sleep(...)
    sleep(seconds)

    Delay execution for a given number of seconds.  The argument may be
    a floating point number for subsecond precision.
(END)

dir 会显示 Python 中某一个库相关的所有属性,包含的模块;help 会展示某一个函数的文档,按 q 退出。

学习内容来自《Head First Python》