欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python入门六模块的使用

程序员文章站 2024-02-03 17:06:34
...

您已经了解了如何通过定义一次函数来重用程序中的代码。如果您想在您编写的其他程序中重用许多函数,该怎么办?您可能已经猜到,答案是模块。

有各种编写模块的方法,但最简单的方法是创建一个.py包含函数和变量的扩展名的文件。

另一种方法是用编写Python解释器本身的本机语言编写模块。例如,您可以使用C编程语言编写模块,在编译时,可以在使用标准Python解释器时从Python代码中使用它们。

可以通过其他程序导入模块以利用其功能。这也是我们如何使用Python标准库的方法。首先,我们将了解如何使用标准库模块。

示例(另存为module_using_sys.py):

import sys

print('The command line arguments are:')
for i in sys.argv:
    print(i)

print('\n\nThe PYTHONPATH is', sys.path, '\n')

输出:

$ python module_using_sys.py we are arguments    # each arg is separated by white space
The command line arguments are:
module_using_sys.py
we
are
arguments


The PYTHONPATH is ['/tmp/py',
# many entries here, not shown here
'/Library/Python/2.7/site-packages',
'/usr/local/lib/python2.7/site-packages']

这个怎么运作

首先,我们导入sys使用该模块import声明。基本上,这转化为我们告诉Python我们想要使用这个模块。该sys模块包含与Python解释器及其环境(即系统)相关的功能。

当Python执行import sys语句时,它会查找sys模块。在这种情况下,它是内置模块之一,因此Python知道在哪里找到它。

如果它不是一个已编译的模块,即用Python编写的模块,那么Python解释器将在其sys.path变量中列出的目录中搜索它。如果找到该模块,则运行该模块正文中的语句,并使模块可供您使用。请注意,初始化仅在我们一次导入模块时完成。

使用点分表示法访问模块中的argv变量。它清楚地表明该名称是该模块的一部分。此方法的另一个优点是名称不会与程序中使用的任何变量冲突。syssys.argvsysargv

sys.argv变量是一个列表字符串(列表中详细说明一个的后面的章节)。具体来说,它sys.argv包含命令行参数列表,即使用命令行传递给程序的参数。

如果使用IDE编写和运行这些程序,请查找在菜单中为程序指定命令行参数的方法。

这里,当我们执行时python module_using_sys.py we are arguments,我们module_using_sys.py使用python命令运行模块,接下来的其他内容是传递给程序的参数。Python将命令行参数存储在sys.argv变量*我们使用。

请记住,运行的脚本的名称始终是sys.argv列表中的第一个元素。所以,在这种情况下,我们将'module_using_sys.py'as sys.argv[0]'we'as sys.argv[1]'are'as sys.argv[2]'arguments'as sys.argv[3]。请注意,Python从0开始计数,而不是1。

sys.path包含其中输入模块的目录名的列表。注意的是,在第一个字符串sys.path是空的-这个空的字符串表示当前目录也是一部分sys.path是相同PYTHONPATH的环境变量。这意味着您可以直接导入位于当前目录中的模块。否则,您必须将模块放在其中一个目录中sys.path

请注意,当前目录是启动程序的目录。运行import os; print(os.getcwd())以查找程序的当前目录。

字节编译的.pyc文件

导入模块是一个相对昂贵的事情,因此Python做了一些技巧,使其更快。一种方法是使用扩展创建字节编译的文件,扩展.pyc是Python将程序转换为的中间形式(请记住Python如何工作的介绍部分?)。.pyc当您下次从另一个程序导入模块时,此文件很有用 - 由于导入模块所需的部分处理已经完成,因此速度会快得多。此外,这些字节编译的文件与平台无关。

注意:这些.pyc文件通常与相应的.py文件在同一目录中创建。如果Python没有写入该目录中文件的权限,则不会创建.pyc文件。

from..import语句

如果要将argv变量直接导入程序(以避免sys.每次都为其键入),则可以使用该from sys import argv语句。

警告:通常,请避免使用该from..import语句,import而是使用该语句。这是因为您的程序将避免名称冲突并且更具可读性。

例:

from math import sqrt
print("Square root of 16 is", sqrt(16))

一个模块 __name__

每个模块都有一个名称,模块中的语句可以找出其模块的名称。这对于确定模块是独立运行还是正在导入的特定目的非常方便。如前所述,当第一次导入模块时,它包含的代码将被执行。我们可以使用它来使模块以不同的方式运行,具体取决于它是单独使用还是从另一个模块导入。这可以使用__name__模块的属性来实现。

示例(另存为module_using_name.py):

if __name__ == '__main__':
    print('This program is being run by itself')
else:
    print('I am being imported from another module')

输出:

$ python module_using_name.py
This program is being run by itself

