python(包的概念,内置模块1)

今日内容详细

  • 包的具体使用
  • 编程思想的转变
  • 软件开发目录规范
  • python常用内置模块

包的具体使用

温馨小提示:

虽然python3对包的要求降低了,不需要__init__.py也可以识别,但是考虑到兼容性问题最好还是加上__init__.py

首先我们了解一下什么是包?

包的定义:

简单粗暴的解释,当一个文件夹内容里含有一个__init__.py文件时我们就可以认为它就
是一个包;如果改文件下还有子文件且该子文件中也有一个__init__.py文件,我们就可以认为它就是一个包中还有包。

一个包里可以有一个或者多个模块;通过调用包下面某个模块的某个函数取执行,这就是我们使用python包或模块的目的。

包的概念:

__init__.py文件时每一个python包必须存在的文件,只有存在__init__.py文件的目
录,python解释器才会认为这是一个包,如果没有这个文件,解释器只会认为这是一个普
通的文件夹

如下:
image

从图中我们可以看出来除了__init__.py文件之外,包的目录文件图标有个圆形的小圆点的图案;而普通的文件夹没有任何的标识。

怎么打开包?

1.如果只是想用包中某几个模块,那么还是按照之前的导入方式即可

	from aaa import md1,md2
   
2.如果直接导入包名
import aaa
	导入包名其实就是导包名下面的__init__.py文件,该文件内有什么名字就可以通过包名点什么名字

如何创建包:

	首先创建一个文件夹,然后再文件夹中创建一个python包的身份证。文件__init__.py文件即可,即使__init__.py 文件里什么也没写是空的,只要文件名的名字是__init__.py,解释器也会认为这是一个包,之后我们就可以在包里书写任意的模块功能了。

创建包也要有个良好的规范:

  • 首先要有一个主题,功能明确,同时也要方便使用,方便别人一看就知道是否需要使用你的这个包。
  • 其次层次也要分明,一个包可以有很多的模块或者子包,他们之间的关系要明确,这也是为后期维护代码起到了很好的辅助作用。

关于这个补充另一个规范

软件开发目录规范

1、文件目录的名字可以转换,但是思想是不变的。
2、目录规范的主要作用规定开发程序过程中针对不同的文件功能需要做不同对的分类

myprojeect项目文件夹
	1、bin 目录文件夹 	主要存放项目的启动文件
    	start.py 	启动文件可以放在bin目录下,也可以直接在项目目录
    2.conf目录文件夹	主要存放项目文件的配置文件
    	settings.py  里面存放项目的默认配置,一般都是全大写
    3、core 目录文件夹	主要存放项目的核心文件
    	src.py	里面存放核心功能
    4.interface目录文件夹	主要存放项目接口文件
    	goods.py	根据具体业务逻辑划分对应的王文件
        user.py
        account.py
    5.db目录文件夹	主要存放项目相关数据
    	userinfo.txt
        db_handler.py	存放数据库相关的操作代码
    6.log目录文件夹	主要存放项目日志文件
    	log.log
    7.lib文件夹	主要存放项目公共功能
    	common.py
    8.readme文件	主要存放项目的相关说明
    9.requirements.txt文件	主要存放项目所需模块级版本
    

编程思想的转变

1.面条版阶段
	所有的代码全部堆叠在一起
2.函数版阶段
	根据功能的不同封装不同的函数
3.模块版阶段
	根据功能的不同拆分成不同的py文件
"""
第一个阶段可以看成是直接将所有的数据放在C盘
	视频 音频 文本 图片
第二个阶段可以看成是将C盘下的数据分类管理
	视频文件夹 音频文件夹 文本文件夹 图片文件夹
第三个阶段可以看成是将C盘下的数据根据功能的不同划分到更合适的位置
	系统文件夹 C盘	
	视频文件夹 D盘
	图片文件夹 E盘
ps:类似于开公司(小作坊 小公司 上市公司)
	为了资源的高效管理
"""

常用内置模块

collections模块

1.具名元组

是python标准库collections中的工厂函数,它接受两个参数,第一个参数表示类的名称,第二个参数是类的字段名。后者可以是迭代对象,也可以是可迭代对象,他也可以是空格隔开的字符串。然后我们通过一串参数的形式将参数传递到构造的函数中,这样我们就可以通过字段名访问元素,索引元素。

