博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
13.模块(概念)
阅读量:5162 次
发布时间:2019-06-13

本文共 2174 字,大约阅读时间需要 7 分钟。

目录

一.为什么要有模块

面条版代码--》函数版代码--》文件版代码(模块)--》文件夹版(包)

代码会变得更加简洁,清晰,模块化

一个模块里会有多个函数,相当于一个大功能细分成多个小功能

  1. 自定义模块
  2. 第三方模块,如requests
  3. 内置模块,如time
  4. 包(文件夹)

二.import 与 from...import...

# test.pyimport time 1. 打开time文件2. 使用Python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间3. test.py中会有一个time变量指向time模块的名称空间,如果导入方式为`import time as t`,则就是t变量指向time模块的名称空间from time import sleep1. 打开time文件2. 使用Python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间3. test.py中会有一个sleep变量指向time模块名称空间中的sleep,如果导入方式为`from time import sleep,localtime`,则是由一个sleep变量和一个localtime变量指向time模块名称空间中的sleep和localtime

三.循环导入问题

# m1.pyfrom m2 import yx = 10# m2.pyfrom m1 import xy = 20

为什么会有循环导入问题:

  1. m1文件需要导入m2文件的y
  2. m2文件需要导入m1文件的x
  3. 代码自上而下运行,m1需要m2的y,然后会去m2的名称空间找到y,但是找y前,需要运行m2的代码,m2的代码第一句是去找m1的x,然后又回去运行m1的代码,m1的第一行代码又是去寻找m2的y
  4. 就是说m1只能运行第一行,m2也只能运行第一行,所以出现了循环导入问题

解决方案一

# m1.pyx = 10from m2 import y# m2.pyy = 20from m1 import x
  • 但是这样做,对所有的变量都需要这样做,才能解决问题,所以治标不治本的

解决方案二

# m1.pydef f1():    from m2 import yx = 10f1()# m2.pydef f2():    from m1 import xy = 20f2()

名字的执行顺序:内置(python解释器启动的时候)-->全局(文件执行的时候)-->局部(函数调用的时候)

四.模块的搜索路径

1.去内存中找

# test.pyimport m1  # 从m1.py文件中导入的,然后会生成m1模块的名称空间import time# 删除m1.py文件,m1模块的名称空间仍然存在time.sleep(10)import m1  # 不报错,一定不是从文件中获取了m1模块,而是从内存中获取的

2.去内置模块中找

# time.pyprint('from time')# test.pyimport time  # 无任何打印,所以他先去内置模块中找了

3.环境变量中找

import sysprint(sys.path)
# b/a/m1.py# b/test.pyimport m1  # 报错sys.path.append('b/a')import m1

五.Python文件的两种用途

  1. 模块文件,被当做模块给导入,有多个
  2. 运行文件,被当做执行文件执行,只能有一个
  • 搜索路径以执行文件为基准
# m1.pydef f1():    print('from f1')    f1()# test.pyimport m1m1.f1()  # 运行两次
  • __name__
# m1.pydef f1():    print('from f1')    if __name__ == '__main__':  # __name__在m1.py被当做模块导入时是模块名,作为执行文件时是'__main__'    f1()    # test.pyimport m1m1.f1()  # 运行两次

其中if __name__ == '__main__':这句估计很多和我一样的初学者都是不求甚解。

这里作一下解释:

1:__name__是一个变量。前后加了爽下划线是因为是因为这是系统定义的名字。普通变量不要使用此方式命名变量。

2:Python有很多模块,而这些模块是可以独立运行的!这点不像C++和C的头文件。
3:import的时候是要执行所import的模块的。
4:__name__就是标识模块的名字的一个系统变量。这里分两种情况:假如当前模块是主模块(也就是调用其他模块的模块),那么此模块名字就是__main__,通过if判断这样就可以执行“__mian__:”后面的主函数内容;假如此模块是被import的,则此模块名字为文件名字(不加后面的.py),通过if判断这样就会跳过“__mian__:”后面的内容。

通过上面方式,python就可以分清楚哪些是主函数,进入主函数执行;并且可以调用其他模块的各个函数等等。

转载于:https://www.cnblogs.com/yellowcloud/p/10982306.html

你可能感兴趣的文章
如何将应用完美迁移至Android P版本
查看>>
【转】清空mysql一个库中的所有表的数据
查看>>
基于wxPython的python代码统计工具
查看>>
淘宝JAVA中间件Diamond详解(一)---简介&快速使用
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
Kettle学习系列之Kettle能做什么?(三)
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>
有关快速幂取模
查看>>
Linux运维必备工具
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>
Codeforces Round #277 (Div. 2)
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>