python3 笔记15 模块

模块:

       模块是一个包含主观定义的函数和变量的文件,其后缀名是.py。

       模块可以被别的程序引入,以使用该模块中的函数等功能。

       模块的使用方法与python标准库使用方法一致。

 一、尝试使用python标准块

#!/usr/bin/python3
import time
import calendar


local_time = time.localtime()
print(time.localtime())
print('格式化以后',time.strftime('%Y-%m-%d %H:%M:%S', local_time))

print(calendar.calendar(2021,w=3,l=1,c=1,m=6))

import time 进入python标准模块的 time 模块 , time.localtime() 表示time的本地时间调取方法

二、import 语句

      2.1使用python源文件,只需在另一个源文件里执行import语句,语法如下:

import module1[,module2[,... moduleN]

       编辑名为importfunc的py文件

#!/usr/bin/python3

def print_func( impfc ):
    print( "Hello ,",impfc)
    return

      尝试调用如上模块

#!/usr/bin/python3

import importfunc

importfunc.print_func("import方法使用")

          一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。

     2.2 如果想频繁地被其它类直接调用呢,除了将对应py放到当前目录,还可以将该py放到sys模块下

          2.2.1直接调用会出错:

    

          2.2.2我们先找到 sys所在的位置将我们的importfunc.py放到解释器目录去试试比如C:\Users\xxx\AppData\Local\Programs\Python\Python38\Lib

#!/usr/bin/python3

import sys
print(sys.path)

           2.2.3将py保存到如上位置然后调用

          2.2.4 而且可以更简洁的使用,不过这步使用是临时的,再次使用需要重新声明

三、from...import语句

python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:

from modname import name1[,name2,name3[,...nameN]]

四、from...import * 语句

把一个模块的所有内容全部导入到当前的命名空间,语法如下:

from modname import *

五、 __name__属性(前后双下划线_ _)

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。

我们还用上次的例子 “importfunc.py”进行示范

#!/usr/bin/python3

def print_func( impfc ):
    print( "Hello ,",impfc)
    return

print('importfunc.py中的__name__值:',__name__)
if __name__ == '__main__' :
    print('程序自身在运行')   
else:
    print('被另外一个模块调用中')

尝试使用外部调用

#!/usr/bin/python3

import importfunc

六、dir()函数

内置的函数dir()可以找到模块内定义的所有名称。以一个字符串列表形式返回:

#!/usr/bin/python3

import importfunc
print(dir())

不给定参数时,dir()函数会罗列出当前定义的所有名称

#!/usr/bin/python3

import importfunc
print(dir())
a = 1,2,3,4,5
print(type(a))
print(dir())
del a 
print(dir())

七、标准模块

python本身自带一些标准模块,有些模块直接被构建在解析器里,这些虽然不是一些语言内置功能,但是他却能很高效的使用,甚至是系统级调用也没问题;

这些组件会根据不同的操作系统进行不同形式的配置,比如winreg这个模块就只会提供给wins系统。

应该注意到这有一个特别的模块 sys,它内置在每一个python解析器中。变量sys.ps1 和 sys.ps2定义了主提示符和副提示符所对应的字符串:

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('test')
test

八、包

  • 包是一种管理python模块命名空间的形式,采用“点模块名称”

  •  比如一个模块的名称是A.B,那么他表示一个包的子模块B。

  • 就好像使用模块的时候,你不用担心模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名情况。

  • 这样不同的作者都可以提供NumPy模块,或是Python图形库.

  • 不妨假设你想射击一套统一处理声音文件和数据的模块(或者称之为一个“包”),现存很多种不同的音频文件格式(基本都是通过后缀名区分的,例如:.wav,:file。aiff,:file:.au,)所以你还需要一组怎么写不完的模块来处理这些操作。

在倒入一个包的时候,python会根据sys.path中的目录来寻找这个包中包含的子目录。

目录只有包含一个叫做__init__.py的文件才会被认作是一个包,主要为了避免一些滥俗的名字比如string不小心影响搜索路径中的有效模块。

最简单的情况,放一个空的:file:__init__.py就可以了。

当然这个文件中也可以包含一些初始化代码或者为 __all__变量赋值。

          8.1用户可以每次只导入一个包里面的特定模块:

import sound.effects.echo
#该方式将会导入子模块:sound.effects.echo。必须使用全名去访问
使用时:sound.effects.echo.echofilter(input,output,delay=0.7,atten=4)

          8.2 另一种导入子模块方式

from sound.effects import echo
#这同样会导入子模块 echo ,并且他不需要那些冗长的前缀,所以可以如下方式使用:
echo.echofilter(input,output,delay=0.7,atten=4)

          8.3 还有一种变化就是直接倒入一个函数或者变量:

from sound.effects.echo import echofilter
#该方法会导入子模块的echo,并且可以直接使用他的echofilter()函数:
echofilter(input,output,delay=0.7,atten=4)

          注意当时用 from package import item 这种形式的时候,对应的item既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数,类及变量。

import语法会首先把item当做一个包定义的名称,如果没找到,再试图按照一个模块去导入。如果还没找到,抛出一个:exc:ImportError异常。

反之,如果使用 import item.subitem.subsubitem 这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可一世类,函数或者变量的名字。

九、从一个包中导入*

导入语句遵循如下规则:

         如果包定义文件 __int__.py存在一个叫 __all__的列表变量,那么在使用 from package import *的时候就把这个 列表中的所有名字作为包内容导入。

当作为包的作者时,可别忘了在更新包之后保证__all__也需要更新

假如 file:sounds/effects/__init__.py中包含代码 “__all__  = ["echo","surround","reverse"]” 

如果__all__ 真的没有被定义,这表示当你使用 from sounde.effects import *这种语法时,就不会导入包sound.effects里的任何子模块。

以上步骤,只是把包sound.effects和它里面定义的所有内容导入进来(可能运行__init__.py里定义的初始化代码)。

这回把__init__.py里定义的所有名字导入进来。并且他不会破坏我们在这句化之前导入的所有明确指定的模块

import sound.effects.echo
import sound.effects.surround
from sound.effects import *


'''
以上示例中,在执行from...import* 前,sound.effects中的echo 和surround模块都被导入到了当前
命名空间中(如果定义__all__就更没问题了)。
不建议使用*的方法导入模块,因为这种方法经常会使代码的可读性降低。(不过这样倒的确可以省去不少敲键盘的功夫,而且一些模块都设计成了只能通过特定的方法导入)。
机制,使用 from package import special_submodule这种方法永远不会有错。事实上也是一种推荐方法。除非你导入的子模块有可能和其他包的子模块重名。
如果在结构中包是一个子包(比如这个例子中对于包sound来说),而你又想导入兄弟包(同级别的包)你就得使用导入绝对路径来导入。比如,如果模块sound.filters.vocoder 要使用包sound.effects中的模块echo,你需要写成from  sound.effects import echo

'''
from . import echo
from .. import formats
from ..filters import equalizer
'''
无论是隐式还是显式的相对导入都是从当前模块开始的。
主模块的名字永远是"__main__",一个python应用程序的主模块,应道总是使用绝对路径引用。
包还提供一个额外的属性__path__。这是一个目录列表,里面包含的目录都有为这个包服务的__init__.py,
你得在其他__init__.py被执行前定义。可以改变这个变量,用来影响包含包里面的模块和子包。
这个功能并不常用,一般用来扩展包里面的模块。
'''

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值