一.模块简介

python开发中,每一个.py文件都可以看作是一个模块,模块内部的函数或者方法可以被其他模块调用,至于函数或者方法是具体如何实现的,调用者不需要关心。

假如项目中既含有UI也有逻辑代码还有功能实现,如果全写在一个py文件,可能会有几万甚至十几万行代码,显得代码很臃肿,为了方便代码阅读和维护,我们可以将项目拆分为多个模块,不同的模块实现不同的功能,这样分工合作开发效率也高,而且就算出现bug也方便定位。

二.模块分类

1.系统内置模块

python中有一些内置模块我们直接调用,比如:sys、time、json等,具体使用方法我们在调用模块中详细讲解;

2.第三方开源模块

安装第三方开源模块,可以直接cmd打开控制台或者打开pycharm终端运行 pip install <模块名> 即可,前提是anacoanda已经安装正确,例如:学习爬虫的时候需要安装request

  1. pip install request

3.自定义模块

除了前面两种模块,我们也可以自己写模块来供自己调用,具体实现什么功能有自己决定,在后面的模块调用中会有详细讲解,值得注意的是:模块名字不能和内置模块名字一样,会造成冲突;

三.调用模块

使用 import关键字 导入模块,并放置在代码最开始位置;同一个模块不管执行了多少次 import <模块名>,实际上只会被导入一次。

为了讲解关于模块的调用方法,假如我们有一个计算加减乘除的模块文件calculator.py,代码如下:

  1. # !usr/bin/env python
  2. # -*- coding:utf-8 _*-
  3. """
  4. @Author:何以解忧
  5. @Blog(个人博客地址): shuopython.com
  6. @WeChat Official Account(微信公众号):猿说python
  7. @Github:www.github.com
  8.  
  9. @File:calculator.py
  10. @Time:2019/10/11 21:25
  11.  
  12. @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  13. """
  14.  
  15. # 定义一个全局变量
  16. name = "calculator"
  17.  
  18. # 加法
  19. def add(x,y):
  20. return x+y
  21.  
  22. # 减法
  23. def sub(x,y):
  24. return x-y
  25.  
  26. # 乘法
  27. def multiplication(x,y):
  28. return x*y
  29.  
  30. # 除法
  31. def division(x,y):
  32. return x/y
  33.  
  34. # 使用内置函数eval计算表达式的结果,如果表达式有误,直接抛异常
  35. def get_result(input_str):
  36. try:
  37. return eval(input_str)
  38. except Exception as e:
  39. print("表达式输入异常!")
  40. return None

如果已经忘记python 异常处理的小伙伴请参考:  python 异常处理详细讲解

1.import <模块名>

新建一个py文件,用于调用模板文件 calculator.py 中的函数,代码如下:

  1. # 导入模块
  2. import calculator
  3.  
  4. # 调用calculator模块中的add函数 : 模块名.函数名 或者 模块名.变量名
  5. result = calculator.add(2,5)
  6. print(result)
  7.  
  8. # 调用calculator模块中的sub函数 : 模块名.函数名 或者 模块名.变量名
  9. result = calculator.sub(2,5)
  10. print(result)
  11.  
  12. # 调用calculator模块中的multiplication函数 : 模块名.函数名 或者 模块名.变量名
  13. result = calculator.multiplication(2,5)
  14. print(result)
  15.  
  16. # 调用calculator模块中的add函数 : 模块名.函数名 或者 模块名.变量名
  17. result = calculator.division(2,5)
  18. print(result)
  19.  
  20. # 调用calculator模块中的get_result函数 : 模块名.函数名 或者 模块名.变量名
  21. result = calculator.get_result("3+2*8-40")
  22. print(result)
  23.  
  24. # 调用calculator模块中的name变量 : 模块名.函数名 或者 模块名.变量名
  25. print(calculator.name)

输出结果:

  1. 7
  2. -3
  3. 10
  4. 0.4
  5. -21
  6. calculator

注意:调用模块中的函数时需要指明函数或者变量来自哪个模板:<模块名>.函数名    <模块名>.变量名

2.from <模块名> import <函数或者变量>,<函数或者变量>,<函数或者变量>…..

