Python程序可以调用一组基本的函数,这称为“内建函数”,包括见到过的 print()
、 input()
和 len()
函数。
这些是最常用的“功能”,因此可以直接使用。
除此最最常用的,Python 还包括一组模块,称为“标准库”,包含了最常用的功能。
每个模块都是一个Python程序,包含一组相关的函数,可以嵌入的程序之中。
例如,math
模块有数学运算相关的函数,random
模块有随机数相关的函数,等等。
可以想见,还有一些常用,以及不常用的模块。
在Python语言中也有其组织的方式,一般称为“第三方类库”。
导入模块
在开始使用一个模块中的函数之前,必须用 import
语句导入该模块。
在代码中,import
语句包含以下部分:
import
关键字;- 模块的名称;
- 可选的更多模块名称,之间用逗号隔开。
下面是import
语句的例子,它导入了 4个不同的模块:
import random, sys, os, math
for i in range(5):
print(random.randint(1, 10))
7 8 10 2 2
random.randint()
函数调用求值为传递给它的两个整数之间的一个随机整数。
因为randint()
属于random
模块,必须在函数名称之前先加上random.
,
告诉python在 random
模块中寻找这个函数。
可将模块视为扩展,通过将其导入可以扩展Python功能。要导入模块,可使用特殊命令 import
。
前一节提及的函数 floor
包含在模块 math
中。
math.floor(32.9)
32
请注意其中的工作原理:使用 import
导入模块,再以 module.function
的方式使用模块中的函数。
就这里执行的操作而言,也可像前面处理 input
的返回值那样,将这个数字转换为整数。
int(32.9)
32
注意:还有一些类似的函数,可用于转换类型,如 str
和 float
。
实际上,它们并不是函数,而是类。类将在本书后面更详细地介绍。
模块 math
还包含其他几个很有用的函数。例如, ceil
与 floor
相反,
返回大于或等于给定数的最小整数。
math.ceil(32.3)
33
math.ceil(32)
32
如果确定不会从不同模块导入多个同名函数,可能不想每次调用函数时都指定模块名。
在这种情况下,可使用命令 import
的如下变种:
from math import sqrt
sqrt(9)
3.0
通过使用命令 import
的变种 from module import function
,可在调用函数时不指定模块前缀。
提示:事实上,可使用变量来引用函数(以及其他大部分Python元素)。
执行赋值语句 foo = math.sqrt
后,就可使用 foo
来计算平方根。例如, foo(4)
的结果为 2.0
。
函数 sqrt
用于计算平方根。下面来看看向它提供一个负数的情况:
from math import sqrt
sqrt(-1)
在有些平台上,结果如下:
sqrt(-1)
nan
注意 nan
具有特殊含义,指的是“非数值”(not a number)。
如果坚持将值域限定为实数,并使用其近似的浮点数实现,就无法计算负数的平方根。 负数的平方根为虚数,而由实部和虚部组成的数为复数。 Python标准库提供了一个专门用于处理复数的模块。
import cmath
cmath.sqrt(-1)
1j
注意到这里没有使用 from ... import ...
。
如果使用了这种 import
命令,将无法使用常规函数 sqrt
。
类似这样的名称冲突很隐蔽,因此除非必须使用 from
版的 import
命令,
否则应坚持使用常规版 import
命令。
1j
是个虚数,虚数都以 j
(或 J
)结尾。
复数算术运算都基于如下定义: -1
的平方根为 1j
。
这 里不深入探讨这个主题,只举一个例子来结束对复数的讨论:
(1 + 3j) * (9 + 4j)
(-3+31j)
从这个示例可知,Python本身提供了对复数的支持。 注意:Python没有专门表示虚数的类型,而将虚数视为实部为零的复数。 现在可以使用这4个模块中的所有函数。
from random import randint
导入 sys
模块:
import sys
print('================Python import mode==========================');
print ('命令行参数为:')
for i in sys.argv:
print (i)
================Python import mode========================== 命令行参数为: /opt/conda/lib/python3.12/site-packages/ipykernel_launcher.py -f /home/jovyan/.local/share/jupyter/runtime/kernel-a14928d3-622e-45fa-a026-fb74e0c65746.json
注意此处是在 JupyterLab 环境中运行,所以得到的结果与直接使用 Python 环境的结果是很不相同的。
print ('\n python 路径为',sys.path)
python 路径为 ['/opt/conda/lib/python312.zip', '/opt/conda/lib/python3.12', '/opt/conda/lib/python3.12/lib-dynload', '', '/opt/conda/lib/python3.12/site-packages']
导入 sys
模块的 argv
, path
成员。
from sys import argv,path # 导入特定的成员
print('================python from import===================================')
print('path:',path) # 因为已经导入path成员,所以此处引用时不需要加sys.path
================python from import=================================== path: ['/opt/conda/lib/python312.zip', '/opt/conda/lib/python3.12', '/opt/conda/lib/python3.12/lib-dynload', '', '/opt/conda/lib/python3.12/site-packages']
module1.open(...)
module2.open(...)
但还有一种办法: 在语句末尾添加as
子句并指定别名。
下面是一个导入整个模块并给它指定别名的例子:
import math as foobar
foobar.sqrt(4)
2.0
下面是一个导入特定函数并给它指定别名的例子:
from math import sqrt as foobar
foobar(4)
2.0
import fibo, sys
dir(fibo)
如果没有给定参数,那么 dir()
函数会罗列出当前定义的所有名称。