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

一些关于自己学习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条件就不成立,其后的语句不执行。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352