每天都要学点东西,昨天鼓捣小程序到8点多。。实在是被弄吐了。对小程序理解有限,所以好多问题无法自己解决,百度都百度不到。= = 中国的东西吧,谷歌更搜不到。难受。
不废话了,今天先学一下Python吧,关于import导入模块,又学到了一点点小东西。
一、导入模块
我们一般写好了一个文件,就需要导入它,然后调用其中的函数,这个流程没错吧。
首先你得先有个女朋友。。(←_←)(手动滑稽,我们都是单身狗,哪里来的女朋友)
咳咳,首先先搞个py吧。
我直接扔到桌面上了。
这时候呢打开飘柔+R 输入cmd 进入命令行模式,输入ipython,进入py模式。
(注:如果你还没有安装环境等等东西,请看文章左边的Python分类,里面有详细的教程)
我们都知道如果要进行import一般情况下都导入当前目录下的
我的当前目录为:‘C:\Users\yue’
而我要导入的文件,就是刚才的文件,则存在于桌面上,能不能导进来呢?试试吧。
No module named ‘printname’
翻译君:没有这个模块啊亲
晕 = = 有这个模块啊,就在我的桌面上,只是没有在当前目录而已。
所以就有疑问了,他这个import也没说让我们写目录啊,那他是从哪里导入的呢?
让我们来看一看。
其实import是从这些目录从上到下的顺序开始找你要导入的模块的。
(首先是从当前目录找,如果当前目录没找到才去这些目录里面找)
py君没有在这写目录中找到你要导入的模块,那肯定是说没找到啊。
有的人说了,那我们把东西放在当前目录或者这些文件目录下不就行了。
大兄弟,咱们得考虑便于管理啊对不对。
所以我们要做的就是添加我们的模块目录到这个sys.path列表中来。
我的模块放在桌面,我就把桌面的目录添加进来。
好了这时候我们在导入我们的模块,然后调用模块内的方法就好了。
注意:每次退出ipython,这个sys.path都会复原,也就是说,用一次就要重新添加一次,所以把调用模块的目录写在调用文件中,是十分必要的。
二、导入模块后,模块刷新了
还有一种情况,我已经在ipython中导入模块了,在这期间,有人(包括自己)修改了这个模块,这时候我在调用模块中的方法,还是原来的,在导入一遍还是原来的。
有人说了,你关闭ipython,再次进入不就好了么?
我患病了,懒癌,没救了,就是不想退,就没有更直接的方法么?
有!
利用imp中的reload()方法就可以搞定这件事儿。
像我这种情况
(1)from imp import *
reload(模块名)
(2)import imp
imp.reload(模块名)
两种方法一个道理。
所以我建议,我们导入了模块,当再次使用这个模块的时候,最好能够reload()一下这个模块,尤其是不是独立开发的时候。一定要记住这个方法。
三、关于避免模块互相调用
我们直接看例子吧。
我想在a模块中的a方法调用b,我该怎么办?
我们复习下刚才学的知识
这时候我想在b模块中b方法调用a,那我就重复上面的工作呗。
OK,话说整天我就干这些个重复性的工作,真够没意思的。
好我们现在来总结下我们的代码:
a模块中的a方法:
from b import b
def a():
print('----a----')
b()
b模块中的b方法:
from a import a
def b():
print('----b----')
a()
仔细看下,我调用a模块中的a方法,我是不是得先导入b模块中的b方法?
我导入b模块的时候肯定要导入a模块中的a方法吧?
这种情况下
a模块中的a方法中有b模块的b方法
b模块中的b方法中有a模块的a方法
明显就是个死循环嘛。
不信我们关闭ipython后再重新导入a模块和b模块试试
看看,不让导入了吧?
在实际编程中,我们应该这么做呢?
为了避免a中有b,b中有a的情况。
我们这样做
主模块调用子模块,从而避免子模块互相调用导致数据混乱和死循环现象的出现。
以上。