那些Python中的模块

Python022

那些Python中的模块,第1张

Python的解释环境是很好用,但是如果我们需要编写一个大型的程序的时候,解释环境就完全不够用了。这个时候我们需要将python程序保存在一个文件里。通常这个文件是以.py结尾的。

对于大型的应用程序来说,一个文件可能是不够的,这个时候我们需要在文件中引用其他的文件,这样文件就叫做模块

模块是一个包含Python定义和语句的文件。文件名就是模块名后跟文件后缀 .py 。在模块内部,模块名可以通过全局变量 __name__ 获得。

还是之前的斐波拉赫数列的例子,我们在fibo.py文件中存放了函数的实现:

编写完毕之后,我们可以在Python的解释环境中导入它:

然后直接使用即可:

常用的函数,我们可以将其赋值给一个变量:

或者,我们在导入的时候,直接给这个模块起个名字:

或者导入模块中的函数:

每个模块都有它自己的私有符号表,该表用作模块中定义的所有函数的全局符号表。因此,模块的作者可以在模块内使用全局变量,而不必担心与用户的全局变量发生意外冲突。

前面我们提到了可以使用import来导入一个模块,并且 __name__ 中保存的是模块的名字。

和java中的main方法一样,如果我们想要在模块中进行一些测试工作,有没有类似java中main方法的写法呢?

先看一个例子:

在模块中,我们需要进行一个判断 __name__ 是不是被赋值为 "__main__"。

我们这样来执行这个模块:

以脚本执行的情况下,模块的 __name__ 属性会被赋值为 __main__ , 这也是例子中为什么要这样写的原因。

看下执行效果:

如果是以模块导入的话,那么将不会被执行:

使用import导入模块的时候,解释器首先会去找该名字的内置模块,如果没找到的话,解释器会从 sys.path变量给出的目录列表里寻找。

sys.path的初始目录包括:

要想查看模块中定义的内容,可以使用dir函数。

上面的例子列出了当前模块中定义的内容,包括变量,模块,函数等。

我们可以给dir加上参数,来获取特定模块的内容:

java中有package的概念,用来隔离程序代码。同样的在Python中也有包。

我们看一个Python中包的例子:

上面我们定义了4个包,分别是sound,sound.formats, sound.effects, sound.filters。

__init__.py 可以是一个空文件,也可以执行包的初始化代码或设置 __all__ 变量。

当导入的时候, python就会在 sys.path 路径中搜索该包。

包的导入有很多种方式,我们可以导入单个模块:

但是这样导入之后,使用的时候必须加载全名:

如果不想加载全名,可以这样导入:

那么就可以这样使用了:

还可以直接导入模块中的方法:

然后这样使用:

如果一个包里面的子包比较多,我们可能会希望使用 * 来一次性导入:

那么如何去控制到底会导入effects的哪一个子包呢?

我们可以在 __init__.py 中定义一个名叫 __all__ 的列表,在这个列表中列出将要导出的子包名,如下所示:

这样from sound.effects import * 将导入 sound 包的三个命名子模块。

如果没有定义 __all__,from sound.effects import * 语句 不会 从包 sound.effects 中导入所有子模块到当前命名空间;它只会导入包 sound.effects。

Import 可以指定相对路径,我们使用 . 来表示当前包, 使用 .. 来表示父包。

如下所示:

import os

print(os.name)  # 操作系统名称  Windows nt 非Windows posix

print(os.sep)  # 路径分隔符    Windows \    其他 /

import os

# 使用 os.path 方法获取文件的路径

# 001.获取文件的绝对路径 使用abspath方法

print(os.path.abspath("04_模块导入.py"))

#  运行结果:D:\mypycharm\pythonProject\千峰培训\day11module1\04_模块导入.py

# 002判断是否是文件 False

print(os.path.isdir("")) 

# 运行结果: False

# 003.判断文件是否存在如果存在返回True 否则返回False

print(os.path.exists("mydir"))

# True

import os

files = "2020.12.22.test.py"

print(files.rpartition(".")[-1]) 

print(os.path.splitext(files)[-1])

# 运行结果:

# 获取文件的后缀名  py

# 获取文件的后缀名 .py

import os

print(os.getcwd())

# 运行结果:

# D:\mypycharm\pythonProject\培训\day11module1

