包和模块(上) python复习笔记

Python包和模块

当使用Python编程时,包(Packages)和模块(Modules)是两个关键的概念,它们有助于组织、管理和复用代码。

1. 模块(Modules)

1.1 什么是模块

一个.py 文件就是一个模块

模块是含有一系列数据函数等的程序

  • 作用

    把相关功能的函数等放在一起有利于管理,有利于多人合作开发

  • 模块的分类

    1. 内置模块(在python3 程序内部,可以直接使用)
    2. 标准库模块(在python3 安装完后就可以使用的 )
    3. 第三方模块(需要下载安装后才能使用)
    4. 自定义模块(用户自己编写)

    模块名如果要给别的程序导入,则模块名必须是 标识符

  • 实例

python 复制代码
## file: mymod.py
'''
小张写了一个模块,内部有两个函数,两个字符串
... 此处省略 200字
'''
name1 = 'audi'
name2 = 'tesla'

def mysum(n):
    '''
    此函数用来求和
    by weimingze
    '''
    print("正在计算, 1 + 2 + 3 + .... + n的和 ")

def get_name():
    return "tarena"

调用模块

python 复制代码
## file: test_mod.py
## 小李写的程序,小李想调用 小张写的 mymod.py 里的两个函数和两个字符串

## 用import 语句导入模块
import mymod

print(mymod.name1)  # Audi
print(mymod.name2)    # tesla

mymod.mysum(100)  # 调用 mymod 模块里的 mysum 函数
print(mymod.get_name())   # 'tarena'

1.2 导入模块

  • 语法
python 复制代码
import 模块名  [as 模块新名字1]

导入一个模块到当前程序

python 复制代码
from 模块名 import 模块属性名 [as 属性新名]

导入一个模块内部的部分属性到当前程序

python 复制代码
from 模块名 import *

导入一个模块内部的全部属性到当前程序

  • 示例

    python 复制代码
    import mymod
    mymod.mysum(10)   # 要加模块名
    
    from mymod import get_name
    print(get_name())   # 调用get_name 时不需要加 "模块名."
    
    from mymod import *   
    print(get_name())
    print(name2)
  • 模块的内部属性

    python 复制代码
    __file__  绑定模块的路径
    __name__  绑定模块的名称
           如果是主模块(首先启动的模块)则绑定 '__main__'
           如果不是主模块则 绑定 xxx.py 中的 xxx 这个模块名
  • 示例

    python 复制代码
    见: test_mymod.py  和 mymod.py
  • 模块的 __name__ 属性

    每个.py 模块文件都会有 __name__ 属性

    1. 当一个模块是最先运行的模块,则这个模块是主模块, 主模块的__name__ 属性绑定'__main__' 字符串

    2. 如果一个模块是用 三种 import 语句中的一个导入的模块,则此模块不是主模块。

      不是主模块的模块的 __name__ 绑定的 模块名

  • 主模块 (__name__ == '__main__') : 当一个模块是直接运行的,即不是通过 import 语句导入的,那么它的 __name__ 属性会被赋值为 '__main__'。例如:

python 复制代码
# main_module.py
if __name__ == "__main__":
    print("This is the main module.")

如果运行 python main_module.py,输出将是:

python 复制代码
This is the main module.
  • 被导入的模块 (__name__ == 模块名) : 当一个模块被导入到另一个模块中时,它的 __name__ 属性会被赋值为它的模块名。例如:
python 复制代码
# imported_module.py
print(f"This module's name is {__name__}") # 被其他模块导入时会自动运行

# main_module.py
import imported_module

if __name__ == "__main__":
    print("This is the main module.")

如果运行 python main_module.py,输出将是:

python 复制代码
This module's name is imported_module
This is the main module.

这里 imported_module.py 被导入到 main_module.py 中,所以它的 __name__'imported_module',而 main_module.py 是直接运行的,所以它的 __name__'__main__'

python 的第三方模块

https://pypi.org/

  • 使用导入的模块中的函数、变量等,可以通过模块名或从语句中导入的名称来访问。

1.3 Python 常用的内建模块

1.3.1 random 模块

先引入random库基础库:

python 复制代码
import random
函数 描述
random.choice(seq) 从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
random.randrange (start, stop,step) 从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
random.random() 随机生成下一个实数,它在[0,1)范围内。
random.shuffle(list) 将序列的所有元素随机排序,修改原list
uniform(x, y) 随机生成实数,它在[x,y]范围内.