$ python
>>> import module_using_name
I am being imported from another module
>>>

这个怎么运作

每个Python模块都有自己的__name__定义。如果是这样'__main__',则意味着模块由用户独立运行,我们可以采取适当的措施。

制作自己的模块

创建自己的模块很简单,你一直在做这些!这是因为每个Python程序也是一个模块。你只需要确保它有一个.py扩展名。以下示例应该清楚说明。

示例(另存为mymodule.py):

def say_hi():
    print('Hi, this is mymodule speaking.')

__version__ = '0.1'

以上是一个示例模块。正如您所看到的,与我们通常的Python程序相比,它没有什么特别之处。接下来我们将看到如何在我们的其他Python程序中使用此模块。

请记住,模块应该放在与我们导入它的程序相同的目录中,或者放在其中一个目录中sys.path

另一个模块(另存为mymodule_demo.py):

import mymodule

mymodule.say_hi()
print('Version', mymodule.__version__)

输出:

$ python mymodule_demo.py
Hi, this is mymodule speaking.
Version 0.1

这个怎么运作

请注意,我们使用相同的点分表示法来访问模块的成员。Python可以很好地重用相同的符号来赋予它独特的“Pythonic”感觉,这样我们就不必继续学习新的方法来做事。

这是一个使用from..import语法的版本(另存为mymodule_demo2.py):

from mymodule import say_hi, __version__

say_hi()
print('Version', __version__)

输出与输出mymodule_demo2.py相同mymodule_demo.py

请注意,如果__version__在导入mymodule的模块中已经声明了名称,则会发生冲突。这也可能是因为每个模块通常使用此名称声明其版本号。因此,总是建议您更喜欢该import语句,即使它可能会使您的程序更长一些。

你也可以使用:

from mymodule import *

这将导入所有公共名称,例如say_hi但不会导入,__version__因为它以双下划线开头。

警告:请记住,您应该避免使用import-star,即from mymodule import *

Python的禅宗

Python的指导原则之一是“明确比隐含更好”。import this在Python中运行以了解更多信息。

dir功能

内置dir()函数返回对象定义的名称列表。如果对象是模块,则此列表包括在该模块内定义的函数,类和变量。

此函数可以接受参数。如果参数是模块的名称,则该函数返回该指定模块的名称列表。如果没有参数,则该函数返回当前模块的名称列表。

例:

$ python
>>> import sys

# get names of attributes in sys module
>>> dir(sys)
['__displayhook__', '__doc__',
'argv', 'builtin_module_names',
'version', 'version_info']
# only few entries shown here

# get names of attributes for current module
>>> dir()
['__builtins__', '__doc__',
'__name__', '__package__', 'sys']

# create a new variable 'a'
>>> a = 5

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'sys', 'a']

# delete/remove a name
>>> del a

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'sys']

这个怎么运作

首先,我们看到dir导入sys模块的用法。我们可以看到它包含的巨大属性列表。

接下来,我们使用该dir函数而不向其传递参数。默认情况下,它返回当前模块的属性列表。请注意,导入的模块列表也是此列表的一部分。

为了观察dir实际操作,我们定义一个新变量a并为其赋值,然后检查dir并观察到同名列表中还有一个附加值。我们使用del语句删除当前模块的变量/属性,并且更改将再次反映在dir函数的输出中。

关于以下内容的注释del:此语句用于删除变量/名称,并且在语句运行后,在这种情况下del a,您无法再访问该变量a- 就好像它之前从未存在过一样。

请注意,该dir()函数适用于任何对象。例如,运行(字符串)类dir(str)的属性str

还有一个vars()函数可以为您提供属性及其值,但它不适用于所有情况。

到目前为止,您必须已经开始观察组织程序的层次结构。变量通常进入函数内部。函数和全局变量通常都在模块内部。如果你想组织模块怎么办?这就是包装进入图片的地方。

包只是模块的文件夹,带有一个特殊__init__.py文件,向Python指示该文件夹是特殊的,因为它包含Python模块。

假设您想要创建一个名为'world'的包,包含'asia','africa'等子包,这些子包又包含'india','madagascar'等模块。

这是你如何构建文件夹:

- <some folder present in the sys.path>/
    - world/
        - __init__.py
        - asia/
            - __init__.py
            - india/
                - __init__.py
                - foo.py
        - africa/
            - __init__.py
            - madagascar/
                - __init__.py
                - bar.py

包只是分层组织模块的便利。您将在标准库中看到许多此类实例。

摘要

就像函数是程序的可重用部分一样,模块也是可重用的程序。包是组织模块的另一个层次结构。Python附带的标准库就是这样一组包和模块的一个例子。

我们已经了解了如何使用这些模块并创建自己的模块。

接下来,我们将学习一些称为数据结构的有趣概念。

相关标签: Python模块