namedtuple内置模块
from collections import namedtuple
# 表示二维坐标系
point = namedtuple('点',['x','y'])  # 生成点信息
p1 = point(1,2)
print(p1)  # 点(x=1,y=2)
print(p1.x)  # 1
print(p1.y)  # 2

card = namedtuple('扑克牌',['num', 'color'])
c1 = card('A', '黑♠')
c2 = card('A', '红♥')
print(c1, c1.num, c1.color)
print(c2, c2.num, c2.color)
 结果:
扑克牌(num='A', color='黑♠') A 黑♠
扑克牌(num='A', color='红♥') A 红♥  


2.队列
队列与堆栈
队列:先进先出
堆栈:先进后出
队列和堆栈都是一边只能进一边只能出

Python提供的所有队列类型 :

1.先进先出队列 queue.Queue
2.后进先出队列 queue.LifoQueue (Queue的基础上进行的封装)
3.优先级队列 queue.PriorityQueue (Queue的基础上进行的封装)
4.双向队列 queue.deque

1、先入后出队列
可以看到先放进队列的后被取出,其他用法和(先入先出)队列Queue一样;
q2 = queue.LifoQueue()
q2.put(1)
q2.put(2)
print(q2.get())
print(q2.get())
#输出结果
2
1

2、优先级队列
优先级队列,第一个值传数字,代表优先级,第二个是值,优先取出的是优先级高的;

q3 = queue.PriorityQueue()
q3.put([4,"666"])
q3.put([3,"54353"])
q3.put([1,"dmfnm"])
print(q3.get())
print(q3.get())
print(q3.get())
#输出结果
[1, 'dmfnm']
[3, '54353']
[4, '666']

有序字典
计数器
count()

时间模块

它是专门用来处理时间的time模块,学会使用time模块,可以丰富我们对于时间的处理

三种时间的表现形式:

1.时间戳
	秒数
2.结构化时间
	主要是给计算机看的
3.格式化时间
	主要是给人看的

什么是时间戳?

时间戳其实就是时间,只不过他的起始时间有所不同。

  • 时间戳是从1970年1月1日00时00分00秒至今为止的总毫秒(秒)数;python默认是按秒来计算时间戳的。

  • python中,用timestamp来表示时间戳

  • 在Python中,时间戳是一个float类型,我们使用datetime获取时间对象是可以看到年月日、时分秒的;而时间戳展示给我们是从 1970年1月1日00时00分00秒至今的秒数

  • time模块的总体功能就是为了处理时间与转换格式

    time模块和相应的函数功能:

    1.time 函数	生成时间戳
    2.localtime函数	获取本地时间函数
    3.sleep函数	暂停/休眠/等待
    4.strftime函数	将时间转换成字符串
    5.strptime函数 将时间字符串转换为时间对象
    注意:每个语言返回的时间戳格式都不太一样,有的是返回秒级别,有的是返回毫秒级别。无论哪一种,时间都是一样的,只是 秒 与 毫秒 之间的转换而已。
    

    生成时间戳-time

    import time
    
    print(time.time())
    
    # 1666167431.100021
    

    获取本地时间函数-localtime

    import time
    
    print(time.localtime(timestamp))
    
    #timestamp:可以传入一个时间戳,传入后 localtime() 函数会将传入的时间戳转为 时间对象。
    # 可以不传入,如果不传入时间戳;会默认返回当前最新的时间对象
    
    import time
    test_time = time.localtime()
    print(test_time)
    # 输出结果
    time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=16, tm_min=22, tm_sec=36, tm_wday=2, tm_yday=292, tm_isdst=0)
    
    

image

暂停函数-sleep

sleep():该函数会将我们的程序暂停执行一段时间

# 导入包;
import time

# 使用方法:
time.sleep(second)

# 参数介绍:
# second:希望程序被暂停执行的秒数
time.sleep(10)  # 让程序原地阻塞指定的秒数

time中的strfime

# 导入包;
import time

# 使用方法:
# time.strftime(format, t)
print(time.strftime('%Y-%m-%d'))  # 2022-10-19
print(time.strftime('%Y/%m/%d %H:%M:%S'))

