Python 编程 | 连载 19 - Package 和 Module

2022-09-26 15:39:12 浏览数 (1)


一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。

一、Python 中的包及包的导入

包既文件夹,包中可以包含子包既子文件夹,一个个 Python 脚本就是模块,模块中有包含了类和函数。 Python 的包中必须包含一个 __init__.py 文件,文件内容任意,不包含 __init__.py 文件,这个包就无法被他人使用

新建三个 Python Package,分别是 alpha、bravo、charlie,使用 PyCharm 新建 Python Package 会自动包含 __init__.py 文件

在 alpha 包下新建 alpha 模块并增加函数

代码语言:javascript复制
def walk():
    return 'alpha包下的alpha模块中的walk函数被调用'

def run():
    return 'alpha包下的alpha模块中的run函数被调用'

在 bravo 包下新建 bravo 模块并增加函数

代码语言:javascript复制
def rush():
    return 'bravo包下的bravo模块中的rush函数被调用'

def run():
    return 'bravo包下的bravo模块中的run函数被调用'

在 charlie 包下新建 charlie 模块并增加类别全局变量

代码语言:javascript复制
heros = ['stark', 'banner', 'thor']

heros_org_name = 'Avengers'

class Hero:

    def __init__(self, name):
        self.name = name

    def __str__(self):
        return 'charlie包下的charlie模块中的Hero对象被实例化了'

包和模块的导入

导入既将 Python 中的某个包或者模块导入当前的脚本中,导入使用 from 和 import 关键字,模块被导入后,就可以在当前文件中使用导入模块的函数类或者变量等。

在命令行中导入模块

新建一个 test.py,与 lilith 包在同一级目录

代码语言:javascript复制
def hello():
    print('hello')

在该目录下开启命令进入 Python3 的运行界面,使用 import 关键字导入

在lilith包新建一个lilith.py脚本文件,在该文件中新增lilith函数

代码语言:javascript复制
def lilith():
    print('lilith包下的lilith模块中的lilith函数被调用')

在 test.py 文件中想要引用 lilith 函数,就必须使用 from import 关键字导入lilith模块,通过lilith模块调用lilith函数

代码语言:javascript复制
from lilith import lilith
lilith.lilith()

多级导入

lilith模块中还包含了alpha包、bravo包以及charlie包,想要在test.py文件中导入alpha、bravo、charlie包就需要现在lilith模块中导入这三个包,可以将导入语句写在lilith包下的__init__.py文件中

代码语言:javascript复制
from .alpha import alpha
from .bravo import bravo
from .charlie import charlie

再在test.py文件中导入alpha包

代码语言:javascript复制
from lilith import alpha
print(alpha.walk())

alpha模块中和bravo模块中都存在run函数,此时可以使用as关键字进行重命名

代码语言:javascript复制
from lilith.alpha.alpha import run as alpha_run
from lilith.bravo.bravo import run as bravo_run
print(alpha_run())
print(bravo_run())

导入语句非常的长,先要导入charlie模块下的类和变量可以将lilith包下的__init__.py文件中的导入语句改为

代码语言:javascript复制
from .charlie.charlie import Hero, heros, heros_org_name

直接将需要用到的变量、类导入到当前lilith包中,这样在test.py文件中可以直接从lilith模块中导入这些变量

代码语言:javascript复制
from lilith import Hero, heros_org_name, heros

hero = Hero('stark')
print(hero)
print(heros_org_name)
for i in heros:
    print(i)

二、Python 中常用的第三方包/库

Python 中有非常多的功能完善的第三方库,通过这些第三方库可以极大的提高开发效率,有些第三方库是Python自带的,有些不是Python自带的,需要通过pip安装工具进行安装使用,推荐使用国内的镜像源,安装速度更快,使用Python官方的源非常容易超时,导致安装失败

代码语言:javascript复制
pip3 install 第三方库的名称 -i https://pypi.tuna.tsinghua.edu.cn/simple

datetime 模块

datetime是比较常用的一个库,可以用来获取当前时间,时间间隔等;并且支持时间对象和字符串之间的互相转换。

datetime库需要导入使用

代码语言:javascript复制
import datetime

# 获取当前时间
now_time = datetime.datetime.now()
print(now_time)

# 实例化一个时间对象
datetime_obj = datetime.datetime(2022, 4, 14, 17, 00, 0000)
print(datetime_obj)
print(type(datetime_obj))
代码语言:javascript复制
from datetime import datetime
from datetime import timedelta

diff_time = timedelta(weeks=0, days=1, hours=0, minutes=0, seconds=0, microseconds=0)

last_day = datetime.now() - diff_time
print(last_day)
print(type(last_day))

时间对象转成字符串

使用datetime对象的strftime函数可以将datetime对象转换成str对象

代码语言:javascript复制
from datetime import datetime

datetime_obj = datetime.now()
print(datetime_obj)
print(type(datetime_obj))

datetime_str = datetime_obj.strftime('%Y-%m-%d %H:%M:%S')
print(datetime_str)
print(type(datetime_str))

datetime_str_02 = datetime_obj.strftime('%Y/%m/%d %H:%M:%S')
print(datetime_str_02)
print(type(datetime_str_02))

时间字符串转成时间对象

将字符串类型的时间转换成datetime类型的时间需要使用到strptime()函数,接收两个参数,分别是符合时间格式的字符串和室间隔字符串匹配规则

