python学习笔记

今日内容概要

  • 绝对导入与相对导入
  • 包的概念
  • 编程思想的转变
  • 软件开发目录规范
  • 常见内置模块

今日内容详细

绝对导入与相对导入

只要涉及到模块导入,那么sys.path永远以执行文件为准

绝对导入

其实就是以执行文件所在的sys.path为起始路径,往下一层层查找

由于pycharm会自动将项目根目录添加到sys.path中,所以查找模块肯定不报错的方法就是永远从根路径往下一层层找

如果不是用pycharm运行,则需要将项目根目录添加到sys.path(针对项目根目录的绝对路径有os模块可以帮助我们获取)

from ccc import b

image

image

相对导入

名称 内容
. 在路径中意思是当前路径
.. 在路径中意思是上一层路径
../.. 在路径中意思是上上一层路径

相对导入可以不参考执行文件所在的路径,直接以当前模块文件路径为准

1.只能在模块文件中使用,不能在执行文件中使用

2.相对导入在项目比较复杂的情况下,可能会出错

总结:相对导入尽量少用,推荐使用绝对导入(因为简单不会出错,只需从根路径往下一层层找就行)

包的概念

如何理解包

专业的角度:内部含有__ init__.py的文件夹

直观的角度:就是一个文件夹

包的作用

内部存放多个py文件(模块文件),仅仅是为了更加方便的管理模块文件

具体使用

导入包名其实导入的是里面的__ init__.py文件(该文件里面有什么你才能用什么)

其实也可以跨过__ init__.py直接导入包里面的模块文件

定义包主要有两步:

  1. 创建一个文件夹,该文件夹的名字就是该包的包名。

  2. 在该文件夹内添加一个 __ 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文件 用于存储程序所需的第三方模块名称和版本

image

我们在编写软件的时候可以不完全遵循上面的文件名

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'))

image

  • 三种时间格式互相之间的转换

image

  • 时间转换
格式 含义
%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已经无所谓了
posted @   空白o  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示