本篇将会开始介绍如何使用一些现成的函数,或者说模块,会用即可。对于前面我们学习到的print
、input
等都是python的exe文件在出厂时就已经有的,还有更多函数不是放在exe中的,而是以其他的方式,导入之后使用,导入之后就可以当做普通函数进行使用。
1. import语句
如果我们需要导入其他的模块,以使用其他模块中的函数或者类,我们就需要使用import语句。
import语句有三种形式:
1.1 import模块
import<模块名>
模块就被导入到当前python的名称空间中,我们就可以使用
<模块名>.方法
的方式,来调用模块中的方法(函数)。
比如:我们在ipython中输入randint(1,20)
,显示函数没有定义
In [1]: randint(1,20)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[1], line 1
----> 1 randint(1,20)
NameError: name 'randint' is not defined
在python标准库
中有一个专门randon
的模块,这个模块有很多获取随机数的方法。
In [3]: import random
In [4]: random.randint?
Signature: random.randint(a, b)
Docstring:
Return random integer in range [a, b], including both end points.
File: e:\program files\python\python38\lib\random.py
Type: method
In [5]: random.randint(1,200)
Out[5]: 30
可以通过以下三种方式来查看模块中的方法
(1)dir(random)
In [6]: dir(random)
Out[6]:
['BPF',
'LOG4',
'NV_MAGICCONST',
'RECIP_BPF',
'Random',
'SG_MAGICCONST',
'SystemRandom',
'TWOPI',
'_Sequence',
'_Set',
'__all__',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'_accumulate',
'_acos',
'_bisect',
'_ceil',
'_cos',
'_e',
'_exp',
'_inst',
'_log',
'_os',
'_pi',
'_random',
'_repeat',
'_sha512',
'_sin',
'_sqrt',
'_test',
'_test_generator',
'_urandom',
'_warn',
'betavariate',
'choice',
'choices',
'expovariate',
'gammavariate',
'gauss',
'getrandbits',
'getstate',
'lognormvariate',
'normalvariate',
'paretovariate',
'randint',
'random',
'randrange',
'sample',
'seed',
'setstate',
'shuffle',
'triangular',
'uniform',
'vonmisesvariate',
'weibullvariate']
(2) help(random)
In [8]: help(random)
Help on module random:
NAME
random - Random variable generators.
DESCRIPTION
integers
--------
uniform within range
sequences
---------
pick random element
pick random sample
pick weighted random sample
generate random permutation
distributions on the real line:
------------------------------
uniform
triangular
normal (Gaussian)
lognormal
negative exponential
gamma
beta
pareto
Weibull
(3)random.<TAB补全的方式>
可以看到,用这种方法impot进入的模块,我们使用模块中的方法,需要加上模块名,作为“名称空间”。
加名称空间的好处,避免了不同的模块中有相同的函数名产生冲突
不过,对于某些情况,如果我们确认的只需要模块中的少数方法,我们可以使用from xxx import
的语句。
1.2 from xxx import item
语法:
from<模块名>import<方法名>
这种语法导入的方法,不需要名称空间,可以直接使用。
In [10]: from random import randint
In [11]: randint(22,33)
Out[11]: 32
这种方法的缺点就是可能会带来方法的冲突
1.3 from xxx import *
这种方法不推荐,因为很容易造成方法的名称冲突
语法:
from<模块名>import *
以上语句,将导入模块中的所有变量及方法,使用时不需要名称空间,缺点是很容易产生名称冲突。(后一个覆盖前一个)
In [12]: random.gauss(1,0.1)
Out[12]: 1.0041061585192155
In [14]: gauss(1,0.1)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[14], line 1
----> 1 gauss(1,0.1)
NameError: name 'gauss' is not defined
In [15]: from random import *
In [16]: gauss(1,0.1)
Out[16]: 0.9595171717868856
因此更为推荐第一种方法
2. 模块的本质
- 模块的本质是py文件
- 默认搜索路径sys.path
在现有的first.py
的同文件夹下,创建一个mymodule.py
文件,方法如下:
(1)打开资源管理器
(2)创建新建文件,并命名为mymodule.py
(3)修改文件内容如下:
def add(x,y):
return x+y
def max(x,y):
if x > y:
return x
else:
return y
上述过程就将add(x,y)
等函数放到了mymodule.py
文件中,而在first.py
中如何使用add(x,y)
呢?这在实际的软件工程中是十分有用的,A程序员写A文件,B写B文件,方便分工,也体现函数优势。
在first.py
中代码如下
import mymodule
ret = mymodule.add(100,200)
print(ret)
ret = mymodule.max(100,300)
print(ret)
运行结果:300 300
这时候我们会比较好奇,这里mymodule.py
里的函数可以看见,那么上面使用到的random.randint
方法对应模块在哪里呢?
并不是所有的模块的py文件都是和源码在同一目录下,实际上,import的过程,可以简单看作:
- 在预设的路径中,寻找<模块名>.py( 或者同名目录)
- 将该文件中的内容复制到当前文件
以上的“预设路径”:
- 当前目录
- sys.path中设置的路径(也就是环境变量中设置的路径)
3. 学习视频地址:import语句与模块