python学习笔记
今日内容概要
- 绝对导入与相对导入
- 包的概念
- 编程思想的转变
- 软件开发目录规范
- 常见内置模块
今日内容详细
绝对导入与相对导入
只要涉及到模块导入,那么sys.path永远以执行文件为准
绝对导入
其实就是以执行文件所在的sys.path为起始路径,往下一层层查找
由于pycharm会自动将项目根目录添加到sys.path中,所以查找模块肯定不报错的方法就是永远从根路径往下一层层找
如果不是用pycharm运行,则需要将项目根目录添加到sys.path(针对项目根目录的绝对路径有os模块可以帮助我们获取)
from ccc import b
相对导入
名称 | 内容 |
---|---|
. | 在路径中意思是当前路径 |
.. | 在路径中意思是上一层路径 |
../.. | 在路径中意思是上上一层路径 |
相对导入可以不参考执行文件所在的路径,直接以当前模块文件路径为准
1.只能在模块文件中使用,不能在执行文件中使用
2.相对导入在项目比较复杂的情况下,可能会出错
总结:相对导入尽量少用,推荐使用绝对导入(因为简单不会出错,只需从根路径往下一层层找就行)
包的概念
如何理解包
专业的角度:内部含有__ init__.py的文件夹
直观的角度:就是一个文件夹
包的作用
内部存放多个py文件(模块文件),仅仅是为了更加方便的管理模块文件
具体使用
导入包名其实导入的是里面的__ init__.py文件(该文件里面有什么你才能用什么)
其实也可以跨过__ init__.py直接导入包里面的模块文件
定义包主要有两步:
-
创建一个文件夹,该文件夹的名字就是该包的包名。
-
在该文件夹内添加一个 __ init__.py 文件即可。
下面定义一个非常简单的包。先新建一个 first_package 文件夹,然后在该文件夹中添加一个 __ init__.py 文件,该文件内容如下:
'''
这是学习包的一个示例
'''
print('this is first_package')
上面的 Python 源文件非常简单,该文件开始部分的字符串是该包的说明文档,接下来是一条简单的输出语句。
下面通过如下程序来使用该包:
# 导入first_package包(模块)
import first_package
print('==========')
print(first_package.__doc__)
print(type(first_package))
print(first_package)
再次强调,包的本质就是模块,因此导入包和导入模块的语法完全相同。因此,上面程序中第 2 行代码导入了 first_package 包。程序最后三行代码输出了包的说明文档、包的类型和包本身。
运行该程序,可以看到如下输出结果:
this is first package
==========
这是学习包的一个示例
<class 'module'>
<module'first_package'from'D:\\publish\\codes\\first_package\\__init__.py'>
从上面的输出结果可以看出,在导入 first_package 包时,程序执行了该包所对应的文件夹下的 __ init__ . py;从倒数第二行输出可以看到,包的本质就是模块;从最后一行输出可以看到,使用 import
first_package 导入包的本质就是加载井执行该包下的 __ init__.py 文件,然后将整个文件内容赋值给与包同名的变量,该变量的类型是 module。
注意:
针对python3解释器:其实文件夹里面有没有__ init__.py已经无所谓了,都是包
针对python2解释器:文件夹下面必须要有__ init__.py才能被当做包
编程思想的转变
经历阶段 | 过程 | 代码编写在单文件内还是多文件内 | 举例 |
---|---|---|---|
小白阶段 | 按照需求从上往下堆叠代码 | 单文件 | 相当于将所有的文件全部存储在c盘并且不分类 |
函数阶段 | 将代码按照功能的不同封装成不同的函数 | 单文件 | 相当于将所有的文件在c盘下分类存储 |
模块阶段 | 根据功能的不同拆分不同的模块文件 | 多文件 | 相当于将所有的文件按照功能的不同分门别类到不同的盘中 |
目的是为了更加方便高效的管理资源
软件开发目录规范
我们所使用的所有的程序目录都有一定的规范(有多个文件夹)
文件夹名 | 文件名 | 作用 |
---|---|---|
bin文件夹 | start.py | 用于存储程序的启动文件 |
conf文件夹 | settings.py | 用于存储程序的配置文件 |
core文件夹 | src.py | 用于存储程序的核心逻辑 |
lib文件夹 | common.py | 用于存储程序的公共功能 |
db文件夹 | userinfo.txt | 用于存储程序的数据文件 |
log文件夹 | log.log | 用于存储程序的日志文件 |
interface文件夹 | user.py order.py goods.py | 用于存储程序的接口文件 |
readme文件(文本文件) | 用于编写程序的说明,介绍,广告,类似于产品说明书 | |
requirements.txt文件 | 用于存储程序所需的第三方模块名称和版本 |
我们在编写软件的时候可以不完全遵循上面的文件名
start.py可以放在bin文件夹下也可以直接放在项目根目录
db文件夹等我们学到真正的项目会被数据库软件替代
log文件夹等我们学到真正的项目会被专门的日志服务替代
常见内置模块
collections模块
给我们提供了更多数据类型!!!
namedtuple | 可以创建包含名称的元组 |
deque | 双端队列,可以快速的在队列头部和尾部添加、删除元素 |
ordereddict | 有序字典,可以记住元素的添加顺序 |
defaultdict | 带有默认值的字典 |
Counter | 计数器,计数功能 |
1.namedtuple
from collections import namedtuple
Point = namedtuple('二维坐标系', ['x', 'y'])
res1 = Point(1, 3)
res2 = Point(10, 49)
print(res1, res2) # 二维坐标系(x=1, y=3) 二维坐标系(x=10, y=49)
print(res1.x) # 1
print(res1.y) # 3
Point = namedtuple('三维坐标系', 'x y z')
res1 = Point(1, 3, 44)
res2 = Point(10, 49, 55)
print(res1, res2) # 三维坐标系(x=1, y=3, z=44) 三维坐标系(x=10, y=49, z=55)
p = namedtuple('扑克牌', ['花色', '点数'])
res1 = p('♥', 'A')
res2 = p('♠', 'A')
print(res1) # 扑克牌(花色='♥', 点数='A')
print(res2) # 扑克牌(花色='♠', 点数='A')
2.deque
from collections import deque
q = deque()
q.append(111)
q.append(222)
q.append(333)
q.append(444)
q.appendleft(555)
print(q) # deque([555, 111, 222, 333, 444])
3.OrderedDict
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d) # {'a': 1, 'b': 2, 'c': 3}
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
4.defaultdict
# 有如下值集合 [11,22,33,44,55,66,77,88,99,90],
# 将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
{'k1':[], 'k2':[]}
from collections import defaultdict
res = defaultdict(k1=[],k2=[])
print(res) # defaultdict(None, {'k1': [], 'k2': []})
5.Counter
# 利用循环取值操作
res = 'abcdeabcdabcaba' #计算字符串每个字符出现的次数等到这个形式的结果 {'a':2,'b':5 }
new_dict = {}
for i in res:
if i not in new_dict:
new_dict[i] = 1
else:
new_dict[i] += 1
print(new_dict) # {'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}
from collections import Counter
res1 = Counter(res)
print(res1) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
时间模块之time模块
- 时间的三种格式
格式 | 表现形式 |
---|---|
时间戳 | time.time() |
结构化时间 | time.gmtime() |
格式化时间 | time.strftime() |
- 三种时间格式的展现形式
import time
print(time.time())
print(time.gmtime())
print(time.strftime('%Y-%m-%d %H:%M:%S'))
- 三种时间格式互相之间的转换
- 时间转换
格式 | 含义 |
---|---|
%Y | 完整的年份 |
%m | 月份(01-12) |
%d | 一个月中第几天(01-31) |
%H | 一天中的第几个小时(24小时制,00 - 23) |
%M | 分钟数(00-59) |
%S | 秒数(01-59) |
%X | 本地相应时间 |
知识回顾
- python2与python3的区别
python2 | python3 | |
---|---|---|
输入 | name=raw_input('请输入姓名') | name=input('请输入你的姓名') |
输出 | print "你好" | print("你好") |
解释器默认编码 | ascii编码 | uft-8编码 |
range方法 | range(1,10)返回列表 | range(1,10)返回迭代器,节约内存 |
包的定义 | 文件夹中必须有 __ init __ .py文件 | 文件夹里面有没有 __ init __ .py已经无所谓了 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了