CodeGym /课程 /Python SELF ZH /导入模块

导入模块

Python SELF ZH
第 19 级 , 课程 0
可用

1.1 模块简介

Python中的模块是一个以.py为扩展名的文件,包含代码。模块允许将大的代码拆分成较小的、可管理的部分。每个模块可以包含函数、类和变量,以及在导入时执行一些代码。

简单模块示例

创建一个模块mymodule.py:


# mymodule.py

def greet(name):
    return f"Hello, {name}!"
            
pi = 3.14159
        

现在可以在其他文件中导入并使用该模块。

1.2 导入模块

Python提供了几种导入模块的方法。我们来看一下。

导入整个模块

这种操作的语法通常是这样的:


import 模块

这种方法会导入整个模块,你可以通过指定模块名来使用其函数和变量。


import 模块

print(模块.greet("Alice"))  # 输出: Hello, Alice!
print(模块.pi)  # 输出: 3.14159
        

我们之前用math模块做过类似的事情,还记得吗?


import math

print(math.ceil(13 / 7))  # 向上取整
print(math.floor(13 / 7))  # 向下取整
        

从模块中导入特定元素

你可以选择只导入模块中的某些元素。操作的语法通常是这样的:


from 模块 import func, var

这种方法只导入模块中的特定函数、类或变量,使用这些元素时无需指定模块名。


from mymodule import greet, pi

print(greet("Bob"))  # 输出: Hello, Bob!
print(pi)  # 输出: 3.14159
        

使用别名导入模块

操作的语法通常是这样的:


import 模块 as alias

这种方法允许导入模块并为其分配另一个名称,这在缩短模块名或解决名称冲突时尤为有用。


import mymodule as mm

print(mm.greet("Charlie"))  # 输出: Hello, Charlie!
print(mm.pi)  # 输出: 3.14159
        

从模块中导入所有元素

操作的语法通常是这样的:


from 模块 import *

这种方法会导入模块中所有的函数、类和变量,使用时无需指定模块名。但不推荐使用这种方法,因为它可能导致名称冲突,使代码难以阅读。


from mymodule import *

print(greet("Dave"))  # 输出: Hello, Dave!
print(pi)  # 输出: 3.14159
        

1.3 模块导入背后的机制

模块搜索顺序

当你导入一个模块时,Python会按照特定的顺序查找它:

  1. 当前目录: Python首先在执行脚本的当前目录查找模块。
  2. 环境变量PYTHONPATH: 如果在当前目录找不到模块,Python会在环境变量PYTHONPATH中指定的目录中查找。
  3. 标准目录: 如果模块仍未找到,Python会在标准目录中查找,如sys.path中指定的目录。

示例:


import sys

for path in sys.path:
    print(path)
        

局部和全局导入

模块导入可以在全局级别(文件开头)或局部级别(函数或方法内部)进行。

全局导入

全局导入在文件开头进行,使导入的模块在整个文件中可用。


import math

def calculate_circle_area(radius):
    return math.pi * radius ** 2
        

局部导入

局部导入在函数或方法内部进行,使导入的模块仅在该函数或方法中可用。


def calculate_square_root(x):
    import math
    return math.sqrt(x)
    
print(calculate_square_root(16))
        

局部导入可用于减少模块加载时间或防止名称冲突。

1.4 动态导入

动态导入允许在程序运行时导入模块。当需要基于用户输入或其他动态条件导入模块时,这可能是有用的。

操作的语法通常是这样的:


module = __import__("模块")

让我们举个例子,用这种方法导入math模块。


module_name = "math"
module = __import__(module_name)
print(module.sqrt(16))  # 输出: 4.0

后续的代码使用类似import as的方式,当模块math被赋给别名module时。

1.5 使用getattr函数访问模块属性

getattr函数允许动态获取模块(或任何对象)的属性。当属性名在程序运行期间未知或可能改变时,这可能会非常有用。

getattr函数的语法:


getattr(object, name, default = None)

其中object是要从中获取属性的对象,name是一个包含属性名的字符串,default是在属性名不存在时返回的值。default参数的默认值是None

使用getattr函数的示例:


import math

# 从math模块中获取sqrt属性
sqrt_function = getattr(math, 'sqrt')

print(sqrt_function(25))  # 输出: 5.0

# 尝试获取不存在的属性,返回默认值
non_existent_attr = getattr(math, 'non_existent', 'default_value')

print(non_existent_attr)  # 输出: default_value
        

在这个例子中,我们使用getattr函数从math模块中获取函数sqrt,然后调用该函数来计算数字25的平方根。如果属性名不存在,则返回默认值default_value

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION