python 模块

python基础

浏览数:135

2019-9-2

AD:资源代下载服务

Python模块

  模块是一个包含一系列数据、函数、类等组合的程序组,可以供给其他模块或文件使用

  模块名、函数名、变量名必须是标识符,

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

模块的分类:

  内建模块(builtins)    在解析器内可以直接使用

  标准库模块,    安装python时已安装且可以直接使用

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

  用户自己编写的模块(可以作为其他人的第三方库)

pip安装第三方库:

临时使用:

可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple

例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent,这样就会从清华这边的镜像去安装gevent库。

永久使用:

linux下,修改 ~/.pip/pip.conf (没有就创建一个), 修改 index-url至tuna,内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

调用模块

引用模块: import module1,module2…

调用模块:模块名.函数名

语法:

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

from…import… 语句  from fib import fibonacci  #导入fib模块中的fibonacci函数,所以只能调用math函数里面的fibonacci函数

from…import * 语句  把一个模块里的所有内容导入到当前命名空间,直接调用函数就行,不用模块.函数,一般不建议使用

input(prompt)——以字符串的方式获取用户输入

bytes(string,encoding[,errors])——对指定的字符串进行编码,并以指定的方式处理错误

help([object])——提供交互式帮助

round(number[,ndigits])——四舍五入为指定的精度,正好为5时舍入到偶数

内建模块————数学模块 math

cmath.sqrt(number)——返回平方根,可用于负数

abs(number)——返回指定值的绝对值

math.e——自然对数的底e

math.pi——圆周率pi

函数名 描述
math.ceil(x) 对x向上取整,比如x=1.2,返回2
math.floor(x) 对x向下取整,比如x=1.2,返回1
math.sqrt(x) 返回x的平方根,不可用于负数
math.factorial(x) 求x的阶乘
math.log(x[, base]) 返回以base为底x的对数, 如果不给出base,则以自然对数e为底
math.log10(x) 求以10为底x的对数
math.pow(x, y[,z]) 返回 x**y%z (x的y次方对z求模的结果)
math.fabs(x) 返回浮点数x的绝对值
角度和弧度degrees互换  
math.degree(x) 将弧度x转换为角度
math.radians(x) 将角度x转换为弧度
三角函数  
math.sin(x) 返回x的正弦(x为弧度)
math.cos(x) 返回x的余弦(x为弧度)
math.tan(x) 返回x的正切(x为弧度)
math.asin(x) 返回x的反正弦(返回值为为弧度)
math.acos(x) 返回x的反余弦(返回值为为弧度)
math.atan(x) 返回x的反正切(返回值为为弧度)

内建标准库模块——时间模块  time

计算机元年是从1970年1月1日0时开始的,此时时间为0,之后每过一秒时间+1(UTC时间),比中国时间晚8个小时

注:CST为中国标准时间(China Standard Time UTC +8:00)

函数名 描述
time.time() 返回从计算机元年至当前时间的秒数的浮点数(UTC时间为准)
time.sleep(miao) 让程序按给定secs秒数的浮点数睡眠一段时间
time.asctime([tuple])

将9个元素时间元组转换为(美国时间格式)

Wed Jul 18 13:21:58 2018

不给参数返回当地当前时间(美国时间格式)

time.mktime(tuple) 将本地9个元素日期时间元组转换为UTC时间(秒)
time.gmtime(miao)

用给定秒数转换为UTC表达的9元素时间元组
(缺省返回当前时间元组)(不写参数时,返回当前时间元组)

time.struct_time(tm_year=2018, tm_mon=7, tm_mday=18, tm_hour=13, tm_min=9, tm_sec=41, tm_wday=2, tm_yday=199, tm_isdst=0)

time.localtime(miao)

返回9个元素的时间元组,缺省时默认返回本地的当前时间       