生成随机数

文档位置: https://docs.python.org/zh-cn/3/library/random.html

python 复制代码
>>> import random
>>> random.randint(1, 6)  # random.randint(a,b) 生产 a~b的随机整数
3
>>> random.randint(1, 6)
4
>>> random.random()   # random.random  生成包含0 但不包含1 的浮点数
0.5884109388439075
>>> random.choice("ABCD")    # 从一个序列中,随机返回一个元素
'C'
>>> random.choice("ABCD")
'B'
>>> L = [1, 2, 3, 6, 9]
>>> random.choice(L)
6
>>> random.shuffle(L)   # random.shuffer(x)  # 把列表X 打乱
>>> L
[1, 6, 2, 9, 3]
  • 课后练习

    写一个程序, 生产6位由数字组成的随机密码

参考答案

python 复制代码
import random

## 生成 n 位的数字密码
def get_random_password(n):
    r_str = ''
    for _ in range(n):
        r_str += str(random.randint(0, 9))
    return r_str

## 生成 n 位的数字和字母组成的密码
charactors = '0123456789abcdefghijklmnopqrstwuxyz'
def get_random_password2(n):
    r_str = ''
    for _ in range(n):
        r_str += random.choice(charactors)
    return r_str


print(get_random_password(6))
print(get_random_password(6))
import time
time.sleep(10)
print(get_random_password2(10))
1.3.2 time 模块

https://docs.python.org/zh-cn/3/library/time.html

时间戳:从 1970年1月1日 0:0:0 UTC 时间 开始计时到现在的秒数

UTC 时间 : 世界协调时间

struct_time 用 含有9个元素的元组来表示时间

python 复制代码
>>> import time
>>> time.time()   # 返回当前时间的时间戳
1617117219.0382686
>>> time.ctime()    #返回当前的UTC 时间的字符串
'Tue Mar 30 23:14:48 2021'
>>> t1 = time.localtime()   # 返回当前的本地时间元组
>>> t1
time.struct_time(tm_year=2021, tm_mon=3, tm_mday=30, tm_hour=23, tm_min=18, tm_sec=22, tm_wday=1, tm_yday=89, tm_isdst=0)
>>> t1.tm_year
2021
>>> t1.tm_yday
89
>>> time.sleep(3)  # time.sleep(n)  # 让程序睡眠 n 秒
>>> time.strftime("%Y-%m-%d", t1)   # 格式化时间
'2021-03-30'
>>> time.strftime("%y-%m-%d", t1)
'21-03-30'
>>> time.strftime('%Y-%m-%d %H:%M:%S', t1)
'2021-07-21 17:37:41'
    # 用时间元组来创建一个自定义的时间
>>> t2 = time.struct_time ( (2021,1, 1, 10, 11, 20, 0, 0, 0) )
1.3.3 datetime 模块

https://docs.python.org/zh-cn/3/library/datetime.html

python 复制代码
>>> import datetime
>>> d1 = datetime.datetime.now()  # 返回当前的时间
>>> d1
datetime.datetime(2021, 3, 30, 23, 32, 7, 342559)
>>> d1.year
2021
>>> d1.year, d1.month, d1.day, d1.hour, d1.minute, d1.second, d1.microsecond  # 用 datetime 的各个属性可以得到 具体的信息
(2021, 3, 30, 23, 32, 44, 757673)
>>> d1.strftime("%Y-%m-%d")
'2021-03-30'

## 计算时间差
>>> delta_time = datetime.timedelta(days=2, hours=1)  # 生成 2天1小时后的时间差
>>> delta_time
datetime.timedelta(2, 3600)
>>> t1 = datetime.datetime.now()  # 得到当前时间
>>> t1
datetime.datetime(2021, 3, 30, 23, 39, 26, 863109)
>>> t1 + delta_time  # 计算 未来时间
datetime.datetime(2021, 4, 2, 0, 39, 26, 863109)
  1. 课后练习:

    猜数字游戏: guess_number.py
    随机生成一个0~100之间的一个整数,用变量x绑定
    让用户输入一个数y,输出猜数字的结果,
    如果y等于生成的数x,则提示"恭喜你猜对了",并退出程序
    如果y大于x,则提示"您猜的数字大了"
    如果y小于x,则提示"您猜的数字小了"
    直到猜对为止,显示用户猜数字的次数后退出程序.