做一个简单理解,从哪个模块导入哪些函数或者变量,外部导入模块后调用时只能调用导入的函数或者变量,模块中没有导入的变量或者函数不能调用,示例代码如下:

  1. '''
  2. 从模块calculator中导入add,sub两个函数,
  3. 意味着调用calculator模块时,只能调用add,sub两个函数,
  4. calculator 模块中的其他变量或者函数无法调用
  5. '''
  6.  
  7. from calculator import add,sub
  8.  
  9. # 在代码顶部已经声明add函数从calculator导入,可以直接使用,不需要带上模板名
  10. result = add(2,5)
  11. print(result)
  12.  
  13. # 在代码顶部已经声明sub函数从calculator导入,可以直接使用,不需要带上模板名
  14. result = sub(2,5)
  15. print(result)
  16.  
  17. # 错误写法:该模块并没有导入name变量
  18. # result = multiplication(2,5)
  19.  
  20. # 错误写法:该模块并没有导入name变量
  21. # result = division(2,5)
  22.  
  23. # 错误写法:该模块并没有导入name变量
  24. # result = calculator.get_result("3+2*8-40")
  25.  
  26. # 错误写法:该模块并没有导入name变量
  27. # print(calculator.name)

3.from <模块名> import *

这种写法表示直接导入模块中的所有内容,意味着模块中的函数或者变量都可以使用,该写法实际上和第二种导入方法类似,示例代码如下:

  1. # 导入calculator 模块中所有函数和变量
  2. from calculator import *
  3.  
  4. # 在代码顶部已经声明导入calculator模块所有内容,可以直接使用,不需要带上模板名
  5. result = add(2,5)
  6. print(result)
  7.  
  8. # 在代码顶部已经声明导入calculator模块所有内容,可以直接使用,不需要带上模板名
  9. result = sub(2,5)
  10. print(result)
  11.  
  12. # 在代码顶部已经声明导入calculator模块所有内容,可以直接使用,不需要带上模板名
  13. result = multiplication(2,5)
  14. print(result)
  15.  
  16. # 在代码顶部已经声明导入calculator模块所有内容,可以直接使用,不需要带上模板名
  17. result = division(2,5)
  18. print(result)
  19.  
  20. # 在代码顶部已经声明导入calculator模块所有内容,可以直接使用,不需要带上模板名
  21. result = get_result("3+2*8-40")
  22. print(result)
  23.  
  24. # 在代码顶部已经声明导入calculator模块所有内容,可以直接使用,不需要带上模板名
  25. print(name)

输出:

  1. 7
  2. -3
  3. 10
  4. 0.4
  5. -21
  6. calculator

使用该方法导入模块时有一个缺陷:如果同时导入多个模块文件,如果模块中的函数或者变量重名,编译器也不知道具体是用哪一个模块重名的函数或者变量,会造成意想不到的bug,往往这种bug最难查找!

四.简单的计算器

利用上面的calculator模块,再加上前面的python基础知识,其实我们已经可以写一个简单的计算器了,唯独没有界面而已,至于界面后面会有pyqt5的教程,暂时不做过多讲解。计算器代码如下:

  1. # 导入内置模块time,计算耗时,默认单位秒
  2. import time
  3. # 导入calculator 模块
  4. import calculator
  5.  
  6. while True:
  7. # 获取表达式
  8. input_str = input("请输入表达式:")
  9. if input_str == 'q': # 输入 q 退出程序
  10. break
  11. time_start = time.clock()
  12. print(calculator.get_result(input_str))
  13. time_end = time.clock()
  14. # 将 秒 转为 毫秒
  15. print("计算耗时:{}毫秒".format((time_end-time_start)*1000))
  16.  
  17. print("退出计算,程序结束!")

测试结果:

五.重点总结

1.注意模块的几种导入方式,python开发中推荐使用写法一的方式导入:import <模块名>;

2.注意内置函数和内置模块的区别:内置函数是任何模块都可以直接调用,内置模块需要import模块之后才能调用模块里面的函数;

3.不同的模块中可以存在相同的变量名或者函数名,但是不能与内置函数名或者内置模块名字重复,避免造成冲突;

猜你喜欢:

1.python内置函数input/eval函数

2.字典推导式

3.列表推导式

4.python异常处理

转载请注明:猿说Python » python模块

技术交流、商务合作请直接联系博主
扫码或搜索:猿说python
猿说python
微信公众号 扫一扫关注

