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