模块
此章详细地址 http://www.cnblogs.com/Eva-J/articles/7292109.html#_label2
模块导入相当于执行了模块里面的代码
导入sys模块通过path与modules来查询模块的可以导入的路径和是否导入了此模块
print(sys.modules.keys()) 查看导入和内置模块
在模块中 有一个变量__name__,
当我们直接执行这个模块的时候,__name__ == '__main__'当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__ == '模块的名字'
模块的导入
同时导入两种但操作步骤一样
if 'shujuku' == 'demo': import demo as f elif 'shujuku'=='demo1': import demo1 as f f.read1()
from time import sleep sleep(5)#此时由于导入的方法,所以不用加上前缀,time.sleep()
模块的导入的变量冲突
print('from the my_module.py') money=1000 def read1(): print('my_module->read1->money',money) def read2(): print('my_module->read2 calling read1') read1() def change(): global money money=0
这是我定义的一个demo模块
然后在主界面上执行下面的代码
from demo import money,read1
print(money)#from the my_module.py 1000
money = 20#
print(money)#20
read1()#my_module->read1->money 1000
可以看出当变量重定义是,变量就改变了,但是模块内的的变量例如read1()的money值始终没有变,用为此时money是一个始终不变的的内存地址
from demo import *
这段代码表示把所有的变量,函数都导入进来了,同时执行里面的代码。但是不推荐,因为你不知道里面的变量的具体情况
同理覆盖函数覆盖效果
from my_module import read1 def read1(): print('==========') read1() ''' 执行结果: from the my_module.py ========== '''
如果在模块中加入__all__=[函数名,变量],则用from demo import *是只导入[]中的数据,而不导入其他变量
__name__的用法
__name__主要查看的是当前py文件的名字,当py文件独立运行的时候,而自己的文件里面有print(__name__)时,便会打印出当前的文件名,如果py文件里面import了模块时,模块里面也有单独执行print(__name__)便会打印出模块的名字,利用这个便可以实现被当做模块式会不执行某些代码,而独立运行时便会执行某些代码。下面请看代码。
#假如这段代码既可以独立执行,但也可以被当做模块文件名是demo
def fib(n): a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print() if __name__ == "__main__": #如果独立运行时__name__的输出结果为__main__,及运行以下代码
#如果被当做模块运行时__name__的输出变为demo 及!= __main__便会不执行以下代码 print(__name__) num = input('num :') fib(int(num))
模块的总结
所有的模块导入都应该尽量往上写
内置模块
扩展模块
自定义模块
模块不会重复被导入 : sys.moudles
从哪儿导入模块 : sys.path
import
import 模块名
模块名.变量名 和本文件中的变量名完全不冲突
import 模块名 as 重命名的模块名 : 提高代码的兼容性
import 模块1,模块2
from import
from 模块名 import 变量名
直接使用 变量名 就可以完成操作
如果本文件中有相同的变量名会发生冲突
from 模块名 import 变量名字 as 重命名变量名
from 模块名 import 变量名1,变量名2
from 模块名 import *
将模块中的所有变量名都放到内存中
如果本文件中有相同的变量名会发生冲突
from 模块名 import * 和 __all__ 是一对
没有这个变量,就会导入所有的名字
如果有all 只导入all列表中的名字
__name__
在模块中 有一个变量__name__,
当我们直接执行这个模块的时候,__name__ == '__main__'
当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__ == '模块的名字'