python 模块import(26)的更多相关文章

  1. Python模块import本质是什么?import是什么

    ​ 写这篇文章主要是对Python的import模块或包的机制有了更深层级的一个理解,也在具体工作中得到了一点实践,这种思考是由上一篇文章<__main__内置模块预加载Shotgun接口的妙用 ...

  2. python模块import具体用法

    同级目录 import 文件名 form 文件名 import * 子目录 import 目录名.文件名 form 目录名.文件名 import * 不同目录 先导入sys包,然后把对应的目录加入pa ...

  3. Python标准模块--import

    1 模块简介 作为一个Python初学者,你首先要学会的知识就是如何引入其它模块或者包.但是,我发现有些开发者虽然使用Python很多年,依然不了解Python引入机制的灵活性.这篇文章,我们就会研究 ...

  4. 浅析python 的import 模块(转)

    摘要: 学习python有几天了,对import一直不是很清楚,和C里面的include是否一样,重复引入有问题么?搜索路径是怎样的?整理解决下我的疑问. 一 模块的搜索路径 模块的搜索路径都放在了s ...

  5. python 导入模块 import 理解

    --python 导入模块 import 理解 -----------------------------------2014/03/18 python 导入一个模块的过程要求有一个叫做“路径搜索”的 ...

  6. 小白的Python之路 day5 python模块详解及import本质

    一.定义 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能) 本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test) 包:用来从逻辑上组织模块 ...

  7. linux环境下 python环境import找不到自定义的模块

    linux环境下 python环境import找不到自定义的模块 问题现象: Linux环境中自定义的模块swport,import swport 出错.swport模块在/root/sw/目录下. ...

  8. python 全栈开发,Day28(复习,os模块,导入模块import和from)

    一.复习 collections 增加了一些扩展数据类型 :namedtuple orderdict defaltdict队列和栈time 时间 三种格式 : 时间戳 结构化 字符串random 随机 ...

  9. python 模块相互import

    模块A中import B,而在模块B中import A.这时会怎么样呢?这个在Python列表中由RobertChen给出了详细解释,抄录如下: [A.py] from B import D clas ...

随机推荐

  1. CF837D Round Subset 动态规划

    开始的时候数据范围算错了~ 我以为整个序列 2 和 5 的个数都不超过 70 ~ 一个非常水的 dp code: #include <bits/stdc++.h> #define M 75 ...

  2. learning scala type alise

    How to use type alias to name a Tuple2 pair into a domain type called CartItem type CartItem[Donut, ...

  3. Cogs 461. [网络流24题] 餐巾(费用流)

    [网络流24题] 餐巾 ★★★ 输入文件:napkin.in 输出文件:napkin.out 简单对比 时间限制:5 s 内存限制:128 MB [问题描述] 一个餐厅在相继的N天里,第i天需要Ri块 ...

  4. visual studio2015窗体中控件的属性中文说明不见了

    右击属性窗口,然后选中好说明就ok了.

  5. 如何设置xshell代理?

    场景:我想在公司内部用一台服务器A访问客户内网的机器C.在公司和客户之间有一台中间服务器B,我只能先连接到中间服务器,然后通过中间服务器跳转才能到客户C机器. 上面场景的连接策略:A->B-&g ...

  6. CSS绘制三角形—border法

    1. 实现一个简单的三角形 使用CSS盒模型中的border(边框)即可实现如下所示的三角形:   CSS实现简单三角形 实现原理: 首先来看在为元素添加border时,border的样子:假设有如下 ...

  7. IIS Express(电脑无管理员权限如何启用VS调试)

    转载页面:https://www.cnblogs.com/xbblogs/p/4756552.html(详细版)  直接按照红色字体步骤执行,其他字体可先忽略 出问题再详细看   1.设置配置文件   ...

  8. 全局设置页面颜色 返回按钮样式 iOS

    思路 1.建个UIViewController的分类 2.hook方法viewDidLoad(Aspects是三方库 可以不用) 3.看下面蓝色部分代码 #import "UIViewCon ...

  9. JDBC的概述和简单使用

    1. 概念 JDBC是 Java DataBase Connectivity 的简写,翻译过来就是 Java 操作数据库. 目的是使用统一的Java代码操作所有关系型数据库. JDBC实际是定义了一套 ...

  10. Linux 基于WEB开源的系统管理工具webmin

    Webmin是目前功能最强大的基于Web的Unix系统管理工具.管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作.目前Webmin支持绝大多数的Unix系统,这些系统除了各种版本的l ...