import os

os.chdir("mydir")

print(os.getcwd())

# D:\mypycharm\pythonProject\培训\day11module1\mydir

import os

os.rename("66.py","../99.py")

import os

# 001.删除文件

os.remove("../99.py")

# 002.删除空文件夹

os.rmdir("../mydir")

os.removedirs("mydir")

import os

os.mkdir("mydir")

import os

# 001.列出指定目录里所有的子目录和文件

print(os.listdir("D:\mypycharm\pythonProject"))

# 002.默认当前目录里的 子目录和文件

print(os.listdir())

# 运行结果:

# ['.idea', '千峰培训', '学校实习']

# ['03_module.py', '04_模块导入.py', '05_os.py', '2020.12.22.tests.py', 'a01_module1.py', 'a02_module2.py', '__pycache__']

import os

print(os.environ)

print(os.environ["PATH"])

import os

import string  # 字符串模块

import random

files = "test.jpg"

#  01.获取文件的后缀

surffix = os.path.splitext(files)[-1]

# print(surffix)  # .jpg

# 02.生成所有大小写字母的列表

res = list(string.ascii_letters)

# print(string.ascii_letters)

# 运行结果;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

#  03.将0-9添加到res中

for i in range(0, 10):

    res.append(str(i))

# 04.随机生成文件名:

mystr = "".join(random.sample(res, 10))  #  sample随机生成10个字符

# print(mystr)

# bJpED6dj2Y

# 05.将文件名和后缀拼接

print(mystr+surffix)

import sys

print(sys.path)

res = sys.stdin

print(res)

import math

# print(math.pi)  # 3.141592653589793

print(math.factorial(5))  # 120

# 幂运算 第一个参数是底数 第二个参数是幂

print(math.pow(2, 3))  # 8.0

# 向上取整和向下取整

print(math.floor(15.999))  # 15

print(math.ceil(15.001))  # 16

# 四舍五入

print(round(123.51, 1))  # 123.5

# 三角函数

print(math.sin(math.pi / 6))  # sin(pi/6) 0.49999999999999994

print(math.cos(math.pi / 3))  # sin(pi/3) 0.5000000000000001

print(math.tan(math.pi / 4))  # sin(pi/6) 0.9999999999999999

# 开方

a = 9

b = 16

print(math.sqrt(a+b))  # 5.0

# 以e为底的指数函数

print(math.exp(a))

#  8103.083927575384

import random

# 01.random()  随机生成[0,1)之间的数  前闭后开

print(random.random())  # 生成[0,1)之间的小数

# 02.randint() 生成范围内的随机整数        全闭

print(random.randint(10, 20))  # 生成[10,20]之间的整数

# 03.randrange() 生成范围内的随机整数      前闭后开

print(random.randrange(10, 20))  # 生成[10,20)之间的整数

# 04.choice  参数是列表  随机从列表中取一个  取一次

print(random.choice([1, 2, 3, 4, 5, 6, 77, 8, 9]))

# 05.sample 的第一个参数 必须是一个可迭代对象

#          第二个参数代表着从可迭代对象从随机选取几个,选取的对象不能重复

print("".join(random.sample(["a", "b", "c", "d"], 3)))

import datetime as dt # 引入datetime 模块并将其命别名为dt

import time

import calendar  # 引入日历模块

# 01.datetime模块

# 001.获取当前时间的具体信息

print(dt.datetime.now()) 

# 运行结果:

# 2020-12-26 15:36:36.408129

# 年    月 日  时 分 秒  毫秒

# 002.创建日期

print(dt.date(2020,1,1)) 

# 年月日  2020-01-01

# 003.创建时间

print(dt.time(16,30,30))

# 时 分 秒:  16:30:30

# 004.timedelta() 括号中的默认参数是天

print(dt.datetime.now()+dt.timedelta(3))  # 2020-12-25 15:50:15.811738

print(dt.datetime.now()+dt.timedelta(hours=3))  # 2020-12-22 18:51:41.723093

print(dt.datetime.now()+dt.timedelta(minutes=10))  # 2020-12-22 16:01:41.723093

# 02.time

# 001.当前时间的时间戳

# 时间戳是指从1970—01-01 0:0:0到现在的秒数 utc时间 也叫格林尼治时间 

print(time.time())

