1 模块module

1.1 模块是什么

模块是包含一系列的变量,函数,类等程序组

模块通常是一个文件,以.py结尾

1.2 模块的作用

1. 让一些相关的函数,变量,类等有逻辑的组织在一起,使逻辑更加清晰,

2. 模块中的变量,函数和类等可提供给其他模块或程序使用

1.3 模块的分类

1.内置模块(builtins),在解释器的内部,可以直接使用

2.标准库模块,随python的解释器一起安装,可直接使用(有的是用C语言写的,有的是用python写的)

3.第三方模块(通常为开源),需要自己安装

4.用户自定义模块

1.4 模块化编程的优点

1.有利于多人合作开发

2.使代码更加易于维护

3.提高代码的重用率

4.模块话编程有助于解决函数名和变量名冲突问题

1.5 模块的文档字符串

模块内的第一行未赋值给任何变量的字符串为模块的文档字符串,可用help(模块名)来查看

例如在test1.py模块中

  1. '''
  2. 这是test.py模块文件
  3.  
  4. 这个模块是学习测试时使用
  5. 这个模块中共有 个变量,其中函数变量有 个
  6. '''
  7.  
  8. def fun1(a,b):
  9. a = 1
  10. b = 2
  11. pass
  12.  
  13. def fun2(m,n):
  14. pass
  15.  
  16. para1 = "a"
  17. para2 = "b"
  18.  
  19. c = map(fun1,[1,2])
  20.  
  21. print("test1模块被调用了")

经过如下操作

  1. >>> import test1
  2. test1模块被调用了
  3. >>> help(test1)

可以得到下面的帮助页面

  1. Help on module test1:
  2.  
  3. NAME
  4. test1 - 这是test.py模块文件
  5.  
  6. DESCRIPTION
  7. 这个模块是学习测试时使用
  8. 这个模块中共有 个变量,其中函数变量有 个
  9.  
  10. FUNCTIONS
  11. fun1(a, b)
  12.  
  13. fun2(m, n)
  14.  
  15. DATA
  16. c = <map object>
  17. para1 = 'a'
  18. para2 = 'b'
  19.  
  20. FILE
  21. /home/tarena/桌面/day13/test1.py
  22.  
  23. ~
  24. (END)

当函数中也有文档字符串时,则放在第一章节说明

2 模块的导入

借助于 import语句

  1. import XXX
  2. from XXX import YYY
  3. from XXX import *  # * 表示通配符

2.1 improt 语句

作用

将模块整体导入到当前的模块作用域(导入之后,通过dir(),可以直接显示该模块名)

语法

import 模块名1 [as 模块新名1] [,模块名2[as 模块新名2]]....

示例

导入数学模块

  1. import math #导入数学模块

交互模式下导入数学模式

  1. >>> import math

导入前

  1. >>> dir()
  2. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

导入后

  1. >>> import math
  2. >>> dir()
  3. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'math']
  4. >>> import os
  5. >>> dir()
  6. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'math', 'os']

dir(obj) 返回所有属性的字符串列表

  1. >>> dir(math)
  2. ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

help(obj) 查看模块的文档字符串

  1. >>> import math
  2. >>> help(math)

会显示模块的文档字符串

  1. Help on built-in module math:
  2. NAME
  3. math
  4. DESCRIPTION
  5. This module is always available. It provides access to the
  6. mathematical functions defined by the C standard.
  7. FUNCTIONS
  8. acos(...)
  9. acos(x)
  10. Return the arc cosine (measured in radians) of x.
  11. ....... #此处省略部分函数名称
  12. tanh(...)
  13. tanh(x
  14. Return the hyperbolic tangent of x.
  15. DATA
  16. e = 2.718281828459045
  17. inf = inf
  18. nan = nan
  19. pi = 3.141592653589793
  20.  
  21. FILE
  22. (built-in)
  23. (END)

用法:模块名.属性名

示例1 :打印常量π

  1. >>> import math
  2. >>> print(math.pi)
  3. 3.141592653589793

注意:必须是小写,没有大写 PI 变量

示例2 :求5的阶乘

  1. >>> import math
  2. >>> print(math.factorial(5))
  3. 120

2.2 from improt 语句

作用

将某模块的一个或多个属性导入到当前模块的作用域

语法

from 模块名 import 模块属性名1 [as 属性新名1] [,模块名属性2 [as 属性新名2]]

示例

  1. from math import sin
  2. from math import sin, sin, cos
  3. from math import pi #将math.pi导入到当前
  4. from math import factorial as f #将factorial 缩写为 f
  1. >>> dir()
  2. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
  3. >>> from math import sin
  4. >>> dir()
  5. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'sin']

在这里,就可以直接使用 sin 函数