python 复制代码
import random

def guess_number():
    x = random.randint(0, 100)
    guess_count = 0
    
    while True:
        y = input("请输入一个0到100之间的数字: ")
        
        # 检查输入是否为数字
        if not y.isdigit():
            print("请输入一个有效的数字")
            continue
        
        y = int(y)
        guess_count += 1
        
        if y == x:
            print(f"恭喜你猜对了!你一共猜了 {guess_count} 次.")
            break
        elif y > x:
            print("您猜的数字大了")
        else:
            print("您猜的数字小了")

if __name__ == "__main__":
    guess_number()
  1. 课后练习 2

    随机生成一个6位数字组成的验证码!

1.3.4 os 模块
os 模块

os模块是Python标准库中的一部分,提供了一种与操作系统进行交互的方法。主要功能包括文件和目录的操作、路径处理、进程管理等。在使用os模块之前,我们需要先导入它:

python 复制代码
import os

举例

python 复制代码
#1. os.getcwd(): 获取当前工作目录
import os
current_directory = os.getcwd()
print("当前工作目录:", current_directory)

#2. os.chdir(path): 改变当前工作目录
import os
new_directory = "/path/to/new/directory"
os.chdir(new_directory)
print("工作目录已更改为:", os.getcwd())

#3. os.listdir(path='.'): 返回指定目录下的所有文件和目录列表
import os
directory_path = "."
files_and_dirs = os.listdir(directory_path)
print("指定目录下的文件和目录列表:", files_and_dirs)

#4. os.mkdir(path): 创建目录
import os
new_directory = "new_folder"
os.mkdir(new_directory)
print(f"目录 '{new_directory}' 已创建")

#5. os.rmdir(path): 删除目录
import os
directory_to_remove = "new_folder"
os.rmdir(directory_to_remove)
print(f"目录 '{directory_to_remove}' 已删除")

#6. os.remove(path): 删除文件
import os
file_to_remove = "example.txt"
os.remove(file_to_remove)
print(f"文件 '{file_to_remove}' 已删除")
os.path 模块

os.path 模块是 Python 标准库的一部分,专门用于处理文件和目录路径的操作。它提供了一系列函数,用于操作和处理文件路径,使得路径操作更加方便和跨平台。

python 复制代码
#1.os.path.basename(path): 返回路径中最后的文件名或目录名
import os
path = "/path/to/some/file.txt"
print(os.path.basename(path))  # 输出: file.txt

#2.os.path.dirname(path): 返回路径中的目录部分
import os
path = "/path/to/some/file.txt"
print(os.path.dirname(path))  # 输出: /path/to/some

#3.os.path.join(*paths): 将多个路径合并成一个路径
import os
path1 = "/path/to"
path2 = "some/file.txt"
full_path = os.path.join(path1, path2)
print(full_path)  # 输出: /path/to/some/file.txt

#4.os.path.split(path): 将路径分割成目录和文件名
import os
path = "/path/to/some/file.txt"
print(os.path.split(path))  # 输出: ('/path/to/some', 'file.txt')

#5.os.path.splitext(path): 将路径分割成文件名和扩展名
import os
path = "/path/to/some/file.txt"
print(os.path.splitext(path))  # 输出: ('/path/to/some/file', '.txt')

#6.os.path.exists(path): 检查路径是否存在
import os
path = "/path/to/some/file.txt"
print(os.path.exists(path))  # 输出: True 或 False

#7.os.path.isfile(path): 检查路径是否是文件
import os
path = "/path/to/some/file.txt"
print(os.path.isfile(path))  # 输出: True 或 False

#8.os.path.isdir(path): 检查路径是否是目录
import os
path = "/path/to/some/directory"
print(os.path.isdir(path))  # 输出: True 或 False
相关推荐
以后不吃煲仔饭1 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师2 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者6 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
程序猿阿伟8 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
傻啦嘿哟26 分钟前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
大数据编程之光30 分钟前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
初九之潜龙勿用30 分钟前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net
B站计算机毕业设计超人32 分钟前
计算机毕业设计SparkStreaming+Kafka旅游推荐系统 旅游景点客流量预测 旅游可视化 旅游大数据 Hive数据仓库 机器学习 深度学习
大数据·数据仓库·hadoop·python·kafka·课程设计·数据可视化
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
ExiFengs1 小时前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring