2020-07-10 Python学习笔记21 模块

2020-07-10  本文已影响0人  建渐升辉

一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习。

声明:本人学习是在扇贝编程通过网络学习的,相关的知识、案例来源于扇贝编程。如果使用请说明来源。

我们来练习一下模块的导入:将示例代码拆分到两个模块中,其中封装好的变量、函数放到other.py 文件,函数调用语句放到 main.py 文件执行。

main.py

import other

print(other.animals)

other.tell_story()

other.py

animals = ['鸭', '鱼', '乌龟', '鹅', '青蛙', '虾', '鳄鱼']

def tell_story():

  foranimal in animals:

   print('请问你是我妈妈吗?')

   if animal == '青蛙':

     print(animal + ':我是你妈妈')

     break

print(animal + ':我不是你妈妈')

原来:

animals = ['鸭', '鱼', '乌龟', '鹅', '青蛙', '虾', '鳄鱼']

def tell_story():

  foranimal in animals:

   print('请问你是我妈妈吗?')

   if animal == '青蛙':

     print(animal + ':我是你妈妈')

     break

   print(animal + ':我不是你妈妈')

# 以上全部作为一个模块,放到other.py里面了

然后用import other 来调用

print(animals) #这里的animals前面就要加上other.

tell_story()     #这里前面也要加上other.  

这两句有些不太理解呢,为什么前面还要加上other?不是已经导入进主模块了吗?

用导入模块的方式,import other,在调用的时候要加上模块的名字other。

如果用导入部分模块,from other import 变量名或函数名,注意函数名后面不加括号,只写名称即可,此时在用到变量不用加other,加了会错

练习:

阅读 main.py 和other.py 的代码,猜测一下运行结果,然后点击运行按钮验证你的猜测是否正确。

原来的程序:

main.py

import other

print('main.py 中的__name__ 的值为' + __name__)

if __name__ == '__main__':

 print('main.py被直接运行了')

other.py

print('other.py 中的__name__ 的值为' + __name__)

if __name__ == '__main__':

 print('other.py被直接运行了')

结果:

other.py 中的 __name__ 的值为other

main.py 中的__name__ 的值为__main__

main.py 被直接运行了

最初不太明白这个运行的逻辑和过程,请教了黄帮主,帮主说运行那个程序,那个程序的name 就等于main,于是这个程序的模块就会运行。另一个导入的模块的if _name_ == _main_ 就不成立,所以就不运行了。

这里是是在main里面导入other的,所以main中的if条件成立,得到运行,而other中的if条件不成立,就不运行其后的语句了。

如果是在other中导入main的化,执行other程序,则other的if成立,执行其后的语句,而main的if不成立,就不会执行其后的程序了。

也就是说谁作为执行模块,谁的if条件就成立,其后的语句就会得到执行。

main.py

import other

print('main.py 中的__name__ 的值为' + __name__)

print('再试试')

if __name__ == '__main__':

 print('main.py被直接运行了')

 print('这里再试试')

other.py

print('试试')

print('try again')

print('other.py 中的__name__ 的值为' + __name__)

if __name__ == '__main__':  #main.py作为执行模块,other的if不成立,其后的语句为执行

  print('other.py 被直接运行了')

  print('这里也试试')

结果:

试试

try again

other.py 中的__name__ 的值为other

main.py 中的 __name__的值为__main__

再试试

main.py 被直接运行了

这里再试试

由于是main.py是作为执行模块的,所以other的if条件不成,所以,其后的语句没有得到执行。

练习:

快看,我们发现了哆啦A梦的魔法口袋!里面有着各种各样的魔法道具,我们快来看看都有哪些吧。

要求:在 main.py 中导入pocket.py 模块,然后看看魔法口袋(pocket.py)里都有哪些魔法道具并将其打印出来吧!

main.py

import pocket   #不要加上后缀py

print(pocket.prop1)   # 需要加上导出模块的名称

print(pocket.prop4)

print(pocket.prop7)

pocket.py

prop1 = '任意门:可以去任意想去的地方'

prop2 = '竹蜻蜓:带上它可以飞行'

prop3 = '记忆面包:把课文写在面包上,吃下便可以完全记得内容'

prop4 = '宠物笔:用这种笔画出来的动物都能变成你的宠物'

prop5 = '让步帽:只要戴上了让步帽,周围人的各种能力都会变得和你处于同一水平'

prop6 = '任意水龙头:随便把它安在什么地方,扭开水龙头,饮品便会自动出来'

prop7 = '时间包巾:可以使被包裹的物品变成未来或过去的模样'

prop8 = '书的味精:无论多么无聊的书,只要撒上书的味精,读书的人都会觉得非常有意思'