2.3 from import * 语句

作用

将某模块的所有属性导入到当前模块

语法

from 模块名 import *

示例

  1. >>> dir()
  2. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
  3. >>> from math import *
  4. >>> dir()
  5. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
  6. >>> sin(pi/2)
  7. 1.0
  8. >>> factorial(5)
  9. 120

缺点
可能会引入模块中的变量与自定义变量冲突.一般将其写在模块的头部,尽量避免导入模块中的变量将自定义变量值改变

2.4 模块加载初步介绍

无论是上述三种( improt 语句 、 from improt 语句 、 from import * 语句 )的那种形式,首次加载时将模块中的变量全部加载。

在模块导入时,无论那种导入方式,模块的所有语句会被执行

如果一个模块已经导入,则再次导入时不会重新执行模块内的语句

如test1.py模块

  1. '''
  2. 这是test.py模块文件
  3.  
  4. 这个模块是学习测试时使用
  5. 这个模块中共有 个变量,其中函数变量有 个
  6. '''
  7.  
  8. def fun1(a,b):
  9. a = 1
  10. b = 2
  11. pass
  12.  
  13. def fun2(m,n):
  14. pass
  15.  
  16. para1 = "a"
  17. para2 = "b"
  18.  
  19. c = map(fun1,[1,2])
  20.  
  21. print("test1模块被调用了")

在交互模式下运行

  1. >>> import test1
  2. test1模块被调用了
  3. >>> dir()
  4. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'test1']
  5. >>> dir(test1)
  6. ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'c', 'fun1', 'fun2', 'para1', 'para2']

注意:尽管 print() 函数加载了,但是使用 dir() 返回参数列表时,函数变量 print() 和 map() 并没有出现在该模块范围内

为了更明显地显示首次加载模块时是将模块中的“全局”变量均加载一遍,现重新在交互模式下运行

  1. >>> from test1 import fun1
  2. test1模块被调用了
  3. >>> from test1 import para1
  4. >>> dir(test1)
  5. Traceback (most recent call last):
  6. File "<stdin>", line 1, in <module>
  7. NameError: name 'test1' is not defined
  8. >>> dir()
  9. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'fun1', 'para1']

我们可以看到首次调用时有“test1模块被调用了”,但是第二次调用test1模块中的para1时,就没有出现“test1模块被调用了”。

同时我们可以看到查看test1模块的变量时,显示test1没有定义,也即test1没有被引用到当前模块中

dir()时,可以显示当前模块的全部变量,则有test1模块中的fun1para1两个变量调用到当前模块

注意这里面的关系。

模块中的函数也有文档字符串时

  1. '''
  2. 这是test.py模块文件
  3.  
  4. 这个模块是学习测试时使用
  5. 这个模块中共有 个变量,其中函数变量有 个
  6. '''
  7.  
  8. def fun1(a,b):
  9. '''
  10. 这个是fun1测试函数
  11.  
  12. 函数中有两个变量
  13. :param a:
  14. :param b:
  15. :return:
  16. '''
  17. a = 1
  18. b = 2
  19. pass

在交互模式下运行

  1. >>> import test1
  2. >>> help(test1)

则有

  1. Help on module test1:
  2.  
  3. NAME
  4. test1 - 这是test.py模块文件
  5.  
  6. DESCRIPTION
  7. 这个模块是学习测试时使用
  8. 这个模块中共有 个变量,其中函数变量有 个
  9.  
  10. FUNCTIONS
  11. fun1(a, b)
  12. 这个是fun1测试函数
  13.  
  14. 函数中有两个变量
  15. :param a:
  16. :param b:
  17. :return:
  18.  
  19. FILE
  20. /home/tarena/桌面/day13/test1.py

在上述案例中同时交互模式下运行

  1. >>>help(test1.fun1)

则有

  1. Help on function fun1 in module test1:
  2.  
  3. fun1(a, b)
  4. 这个是fun1测试函数
  5.  
  6. 函数中有两个变量
  7. :param a:
  8. :param b:
  9. :return:
  10. (END)

3 常见的模块(内置&标准库模块)

内置模块有:builtins  sys  time  posix  itertools等
标准库模块:random  math  datetime  os  xml  re  functools等

3.1 数学模块 math

在 linux 是内建模块,在 os 中是标准库模块
math.e 自然对数的底
math.pi π

  1. math.sin(x)
  2. math.cos(x)
  3. math.tan(x)
  4. math.asin(x)
  5. math.acos(x)
  6. math.atan(x)
  7. math.degrees(x)# 弧度转角度
  8. math.radians(x)#角度转弧度
  9. math.ceil(x) 向上取整
  10. math.floor(x) 向下取整
  11. math.sqrt(x) 求平方根
  12. math.factorial(x) x的阶乘
  13. math.log(x[,base])
  14. math.log10(x)
  15. math.pow(x,y)
  16. math.fabs(x)

三角函数中的x是以弧度为单位的

4 模块的属性

4.1 __name__属性:

作用:

1 记录模块名

2 用来判断是否为主模块

说明:

1 对于被导入模块,模块名 = 文件名 - "路径 前缀" 和 .py后缀

2 对于主模块,模块名为"__main__"

示例:

模块test1

  1. def mysum(begin: "开始", end: "结束(不包含end)")-> int:
  2. s = 0
  3. for x in range(begin, end):
  4. s += x
  5. return s
  6.  
  7. def mymax(a, b, c):
  8. m = a
  9. if b > m:
  10. m = b
  11. if c > m:
  12. m = c
  13. return m
  14.  
  15. name1 = "audi"
  16. name2 = "tesla"
  17.  
  18. print("test1 模块被加载!")
  19. print("test1 模块内的__name__属性的值为:",__name__)

模块test2

  1. import test1 # 导入定义的模块
  2.  
  3. print("5+6+7+...+ 100的和是:",
  4. test1.mysum(5, 101))
  5.  
  6. print("最大的一个数是:", test1.mymax(1,2,3))
  7. print("test1.name1=", test1.name1)
  8. print("test2 模块内的__name__属性的值为:",__name__)

运行test2模块

  1. test1 模块被加载!
  2. test1 模块内的__name__属性的值为: test1
  3. 5+6+7+...+ 100的和是: 5040
  4. 最大的一个数是: 3
  5. test1.name1= audi
  6. test2 模块内的__name__属性的值为: __main__

4.2 __doc__属性

用来记录文档字符串, mymod.__doc__

4.3 __file__属性

用来记录模块的文件路径

注意:内建模块没有 __file__ 属性,自定义的模块存在这个属性值

内建模块:

  1. >>> import math
  2. >>> math.__file__
  3. Traceback (most recent call last):
  4. File "<stdin>", line 1, in <module>
  5. AttributeError: module 'math' has no attribute '__file__'

自定义模块

  1. >>> import test1 #导入4.1中的test1模块
  2. test1 模块被加载!
  3. test1 模块内的__name__属性的值为: test1
  4. >>> test1.__file__
  5. '/home/tarena/桌面/day13/test1.py'

4.3 __all__属性

用来存放可导出属性的列表,此列表中的元素是字符串

当以 from  模块 import * 这样形式从模块中将变量导入另外一个模块时,在模块开始处加入 __all__ 时,

只有该属性内的值才能被带入。

这样可以避免该模块下的所有变量导入到另外一个模块,过滤掉不想被调用的参数

模块test3

  1. __all__ = ['hello1', 'name1']
  2.  
  3. def hello1():
  4. pass
  5.  
  6. def hello2():
  7. pass
  8.  
  9. name1 = "模块"
  10. name2 = "加载"
  11.  
  12. print("test3 模块被加载!")

交互模式下运行test3模块

  1. >>> from test3 import *
  2. test3 模块被加载!
  3. >>> dir()
  4. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'hello1', 'name1']