# 2022/10/19 16:30:22
print(time.strftime('%Y/%m/%d %X'))
# 2022/10/19 16:32:25

# 参数介绍:
# format:时间的格式化规范
# t:time.localtime 对应的时间类型

# datetime 的 strftime 完全一致,只不过对应的对象是 time 的时间对象

datetime时间包

datetime时间包:

  • date:日期;time:时间 所以datetime就是日期与时间的结合体
  • 使用datetime我们就可以获取当前时间和时间间隔
  • 可以将时间对象转换成时间字符串
  • 也可以将字符串转换成时间类型(把字符串转成时间对象也是有格式要求的)

datetime的常用功能

获取当前的时间
# 第一种导入法:
from datetime import datetime
print(datetime.now())
# 2022-10-19 16:46:36.557138
# 第一个 datetime 是包 ;第二个 datetime 是模块

#第二种导入法:
import datetime
print(datetime.datetime.now())
# 2022-10-19 16:44:27.172770
#直接导入datetime包
 返回的是当前 年、月、日、时、分、秒、毫秒的 datetime 对象

image

获取时间间隔
其实获取时间间隔本身没有什么用,它需要配合我们刚刚提到的 datetime 模块的 now() 函数来配合使用。

# 导入包
from datetime import datetime
from datetime import timedelta

#这里的timedelta 并不是模块,而是一个函数至于为什么不是模块,可以猜测一下timedelta可能是写在datetime包下

使用方法:
timeobj = timedelta(days=0, seconds = 0 ,microseconds = 0, minutes = 0, hours = 0,weeks = 0)
print(timeobj)
#  0:00:00

间隔20分钟
import datetime
ctime = datetime.datetime.today()
print(ctime)
      # 2022-10-19 17:02:42.601075
    
time_del = datetime.timedelta(minutes=20)
print(ctime + time_del)
# 2022-10-19 17:23:42.183877
通过上面的小案例我们知道,时间对象之间我们可以做 加法与减法 的操作

days:间隔的天数

seconds:间隔的秒数

microseconds:间隔的毫秒数

milliseconds:间隔的微秒数

minutes:间隔的分钟数

hours:间隔的小时数

weeks:间隔的周数

这些参数我们可以全部传,也可以只传一个;像间隔一天、两天这种情况,我们就可以使用 hours 或 days

传入类型为 整型 ,支持整数与负数,一般我们建议使用正数。

内置模块之随机数模块-random

random.random()

随机返回0~1之间的随机浮点数
import random
print('第一次',random.random())
print('第二次',random.random())
print('第三次',random.random())

输出结果:
第一次 0.30599909086043087
第二次 0.9854425039139986
第三次 0.41254484996230933


random.uniform()
产生一个 区间 的随机浮点数
print(random.uniform())
# 3.2483729365151377
random.randint()

产生一个 区间 的随机整数
print(random.randint(1,9))
#5(随机生成的数)

随机产生一个指定的整数
print(random.randrange(1,100,2))
# 1,3,5,7....都有可能 29

随机抽取一个样本
print(random.choies(['一等奖','二等奖','三等奖','谢谢惠顾']))
choices这个s可以加也可以不加

随机抽取指定的样本数
print(random.sample(['jason','tom','kevin','oscar','andy','jerry'],2))
# ['tom', 'andy']

随机打乱数据集
l1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
random.shuffle(l1)
print(l1)
# [6, 8, 3, 10, 'Q', 'J', 9, 2, 'A', 4, 5, 'K', 7]

产生图片验证码:每一位都可以是大写字母,小写小字母,数字 4位组成
def get_code(n):
    code = ''
    for i in range(n):
    # 先产生随件的大小字母,数字
        random_upper =chr(random.randint(65, 90))
        random_lower = chr(random.randint(97, 122))
        random_int = str(random.randint(0,9))
    # 随机三选一
        temp = random.choice([random_upper,random_lower,random_int])
        code +=temp
    return code

res = get_code(10)
print(res)
res = get_code(4)
print(res)

# 0pNBZ23n94
# 1pf7

posted @ 2022-10-19 17:47  亓官扶苏  阅读(213)  评论(0编辑  收藏  举报