包和模块(上) 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
相关推荐
16月6日-晴7 分钟前
Java面向对象进阶—多态
java·开发语言
冯汉栩35 分钟前
Swift Control RollingCountdownView(动画倒计时)
开发语言·ios·swift
lisanmengmeng38 分钟前
搭建elk环境并接入frostmourne,实现监控报警效果(五)
开发语言·elk·日志·日志监控
Groundwork Explorer1 小时前
W5500 网卡编程初始化与使用指南
python·单片机
oh,huoyuyan1 小时前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
风流 少年1 小时前
hutool
java·服务器·开发语言
逸Y 仙X2 小时前
MCP(模型控制协议)完全指南:从核心概念到实战开发
python·大模型·llm·ai编程·mcp
Wang's Blog2 小时前
PostgreSQL笔记28: PostgreSQL ACID 特性与实现机制深度解析
大数据·笔记·postgresql
一木 之林2 小时前
四、STL容器与数据结构
开发语言·数据结构·c++
QX_hao2 小时前
【Go】--Cobra-cli的用法
开发语言·后端·golang