代码语言:javascript复制
# 转换为datetime对象
print('------字符串类型的时间转换为datetime类型的时间')
new_datetime_obj = datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S')
print(new_datetime_obj)
print(type(new_datetime_obj))

new_datetime_obj_02 = datetime.strptime(datetime_str_02, '%Y/%m/%d %H:%M:%S')
print(new_datetime_obj_02)
print(type(new_datetime_obj_02))

字符

含义

%Y

表示四位数年份,如2022

%m

表示两位数月份,如01-12

%d

表示两位数的月份中的天,如01-31

%H

表示一天中的24小时,00-23

%I

表示一天中的第几个小时, 01-12

%M

表示当前是第几分钟, 00-59

%I

表示当前第多少秒, 0-61 闰年多占2秒

%I

表示当前第多少毫秒

英文星期月份格式化字符

字符

含义

%a

星期简称,Mon, Mar, Apr

%A

星期全称,Monday, Friday

%b

月份简称,Jan, Feb, Apr

%B

月份全称,March, April

%c

本地时间

%p

上午下午,AM,PM

%j

一年中的第几天

%U

一年中的星期数

time 模块

time 模块可以对时间进行处理包含了许多函数。

time() 函数

时间戳既timestamp,是一个float类型的时间数据,是指从1970年1月1日00时00分00秒,至今的总毫秒数,time() 函数可以返回一个时间戳

代码语言:javascript复制
import time

timestamp_01 = time.time()
print(timestamp_01)
print(type(timestamp_01))

localtime() 函数

localtime()函数可以获取本地的时间

代码语言:javascript复制
import time

localtime_01 = time.localtime()
print(localtime_01)
print(type(localtime_01))

也可以传入一个时间戳,将时间戳转换为localtime,比如传入1630004519.7968051

此时打印出的year即为2021

localtime输出结果中的字段。

属性名

属性描述

取值范围

tm_year

四位数年份

2022

tm_mon

月份

1-12

tm_mday

天数

1-31

tm_hour

小时

0-23

tm_min

分钟

0-59

tm_sec

0-59

tm_wday

一周的第几天

0-6

tm_yday

一年的第几天

1-366

tm_isdst

夏令时

0,1

os 模块

os模块包含的函数与函数功能描述

函数名

参数

功能描述

使用

返回值

getcwd()

无参数

返回当前脚本所在路径

os.getcwd()

字符串类型

listdir()

字符串类型的路径

返回指定路径的下所有文件

os.listdir('c://')

列表类型

makedirs()

字符串类型的路径

创建一级或多级目录

os.makedirs('a/b/c')

字符串类型

代码语言:javascript复制
import os

# 获取当前脚本所在路径
current_path = os.getcwd()
print(current_path)
print(type(current_path))

# 获取路径下的文件列表
file_list = os.listdir(current_path)
print(file_list)
print(type(file_list))

# 创建一级或多级目录
os.makedirs('alpha')
os.makedirs('bravo/charlie')
print(os.listdir(current_path))
print(os.listdir('{}/bravo'.format(current_path)))

makedirs()创建文件夹时,如果文件夹已存在则会报错

os.path 模块

os.path模块中一些常用函数如下:

函数

参数

函数描述

使用

返回值

exists

字符串类型的路径

文件或路径是否存在

os.path.exists('test.py')

bool类型

isdir

字符串类型的路径

是否是文件夹

os.path.isdir('c://')

bool类型

isabs

字符串类型的路径

是否是绝对路径

os.path.isabs('test.py')

bool类型

isfile

字符串类型的路径

是否是文件

os.path.isfile('test.py')

bool类型

join

字符串类型的路径

路径字符串合并

os.path.join('d://', 'test')

字符串路径

split

字符串类型的路径

以最后一层路径为基准切割

os.path.split('c://test')

列表

代码语言:javascript复制
import os.path

current_path = os.getcwd()
print(current_path)
print(os.path.exists(current_path))

print(os.path.isdir(current_path))

print(os.path.isabs(current_path))

print(os.path.isfile('{}/test.py'.format(current_path)))
代码语言:javascript复制
join_path = os.path.join(current_path, 'bravo', 'charlie')
print(join_path)

split_path = os.path.split(os.path.join(current_path, 'test.py'))
print(split_path)
print(type(split_path))

sys 模块

sys 模块中的常用方法如下:

函数

参数

函数描述

使用

返回值

modules()

Python启动时加载的模块

sys.modules()

字典类型

path()

返回当前Python环境路径

sys.path()

列表类型

exit()

退出程序

sys.exit()

无返回值

getdefaultencoding()

获取系统编码

sys.getdefaultencoding()

字符串

platform()

获取当前系统

sys.platform()

字符串

version

获取Python版本

sys.version

字符串

argv

*args

获取外部参数

sys.argv

列表

代码语言:javascript复制
import sys

mds = sys.modules
print(mds)
print(type(mds))

py_path = sys.path
print(py_path)
print(type(py_path))

encode = sys.getdefaultencoding()
print(encode)

print(sys.platform)

print(sys.version)

print('开始执行退出程序')
sys.exit(1)

print(py_path)

执行退出程序后,退出代码下面的代码不再执行

代码语言:javascript复制
import sys

name = sys.argv[1]

if name == 'stark':
    print('I am IRONMAN')
elif name == 'thor':
    print('God of Thunder')
elif name == 'hulk':
    print('Strongest Avenger')
else:
    print('Pls input a hero')

argv支持外部输入参数

0 人点赞