将UTC秒数时间转换为日期元组(以本地时间为准)


 1 import time
 2 print(time.asctime())   #Wed Jul 18 21:19:10 2018
 3 # test2: time.loaltime() 本地时间
 4 t1 = time.localtime()
 5 print(t1)#time.struct_time(tm_year=2018, tm_mon=7, tm_mday=18, tm_hour=21, tm_min=20, tm_sec=47, tm_wday=2, tm_yday=199, tm_isdst=0)
 6 
 7 #test3: time.gmtime() 格林威治标准时间
 8 t2 = time.gmtime()
 9 print(t2)#time.struct_time(tm_year=2018, tm_mon=7, tm_mday=18, tm_hour=13, tm_min=21, tm_sec=58, tm_wday=2, tm_yday=199, tm_isdst=0)
10 
11 #test4: 按time_struct,人工指定时间结构元组
12 t3 = (2018,7,18,21,25,23,0,0,0)
13 print(t3)#(2018, 7, 18, 21, 25, 23, 0, 0, 0)
14 print(time.asctime(t3))#Mon Jul 18 21:25:23 2018
15 
16 t4 = time.mktime(t3)
17 print(t4)   # 1531920323.0

时间模块

内建标准库模块———系统模块   sys

sys模块的属性

属性 描述
sys.path 模块搜索当前脚本程序的路径名,否则为 ”(空)
sys.modules 已加载模块的字典
sys.version 版本信息字符串
sys.version_info 版本信息的命名元组
sys.platform 操作系统平台名称信息
sys.argv 命令行参数 argv[0] 代表当前脚本程序名 **.py
sys.copyright 获得Python版权相关的信息
sys.builtin_module_names 获得Python内建模块的名称(字符串元组)

 内建标准库模块——随机模块   random

  用于生成随机输出

函数名 描述
R.random() 返回一个[0, 1) 之间的随机实数
R.uniform(a,b) 返回[a,b) 区间内的随机实数,区间可以不是整数
R.randrange([start,] stop[, step]) 返回一个range(start,stop,step)中的随机数
R.choice(seq) 从序列中返回随机选取一个数
R.shuffle(seq[, random]) 指定序列(sep)随机的打乱顺序
R.sample(seq,n) 从序列(sep)中选择n个随机且不重复的元素

模块包——paockage

  包就是文件夹,是包的文件夹必须存在__init__.py文件,通常放包的文档字符串,该文件的内容可以为空__int__用于标识当前文件夹是一个包,__init__会在包加载时自动调用,有利于防止命名冲突,可以在需要时加载一个或部分模块而不是全部模块

举个栗子:

test.py
package_runoob
|-- __init__.py
|-- runoob1.py
|-- runoob2.py

package_runoob/runoob1.py

1 def runoob1():
2    print "我是模块1"

package _runoob/runoob2.py

1 def runoob1():
2    print "我是模块2"

 在 package_runoob 目录下创建 __init__.py,有这个文件证明package_runoob是一个模块包

4 if __name__ == '__main__':
5     print '作为主程序运行'
6 else:
7     print 'package_runoob 初始化'

 然后我们在 package_runoob 同级目录下创建 test.py 来调用 package_runoob 包

4 # 导入 Phone 包
5 from package_runoob.runoob1 import runoob1
6 from package_runoob.runoob2 import runoob2
7  
8 runoob1()
9 runoob2()

 以上实例输出结果:

package_runoob 初始化
I'm in runoob1
I'm in runoob2

包的导入

 #import 语句

   import 包名 [as 包新名]

   import 包名.模块名 [as 模块新名]

   import 包名.子包名.模块名 [as 模块新名]

 #from import语句

   from 包名 import 模块名 [as 模块新名]

   from 包名.子包名 import 模块名 [as 模块新名]

   from 包名.子包名.模块名 import 属性名 [as 属性新名]

   from 模块名 import 函数名  (不用写模块名.函数名)

 # from import *语句

   from 模块名 import*  (不用写模块名.函数名)

   from 包名 import *

   from 包名.模块名 import *

导入包时搜索路径的顺序:

  1、搜索程序的当前路径

  2、sys.path 提供的路径

__init__.py内的__all__列表

  作用:用来记录此包中有哪些子包或者模块在用from import* 语句时被导用

  说明:__all__列表只对 from xxx import *语句起作用

包的相对导入是指包内模块的相互导入

  语法:

    from 相对路径包或模块 import 属性或模块名
    from 相对路径包或模块 import *

  相对路径:

  .代表当前目录

  .. 代表上一级目录

  … 代表上二级目录

  …. 以此类推

  注:相对导入时不能超出包的外部

python一般默认是绝对路径导包的

搜索路径

当你导入一个模块,Python 解析器对模块位置的搜索顺序是:

  • 1、当前目录
  • 2、如果不在当前目录,sys.path提供的路径,sys.path是一个列表,里面放着都是模块的搜索路径,
  • 3、如果都找不到,Python会察看默认路径,也就是内建模块。UNIX下,默认路径一般为/usr/local/lib/python/。

模块搜索路径存储在sys模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

python的环境变量(就是路径)  set PYTHONPATH=c:\python27\lib;

模块的加载过程

  1、在模块导入时,模块的所有语句都会执行一边

  2、如果模块已经导入那么在此导入不会重新执行模块内的语句

模块导入和执行的过程

  1、先搜索相关的路径,找到模块名.py

  2、判断是否由此模块对应的.pyc文件。如果.pyc文件比.py文件新,则直接加载.pyc文件

  3、否则用模块.py文件,生成.pyc文件,并加载执行

pyc python的编译
         编译        解释执行
mymod.py ——–> mymod.pyc ——–> python3

模块的预置属性

  模块的__doc__属性绑定此模块的文档字符串    print(__doc__)  #我是文档字符串

  模块的__file__属性记录模块对应的文件路径名     print(__file__)      #D:/Users/Never/PycharmProjects/Tedu/day13/练习.py

  模块的__name__属性 用来记录模块自身名字    print(__name__)  #’__main__’

     用处:1、记录函数名

        2、用来判断是否为主模块

    说明:1、当此模块为主模块(也就是第一个运行的模块时)运行时,__name__绑定的是__main__

       2、当此模块不是主模块时,而是被其他模块导入时,此时__name__绑定模块名

模块的属性调用时,就不需要使用模块名.属性

模块的__all__列表

  模块中的__all__列表是一个用来存放可导出属性的字符串列表

作用:当用from 模块名 import * 语句导入模块时,只导入__all__列表里面的属性(注意是模块名不是包名)

bk.py文件

# __all__属性只对 from import * 语句有效
__all__ = ['hello1', 'name1']

def hello1():
    print("1")

def hello2():
    print("2")

def hello3():
    print("3")

name1 = 'aaaaaa'
name2 = 'aaaaaa'

wo.py文件

from bk import*
hello1()
print(name1)

模块的隐藏属性  模块中以‘_’开头的属性,在from 模块名 import *或者from…import…导入时,将不被导入,通常称这些属性为隐藏属性

reload()函数

当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。

因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数。该函数会重新导入之前导入过的模块。语法如下:

  import imp

  imp.reload(module_name)

在这里,module_name要直接放模块的名字,而不是一个字符串形式,也不是字符串名。

help(obj)函数可以查看模块的相关文档字符串

dir( )函数:返回的是一个列表,容纳了括号中模块包含的所有变量、函数和模块


 1 import math
 2 content = dir(math)
 3 print(content)
 4 '''
 5 ['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 
 6 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 
 7 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
 8 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 
 9 'sqrt', 'tan', 'tanh']
10 '''
11 
12 dic()

dic()

在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的路径

globals()和locals()函数

根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。

如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。

如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。

两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。

多模块项目设计时,不要用global定义全局变量,可以用函数传参传入全局变量,全局变量写在main模块里面,然后main()调动主模块

如果实在没办法,可通过stdu.name = 2类似的方法把模块studname值调过来

 

作者:凌逆战