python学习笔记 day9

day9

模块

概念

为解决在解释器中的编程不能重复使用的问题,将代码写入文件,通过执行文件在执行python代码,而这个文件被称为模块。
模块是包含所有变量和你定义的函数的文件,模块可以被别的程序引入,以使用该模块中的函数等功能。也是使用 python 标准库的方法

简而言之,就是一个写了python代码的文件,他可以被调用文件内的功能代码

import 语句

要使用python源文件,需要在另一个源文件中执行import语句

import 模块名,模块名2...

import 语句要放在文件顶部,一个模块只会被导入一次

注意事项

  1. 当我们在当前目录存放了一个和引入模块同名的模块,则要引入的模块会被屏蔽

  2. 可以通过模块名来访问函数

  3. 如果打算经常使用,也可以把一个模块函数赋给一个本地名称

     import test
    
     test.func()	# 调用 test模块的 func 方法
    
     testfunc = test.func
     testfunc()	# 赋给本地名称,并调用 
    

form … import 语句

from 模块名 import 内容(函数名,变量)

从模块中导入指定部分到命名空间

from test import func
func()

这个声明智慧导入指定部分,不会将整个模块都导入

from … import * 语句

from 模块名 import *

导入模块的所有信息,不推荐这么写。

深入模块

每个模块除了方法定义,也可以包含可执行代码,一般用于初始化该模块。这些代码只有在第一次导入时才会被执行。

每个模块都有自己独立的符号表,在模块内使用的变量不用担心影响到模块外,可以随意命名

可以通过 模块名.方法名 来调用模块内的函数

将模块的某些变量名导入当前模块,模块名不会被导入

from fibo import fib,fib2

可以一次性把模块的所有函数名称和变量名称导入,但这不是好习惯

from fibo import *

**注意:**在导入所有名字时,那些由单一下划线开头的名字不会被导入。

__ name__ 属性

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

if __name__ = '__main__':
	print('程序本身在运行')
else:
	print('被引用')

**说明:**每个模块都有一个__name__属性,当其值是__main__时,表明该程序自身在运行,否则就是被引入。请注意,开头是双下划线。

dir() 函数

内置函数 dir() 可以找到模块内定义的所有名称,以字符串列表的形式返回。如果没有参数,会返回当前定义的所有名称

dir(sys)
dir()

标准模块

系统内置模块,类似 c语言的math.h

一种管理python模块命名空间的形式,类似java中的包。调用格式为 包名.模块名

在导入一个包的时候,python 会根据 sys.path 中的目录来寻找这个包中包含的子目录
目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包

关于导入

导入特定模块,但这会导致必须要用全名才能访问

import sound.echo	

另一种方法,简化访问,直接访问 echo 模块

from sound import echo

导入变量和方法同理

from package import item 这种形式,item可以是模块名,也可以是模块的方法、变量名。
import语法首先会吧item当做一个包定义的名称,如果没有找到,则按照模块导入,如果还没找到,则会抛出一个异常:exc:ImportError
import item.subitem.subsubitem这种导入格式,除了最后一项,都必须是包,而最后一项可以是模块或者包,但不能是类、函数或变量名

关于导入的相关规则

如果包定义文件__init__.py存在一个叫做__all__的列表变量,那么在使用 from package import *的时候,就会吧列表中所有名字作为包内容导入,要经常更新

__all__ = ['echo','reverse']

如果不写,那么我们在运行import sound from *时,将不会导入任何子模块,只会把__init__.py中定义的内容导入。他不会影响在此之前我们明确指定导入的子模块。如果可以,最好明确指定路径,最好使用绝对路径,避免重名问题,提高可对性

你可能感兴趣的:(python学习)