prop9 = '提高效率丸:只要吃上一粒这种提高效率丸,无论是工作还是学习任务,都能高效率地完成'

导入时只写程序名称即可,不要后缀。执行是要加上导入模块的名称,pocket.prop1,不然找不到程序。关键是想全部打出来,程序该怎么写呢?

一个例子

def bootstrap():

 print('项目启动')

if __name__ == '__main__':

 bootstrap()

运行结果是:项目启动。直接运行,if条件满足,所以调用函数。

# main.py

def bootstrap():

 print('项目启动')

if __name__ == '__main__':

 bootstrap()

# other.py

import main

main.bootstrap()

运行的结果是:项目启动。把main导入other之后,main中的if条件不满足,所以不执行。而other中的main.bootstrap() 调用main中的函数,打印出结果。如果此时main中的if条件满足的话,其后的语句会再次调用函数,会再打一次 项目启动。

而现在只有一次,所以说,main中的if没有运行。因为条件不满足。

笔记:

什么是模块

为了让代码方便维护,我们将代码进行分类,分别放到不同的文件里。这样,所有的代码都按照一定的规则分布在各个文件里,需要使用的时候只要导入相应的文件即可。在Python 中,这样的文件被称之为模块(Module)。更好组织代码结构

和函数一样,模块也能提高代码复用率。就像我们把多次用到的代码块封装成函数一样,我们可以把经常用到的函数、变量等代码封装成一个模块,在需要的时候导入这个模块。

模块名后缀py一定要写

模块导入:

当我们需要使用模块的时候,只需使用 import 语句导入对应的模块即可。

我们使用 import 模块名(不需要 .py 后缀)导入模块,相当于我们在 main.py 里借用并运行了 other.py 文件里的代码,因此运行结果是带你打开编程世界的大门。你可以理解为 Python 会将 import

other 语句替换成 other.py 里的代码。

# other.py

print('带你打开编程世界的大门')

# main.py

print('hi')

importother

print('bye')

hi

带你打开编程世界的大门

bye

其实在执行 import other 后,import

other 被替换成 other.py 里的代码,main.py 里的代码就相当于下面这样:

print('hi')

print('带你打开编程世界的大门')

print('bye')

我们可以看到,当导入模块后,要使用模块中的变量、函数,需要通过模块名.变量名和 模块名.函数名() 的方式。. 表明了从属关系,表示某个模块里面的某个变量或函数。

mport 语句还有一种用法是import ... as ...,比如我们觉得 other 这个模块名太长,就可以用import

other as o,相当于给 other 取了一个别名为o,之后我们就可以使用 o 来替代 other。

拓展:数据分析常用的 pandas 和numpy 常被简写成 pd 和 np,所以你会看到 import pandas as pd 和 import numpy as np 这样的写法。

另外,当我们需要同时导入多个模块时,可以用逗号隔开。比如import a,

b, c 可以同时导入 a.py、b.py 和 c.py 三个文件。

导入部分模块

import 语句一次性将整个模块导入进来,我们还可以使用 from ... import … 语句只导入我们需要的变量、函数等。

# other.py

pi = 3.14159265359

def half(x):

 return x / 2

# main.py

from other import pi, half  #从 other 模块导入 pi 和half

print(pi)

# 输出:3.14159265359

print(half(4))

# 输出:2.0

可以看到,执行 from other import pi, half 后可以直接使用 other.py 里的 pi 和 half,不再需要在前面加 other.。并且同时导入多个变量或函数时,两两之间要用逗号隔开。

需要注意的是:使用 from ... import ... 的方式导入就不能再用 模块名.变量名 和 模块名.函数名 的方式访问模块内的变量或函数了,否则代码将会报错

程序入口

当在做复杂项目的时候,我们会将代码拆分到各个模块中。这样,我们就需要一个程序入口,通过这个入口文件将整个项目的代码串联运行起来

为了指明某个文件是程序入口,我们可以在代码中这样写:

# xxx.py

代码块A

if __name__ == '__main__':

  代码块B

上面代码的意思是当 __name__ 的值为 '__main__' 时执行代码块 B

其实 __name__ 是Python 里一个特殊的内置变量,它的值默认是模块名。而当文件被直接运行时,即通过命令行执行 python xxx.py 运行代码时,__name__的值会被改为 __main__。

所以我们可以根据 __name__ 的这个特性来判断模块是以导入的方式使用,还是作为程序入口文件直接运行,从而执行相对应的操作。比如只有作为程序入口执行时才运行启动程序的代码,否则什么都不做。

程序入口程序直接被运行,其中的if条件成立,并执行相应的代码,而导入模块的if条件就不成立,其后的语句不执行。

上一篇 下一篇

猜你喜欢

热点阅读