但是当是 import 模块 或 from 模块 import 函数名 时是无效的。

  1. >>> import test3
  2. test3 模块被加载!
  3. >>> dir()
  4. ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'test3']
  5. >>> dir(test3)
  6. ['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'hello1', 'hello2', 'name1', 'name2']

4.4 时间模块time

写时间相关的模块
UTC 先将a地时间转成UTC时间,再将UTC时间转为b地时间
时间元组(年,月,日,时,分,秒,星期几,元旦开始日,夏令时修正时间)
公元纪年  0000-1-1 0:0:0
计算机元年 1970-1-1 0:0:0

4.5 随机模块random

import random as R
R.random() 返回一个[0,1)之间的随机浮点数
R.uniform(a.b) 返回一个[a.b)之间的随机浮点数

4.6 模块中的隐藏属性

模块中'__'(双下划线)开头,不是以"__"结尾的属性,在 import 模块    或  from 模块 import *  导入时,将不被导入

Python高级特性:私有属性

5 模块的加载

5.1 模块的加载过程

1 先搜索相关路径找模块(.py文件)

2 判断是否有此模块对应的.pyc,如果.pyc文件是有最新的.py文件生成(其实就是比较两文件的最后时间),则直接加载.pyc(compile)

3 如果.pyc文件的生长时间比.py晚,说明.py文件已经修改但没有生成新的.pyc文件,则生成.pyc文件并将其加载执行

mymod.py --(编译)-> mymod.pyc --(解释执行)->python3

5.2 模块路径的搜索顺序

1 搜索当前路径

2 sys.path提供的路径

3 搜索内置模块

5.3 sys模块

sys.path 模块的搜索路径

sys.platform 操作系统平台信息

sys.argv 命令行参数

sys.exit() 推出程序

5.4 添加模块的加载路径

1 方法1

  1. import sys
  2. #sys.path.append("mymod.py所在的绝对路径")
  3. sys.path.append("/home/tarena/waid1710/day13/code")
  4. import mymod.py #成功

2 方案2

将路径添加在pythonpath环境变量中,该语法为linux与shell想结合的语法
例如:

  1. #$ export PYTHONPATH = $PYTHONPATH:mymod.py的绝对路径
  2. $ export PYTHONPATH=$PYTHONPATH:/home/tarena/waid1710/day13/code

加载后,通过sys.path 可以查看到该路径

PYTHONPATH环境变量
PYTHONPATH环境变量里的值或自动添加到sys.path列表中

python学习笔记013——模块的更多相关文章

  1. python学习笔记013——模块中的私有属性

    1 私有属性的使用方式 在python中,没有类似private之类的关键字来声明私有方法或属性.若要声明其私有属性,语法规则为: 属性前加双下划线,属性后不加(双)下划线,如将属性name私有化,则 ...

  2. Python学习笔记之模块与包

    一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...

  3. Python学习笔记—itertools模块

    这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...

  4. python学习笔记_week5_模块

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

  5. python学习笔记(八)-模块

    大型python程序以模块和包的形式组织.python标准库中包含大量的模块.一个python文件就是一个模块.1.标准模块 python自带的,不需要你安装的2.第三方模块 需要安装,别人提供的. ...

  6. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

  7. Python学习笔记1—模块

    模块的使用 引用模块的两种形式 形式一: import module_name 形式二: from module1 import module11   (module11是module的子模块) 例: ...

  8. Python学习笔记2——模块的发布

    1.为模块nester创建文件夹nester,其中包含:nester.py(模块文件): """这是"nester.py"模块,提供了一个名为prin ...

  9. python学习笔记十——模块与函数

    第五章 模块与函数 5.1 python程序的结构 函数+类->模块              模块+模块->包                 函数+类+模块+包=Python pyth ...

随机推荐

  1. Apache PHP Mysql 开发环境快速配置

    学习PHP开发要配置各种环境,一般会用到apache作为服务器.Mysql数据库.如何快速的配置环境成为困扰大家的烦恼,之前自己也配过,比较繁琐. 最新发现一款集成安装软件“phpStudy”.真可谓 ...

  2. Android中XML解析-SAX解析

    昨天由于时间比较匆忙只写了Android中的XML解析的Dom方式,这种方式比较方便,很容易理解,最大的不足就是内容多的时候,会消耗内存.SAX(Simple API for XML)是一个解析速度快 ...

  3. Proxy 代理模式 动态代理 CGLIB

    代理的基本概念 几个英文单词: proxy [ˈprɒksi] n. 代理服务器:代表权:代理人,代替物:委托书: invoke [ɪnˈvəʊk] vt. 乞灵,祈求:提出或授引-以支持或证明:召鬼 ...

  4. permission 文档 翻译 运行时权限

    文档位置:API24/guide/topics/security/permissions.html  System Permissions 系统权限 Android is a privilege-se ...

  5. IOS基本数据类型之枚举

    枚举是C语言中的一种基本数据类型,通过枚举可以声明一组常数,来代表不同的含义,它实际上就是一组整型常量的集合. 枚举是非常常用的一种类型,在现实生活中也很常见.比如有四个季节,在不同的季节需要显示不同 ...

  6. 运维-JVM监控之内存泄漏

    转载:https://blog.csdn.net/zdx_csdn/article/details/71214219 jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法.堆配置参数 ...

  7. MongoDB社区版本和企业版本差别

    MongoDB社区版本和企业版本差异主要体现在安全认证.系统认证等方面,具体信息参考下表: 版本特性 社区版本 企业版本 JSON数据模型.自由模式 支持 支持 水平扩展的自动分片功能 支持 支持 内 ...

  8. 在MyEclipse中配置Weblogic10服务器

    MyEclipse中配置Weblogic10服务器 在MyEclipse中配置Weblogic10服务器也是很简单,现在将过程分享给有需要的人. 1.在下方的Server选项卡中,鼠标右键选择“Con ...

  9. Centos6.6系统root用户密码恢复案例(转)

    原文:http://www.centoscn.com/CentOS/Intermediate/2015/0131/4604.html 通过单用户模式恢复root用户密码 重新启动主机后,在出现Grub ...

  10. MySQL单列索引和组合索引(联合索引)的区别详解

    发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...