|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这是一篇关于python import语句的详细教程
一、什么是 import?
在 Python 中,我们可以把一些功能单独放在一个 “模块”(module)或者 “包”(package)中。
这样做的好处是:
为了在当前 Python 文件中使用这些功能,就需要用到 import 语句。
它的作用就像 “把另外一个文件里的工具拿到我当前文件来用” 一样。
大家可能经常听到过 “模块” 和 “包” 这两个名词,但却搞不清楚它们的区别?
这里顺便做一下解释:
- 模块(Module):一般是一个以 .py 为后缀的 Python 文件,里面可以包含函数、类、变量、常量等。
- 包(Package):包含一个 __init__.py 文件的文件夹,它通常用于组织多个相关的模块,形成一个更大的功能集合。
简单来说:
- 模块是最基本的组织单位,通常就是一个 .py 文件。
- 包可以包含多个模块,甚至可以嵌套更深层次的包。
二、最简单的 import 用法
1. 导入整个模块
当我们想把某个模块的全部功能拿过来使用时,可以使用最基础的 import 语句:
这里我们导入了 Python 自带的 math 模块,它在数学计算方面提供了许多有用的函数和常量,比如 sqrt()、sin()、pi 等等。
导入后,要使用模块中的函数或变量,需要加上模块的名称作为前缀。
例如:
- import math
- # 使用 math 模块里的 sqrt 函数
- result = math.sqrt(16)
- print(result) # 输出 4.0
- # 使用 math 模块里的常量 pi
- print(math.pi) # 输出 3.141592653589793
复制代码
2. 使用别名
在使用外部模块时,如果模块名称比较长或容易拼写错误,可以给模块起一个短一点的别名。
这时我们用 as 关键字来给模块起一个别名,例如:
- import math as m
- result = m.sqrt(16)
- print(result) # 4.0
- print(m.pi) # 3.141592653589793
复制代码
这样,在代码中就可以用 m 代替 math 来调用其中的函数和常量。
三、导入特定的函数或类
有时候我们只想从模块中导入某几个函数(或类、变量等),我们就可以用下面的语法:
例如,我们只想用 math 模块中的 sqrt 函数和 pi 常量,就可以写:
- from math import sqrt, pi
- # 直接使用 sqrt,不需要 math.sqrt
- result = sqrt(25)
- print(result) # 5.0
- print(pi) # 3.141592653589793
复制代码
这样做的好处是简化了调用,不需要再加 math. 前缀。
但是需要注意,如果你的代码中出现了跟 sqrt 或 pi 同名的函数或变量,可能会导致冲突或者覆盖。要尽量避免命名冲突。
四、使用 from ... import *
当需要导入模块中的所有内容(包括函数、常量、类等)时,可以使用:
这样的写法一次性把模块中的所有可用内容都导入到当前作用域。
看似简单方便,但不建议在大型项目中使用,因为导入过多全局符号会增加命名冲突风险,也让程序的可读性变差。
例如:
- from math import *
- print(sqrt(9)) # 3.0
- print(sin(pi/2)) # 1.0
复制代码
虽然这样写很直接,但使用 from math import * 会使得 math 模块中的所有名称都暴露在当前命名空间。
如果有命名冲突,就会比较麻烦。因此小甲鱼并不推荐大家使用这种写法!
《Python 官方风格指南》(PEP 8)也建议避免使用 import *
五、同时导入多个模块或多个函数
1. 同时导入多个模块
在一行里直接逗号分隔即可:
- import os, sys
- # 分别使用 os, sys 做一些操作
复制代码
但更推荐的写法是 每行导入一个模块,这样可读性更高、便于团队协作:
2. 同时导入同一个模块下的多个函数
同理,可以这样做:
- from math import sin, cos, tan
- print(sin(3.14))
- print(cos(3.14))
- print(tan(3.14))
复制代码
不过如果函数非常多,不可读性就会变差;这时可能直接 import math 更好。
六、包与多层级导入
1. 什么是包?
当我们把多个 .py 文件放到同一个文件夹里,并且在这个文件夹下只要有一个 __init__.py 文件(该文件可以是空文件),那么这个文件夹就可以看作一个“包”(package)。
包是为了方便地组织大量的模块,形成清晰的目录结构。
例如,我们有一个文件夹布局如下:
- my_package/
- __init__.py
- module_a.py
- module_b.py
- sub_package/
- __init__.py
- module_c.py
复制代码
这样,my_package 就是一个包,module_a.py、module_b.py 是它的模块,而 sub_package 是一个子包,其中有 module_c.py。
2. 怎样导入包中的模块?
假设我们在 main.py 文件中,想要导入并使用 my_package 下面的 module_a.py,可以写成:
- import my_package.module_a
复制代码
然后,就可以通过:
- my_package.module_a.函数名()
复制代码
来使用 module_a.py 中定义的函数。
如果文件名/函数名太长,也可以加别名。
例如:
- import my_package.module_a as ma
- ma.函数名()
复制代码
当然,如果我们只想从 module_a.py 中导入某个函数,可以使用:
- from my_package.module_a import 函数名
复制代码
3. 多级导入
假设我们在 module_a.py 中也想用到 module_b.py 里的某些东西,也是可以用 import 语句引入。
只要它们在同一个包下,就可以通过包名和模块名来定位。
例如:
- # module_a.py
- from my_package.module_b import some_function
- def example_func():
- return some_function()
复制代码
这样 module_a 中的 example_func() 会返回 some_function() 的结果。
七、if __name__ == "__main__"
在一些 Python 文件中,我们常常能看到如下结构:
- def main():
- # 主函数内容
- print("这个是主函数内容")
- if __name__ == "__main__":
- main()
复制代码
这个写法的作用是在当前文件作为程序入口点执行时,才会去执行 main() 函数里的内容;
如果这个文件被其它文件 import 了,此时 __name__ 的值就不会是 "__main__",那么这里的 if 块就不会执行。
这在模块开发和调试时非常常见,可以确保只有单独运行该文件才执行特定逻辑,而被导入时仅仅提供模块里的函数、类给别人使用。
|
|