python 模块和包管理

Posted Hub-Link

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 模块和包管理相关的知识,希望对你有一定的参考价值。

一、模块导入

导入模块,其实就是导入第三方模块,我们直接调用这个第三方模块里面的方法即可。导入模块需要使用关键字 import

import math

math是Python标准库中的一个模块,用来进行数学运算

## 计算一个数的平方根
math.sqrt(4)

我们可以使用dir函数来查看math模块里的所有函数

dir(math)

我们也可以使用from … import … 这种语句来具体导入某一个子模块或函数

from math import sqrt
sqrt(4)

这种方式更精确的导入某个函数,使用起来更方便, 但要注意重名的问题。如果说我们的代码本来就有一个叫sqrt的函数,那我们可以使用 as 关键字来给模块起一个别名。

from math import sqrt as squarte
def sqrt(num):    ## 我们自定义的函数
    pass
squarte(4) # 2

有时候需要一次性导入多个模块

import sys, os
from math import sqrt, pow

二、自定义模块

有些时候第三方的模块不能满足我们自己的业务需求,这个时候我们就可以自定义模块

我们以一个综合案例“电商购物车”为例,实际的文件结构应该是这样的

init.py,这是一个空文件,它的文件名看起来很奇怪,这是Python规定的命名规范,只要目录有一个名为__init__.py的文件,则将这个目录视为包(package)

main.py作为项目的入口文件,我们实际运行的时候就是从它启动

1、main.py代码
from shopcart.cart import Cart
from shopcart.goods import Goods

if __name__ == '__main__':
    g1 = Goods('iPhone 11', 6000, 0.9)
    g2 = Goods('U盘32G', 100, 0.8)
    g3 = Goods('华为P40', 5000)
    cart = Cart()
    cart.add(g1)
    cart.add(g2, 3)

name 表示当前文件所在模块的名称,模块可以通过检查自己的 name 来得知是否运行在main 作用域中,这使得模块可以在作为脚本运行时条件性地执行一些代码,而在被 import 时不会执行。

2、cart.py代码
class Cart:
    """购物车"""

    def __init__(self):
        self.cart = 
        self.goods_list = []

    def add(self, goods, num=1):
        """向购物车中添加商品"""
        if goods in self.goods_list:
            self.cart[goods.id] = self.cart[goods.id] + num
        else:
            self.goods_list.append(goods)
            self.cart[goods.id] = num
        print(goods.id+" 商品添加购物车成功.")

3、goods.py代码
class Goods:
    """商品类"""
    id_count = 0

    @classmethod
    def generate_id(cls):
        cls.id_count += 1
        return cls.id_count

    def __init__(self, name, price, discount=1):
        self.id = str(self.generate_id()).zfill(5)
        self.name = name
        self.price = price
        self.discount = discount

    def calc_price(self):
        """计算商品打折后的实际价格"""
        return self.price * self.discount

三、常用内置模块

1、os - 操作系统接口

os 模块提供了一种使用与操作系统相关的功能的便捷式途径

# 获取当前目录的路径
os.getcwd()
# 创建指定目录
os.mkdir(path)
# 与 mkdir() 类似,但会自动创建到达最后一级目录所需要的中间目录。
os.makedirs(path)
# 返回一个列表,该列表包含了 path 中所有文件与目录的名称。
os.listdir()

另一个很常用的子模块就是os.path,它提供了常用的路径操作

# 显示当前目录的绝对路径
os.path.abspath('./')
os.path.abspath("__file__")

在大部分操作系统中,一般用 . 表示当前目录,用 … 表示父级目录

相对路径:相对于当前目录的路径

绝对路径:以根目录为开始的路径(windows和Mac、Linux的根目录不同)

目录分隔符:windows 是 \\ , Mac 和 Linux中是 /

# 如果 path 是 现有的 目录,则返回 True。
os.path.isdir(path)
# 如果 path 是 现有的 常规文件,则返回 True。
os.path.isfile()
# 目录分隔符
os.sep
# 合理地拼接一个或多个路径部分。
os.path.join(path, *paths)
# 返回路径 path 的目录名称
os.path.dirname("/tmp/test.txt") # '/tmp'
# 返回路径 path 的基本名称,文件名或是最后一级的目录名
os.path.basename("/tmp/test.txt") # 'test.txt'
os.path.basename("/tmp/test") # 'test'
2、sys -系统相关参数及函数
  • sys.path 函数: 它返回的是一个列表,包含了若干个路径,它表示的是Python查找包的路径顺序,有一个空字符串,它表示当前目录

  • sys.argv 函数: 表示启动的时候传递给Python脚本的命令行参数
import sys
if __name__ == '__main__':
    print("Hello", end=' ')
    if len(sys.argv) > 1:
        print(' '.join(sys.argv[1:]))

    print(sys.argv)

上述是一个Python脚本 hello.py 的代码,现在我们试着用不同的方式启动它

python hello.py
python hello.py Mike
python hello.py Mr Mike

可以看到sys.argv是一个列表,它的第一个元素就是脚本的文件名。所以传递它的启动参数,都会放在列表的后面。我们可以使用这种方式接收用户传递的参数。

3、random - 生成随机数

准确的说是生成伪随机数,这是一个数学问题。默认random模块会根据当前的系统时间作为随机数种子,所以可以保证生成的随机数不会重复。

# 生成一个随机浮点数,范围[0.0, 1.0)
random.random()
# 生成1到100之间的随机整数,包括1和100
random.randint(1, 100)
# 从序列中随机抽出一个元素
random.choice(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
# 从序列中随机抽出k个元素,注意抽出来的元素可能会重复
random.choices(['a', 'b', 'c', 'd', 'e', 'f', 'g'], k=2)
# 跟choices函数类似,但它是不重复的随机抽样
random.sample(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
# 将一个序列随机打乱,注意这个序列不能是只读的
lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
random.shuffle(lst)

以上是关于python 模块和包管理的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7 学习笔记 模块和包

基础入门_Python-模块和包.深入Celery之节点管理/任务调度/任务追踪?

模块和包

python中模块和包的零基础学习

python中模块和包的零基础学习

python中模块和包的零基础学习