# 002.按照指定格式输出时间

# print(time.strftime("%Y-%m-%d %H:%M:%S"))  # 2020-12-22 15:57:49

# 时间格式:

# %Y  Year with century as a decimal number.

# %m  Month as a decimal number [01,12].

# %d  Day of the month as a decimal number [01,31].

# %H  Hour (24-hour clock) as a decimal number [00,23].

# %M  Minute as a decimal number [00,59].

# %S  Second as a decimal number [00,61].

# %z  Time zone offset from UTC.

# %a  Locale's abbreviated weekday name.

# %A  Locale's full weekday name.

# %b  Locale's abbreviated month name.

# %B  Locale's full month name.

# %c  Locale's appropriate date and time representation.

# %I  Hour (12-hour clock) as a decimal number [01,12].

# %p  Locale's equivalent of either AM or PM.

# 003.ctime 和 asctime 时间格式  输出的时间格式一样,

# print(time.asctime())  # Tue Dec 22 15:57:49 2020

# print(time.ctime())  # Tue Dec 22 15:58:35 2020

# 004.sleep()  时间休眠

print("我负责浪")

print(time.sleep(3))

print("你负责漫")

# 005.calender 生成日历

res = calendar.calendar(2021)  # 生成2021年的日历

print(res)

# 006.判断是否为闰年

print(calendar.isleap(2020))  # True

# 007.从1988年 到 2020年有多少个闰年

print(calendar.leapdays(1988, 2020))  # 8

先来看一下 math 模块中包含内容,如下所示:

接下来具体看一下该模块的常用函数和常量。

ceil(x)

返回 x 的上限,即大于或者等于 x 的最小整数。看下示例

floor(x)

返回 x 的向下取整,小于或等于 x 的最大整数。看下示例:

fabs(x)

返回 x 的绝对值。看下示例:

fmod(x, y)

返回 x/y 的余数,值为浮点数。看下示例:

factorial(x)

返回 x 的阶乘,如果 x 不是整数或为负数时则将引发 ValueError。看下示例:

pow(x, y)

返回 x 的 y 次幂。看下示例:

fsum(iterable)

返回迭代器中所有元素的和。看下示例:

gcd(x, y)

返回整数 x 和 y 的最大公约数。看下示例:

sqrt(x)

返回 x 的平方根。看下示例:

trunc(x)

返回 x 的整数部分。看下示例:

exp(x)

返回 e 的 x 次幂。看下示例:

log(x[, base])

返回 x 的对数,底数默认为 e。看下示例:

常量

tan(x)

返回 x 弧度的正切值。看下示例:

atan(x)

返回 x 的反正切值。看下示例:

sin(x)

返回 x 弧度的正弦值。看下示例:

asin(x)

返回 x 的反正弦值。看下示例:

cos(x)

返回 x 弧度的余弦值。看下示例:

acos(x)

返回 x 的反余弦值。看下示例:

decimal 模块为正确舍入十进制浮点运算提供了支持,相比内置的浮点类型 float,它能更加精确的控制精度,能够为精度要求较高的金融等领域提供支持。

decimal 在一个独立的 context 下工作,可以使用 getcontext() 查看当前上下文,如下所示:

从上面的结果中我们可以看到 prec=28,这就是默认的精度,我们可以使用 getcontext().prec = xxx 来重新设置精度。接下来通过具体示例看一下。

基本运算

执行结果:

上面结果是用了默认精度,我们重新设置下精度再来看一下:

执行结果:

random 模块可以生成随机数,我们来看一下其常用函数。

random()

返回 [0.0, 1.0) 范围内的一个随机浮点数。看下示例:

uniform(a, b)

返回 [a, b) 范围内的一个随机浮点数。看下示例:

randint(a, b)

返回 [a, b] 范围内的一个随机整数。看下示例:

randrange(start, stop[, step])

返回 [start, stop) 范围内步长为 step 的一个随机整数。看下示例:

choice(seq)

从非空序列 seq 返回一个随机元素。 看下示例:

shuffle(x[, random])

将序列 x 随机打乱位置。看下示例:

sample(population, k)

返回从总体序列或集合中选择的唯一元素的 k 长度列表,用于无重复的随机抽样。看下示例:

参考:

https://docs.python.org/3/library/numeric.html