模块的绝对导入与相对导入
因为执行文件默认只能找到导入同级的模块文件,所以当导入的模块不在同级时需要用到绝对导入或相对导入。
1.绝对导入
from 文件夹名 import 模块文件名
'''eg:如果要调用与执行文件同级的aa文件夹下的bb文件夹中的c模块'''
from aa.bb import c
导入模块时sys.path永远以执行文件为起点一层一层的往下找
如果不是用pycharm运行,那么则需要将项目跟目录添加到sys.path(os模块获取项目根目录的绝对)
不足:导入同级下的模块需要写完整的导入路径,如果层级很深,这个路径要写的很长。
2.相对导入
. : 在路径中表示当前路径
.. : 在路径中表示上一层的路径
../.. : 在路径中表示上上一层路径
from .. import m1
from ../.. import m2
相对导入可以不参考执行文件所在的路径直接以当前模块文件路径为准
不足:相对导入只能在模块文件中使用不能在执行文件中使用
当项目目录比较复杂的情况下很有可能会出错(因此推荐使用绝对导入)
包的概念
1.什么是包
包就是内部有__init__.py文件夹的文件夹,该文件夹可包含多个模块文件,也可以理解为管理多个模块文件的文件。
2.包有什么用
包的作用是包含多个模块,例如我们用pip下载第三方模块numpy时,目录下会产生一个numpy文件夹,它就是前面安装的 numpy 模块(其实是一个包),里面包含了numpy管理的多个模块。
3.使用举例
'''定义一个包。先新建一个m1文件夹,然后在该文件夹中添加一个__init__.py 文件
py文件内定义a = "hello" '''
import m1
print(m1.a)
ps:导入包名其实就是导入里面的__init__.py文件,文件里面有哪些可以用的你才能用
也可以用 from 包名 import 模块名 直接导入包里面的模块文件
小知识:在python3解释器中 包文件夹内有没有__init__.py文件已经无所谓了,但在python2解释器中文件夹内必须用___init__.py文件才能当做包不然就是一个文件。
编程思想的转变
目前经历的三个阶段:
1.小白阶段
一懂不懂只会像面条一样从上往下的逻辑写代码 单文件
2.函数阶段
有了一点编写思维会把功能都提前封装成函数进行来回的调用了 单文件
3.模块阶段
逐渐老成已经会利用别人的东西开始简洁代码,同时也可以自己写不同功能的模块供自己用 多文件
软件开发目录规范
为什么要复杂的去规范文件目录:
为了提高程序的可读性与可维护性,当我们把项目文件进行分类后大大的提高了后期的维护和查看,只需到对应的文件夹名称下找到对应的文件进行查看和修改即可,如果是一堆乱七八糟的文件估计时间一长连开发人员也不知道具体代码在哪个文件内了。
1.bin文件夹
用来存放项目的启动文件 一般取名为:start.py
2.conf文件夹
用来存放项目的一些配置文件 一般取名为:settings.py
3.core文件夹
用来存放项目的核心逻辑(实现功能的代码) 一般取名为:src.py
4.lib文件夹
用来存放项目的公共功能 一般取名为:common.py
5.db文件夹
用来存储项目的数据文件(数据库) 一般取名为:userinfo.py
6.log文件夹
用来存放项目的日志文件 一般取名为:log.log
7.interface文件夹
用来存放项目的借口文件 一般取名为:user.py order.py goods.py
8.readme文件夹
用来存放项目的说明、介绍、广告 类似于说明书
9.requirements.txt文件
用来存储项目所需的第三方模块名称和版本
ps:我们在编写的时候不需要硬性规定的按照上面的形式取名字,只要做到分类清晰就可以名字可以取别的
常见内置模块
1.collections模块
# 创建一个和tuple类似的对象 # from collections import namedtuple
from collections import namedtuple
Point = namedtuple('二维坐标系', ['x', 'y'])
res1 = Point(1, 3)
res2 = Point(10, 49)
print(res1, res2)
print(res1.x)
print(res1.y)
'''打印结果
二维坐标系(x=1, y=3) 二维坐标系(x=10, y=49)
1
3
'''
# 双端队列 # from collections import deque
from collections import deque
a1 = deque()
a1.append(1)
a1.append(2)
a1.appendleft(888)
print(a1)
'''打印结果
deque([888, 1, 2])
'''
# 有序字典 # from collections import OrderedDict
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d)
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od)
'''打印结果
{'a': 1, 'b': 2, 'c': 3}
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
'''
# 完成计数 # from collections import Counter
res = 'acbcbabbcacabcbb'
from collections import Counter
res1 = Counter(res)
print(res1)
'''打印结果
Counter({'b': 7, 'c': 5, 'a': 4})
'''
2.时间模块之time模块
常见时间日期格式化符号
符号 属性 %y 表示年份(00-99) %m 表示月份(1-12) %d 表示一个月中的天数(1-31) %H 表示24小时制的时数(0-24) %I 表示12小时制的时数(1-12) %M 表示分钟(0-59) %S
表示秒数(0-59) %j 表示一年内的第几天(1-366) %w 表示星期几 %x 当地相应的日期表示 %X 当地相应的时间表示
表示时间的三种格式:
(1).时间戳:time.time()
时间戳都表示从1970年1月1日0时到现在经过了多长时间
import time
now = time.time()
print("当前时间戳为:", now)
'''打印结果
当前时间戳为: 1657798735.424146
'''
(2).结构化时间:time.gmtime()
将一个时间戳转换为UTC时区
import time
print(time.gmtime())
'''打印结果
time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=11, tm_min=45, tm_sec=7, tm_wday=3, tm_yday=195, tm_isdst=0)
'''
符号 属性 tm_year 表示年份 tm_mon 表示月份 tm_mday 表示天数 tm_hour 表示小时 tm_min 表示分钟 tm_sec 表示秒钟 tm_wday 表示一周的第几天
(3).格式化时间:time.strftime()
用于格式化时间,返回以可读字符串表示的当地时间
import time
now_date = time.strftime("%Y-%m-%d")
print(now_date)
new_time = time.strftime("%H:%M:%S")
print(new_time)
'''打印结果
2022-07-14
19:51:43
'''
暑期编程PK赛
得CSDN机械键盘等精美礼品!
因为执行文件默认只能找到导入同级的模块文件,所以当导入的模块不在同级时需要用到绝对导入或相对导入。
1.绝对导入from 文件夹名 import 模块文件名 '''eg:如果要调用与执行文件同级的aa文件夹下的bb文件夹中的c模块''' from aa.bb import c
导入模块时sys.path永远以执行文件为起点一层一层的往下找
如果不是用pycharm运行,那么则需要将项目跟目录添加到sys.path(os模块获取项目根目录的绝对)
不足:导入同级下的模块需要写完整的导入路径,如果层级很深,这个路径要写的很长。
2.相对导入. : 在路径中表示当前路径
.. : 在路径中表示上一层的路径
../.. : 在路径中表示上上一层路径
from .. import m1 from ../.. import m2
相对导入可以不参考执行文件所在的路径直接以当前模块文件路径为准
不足:相对导入只能在模块文件中使用不能在执行文件中使用
当项目目录比较复杂的情况下很有可能会出错(因此推荐使用绝对导入)
包就是内部有__init__.py文件夹的文件夹,该文件夹可包含多个模块文件,也可以理解为管理多个模块文件的文件。
2.包有什么用包的作用是包含多个模块,例如我们用pip下载第三方模块numpy时,目录下会产生一个numpy文件夹,它就是前面安装的 numpy 模块(其实是一个包),里面包含了numpy管理的多个模块。
3.使用举例'''定义一个包。先新建一个m1文件夹,然后在该文件夹中添加一个__init__.py 文件 py文件内定义a = "hello" ''' import m1 print(m1.a)
ps:导入包名其实就是导入里面的__init__.py文件,文件里面有哪些可以用的你才能用
也可以用 from 包名 import 模块名 直接导入包里面的模块文件
小知识:在python3解释器中 包文件夹内有没有__init__.py文件已经无所谓了,但在python2解释器中文件夹内必须用___init__.py文件才能当做包不然就是一个文件。
1.小白阶段
一懂不懂只会像面条一样从上往下的逻辑写代码 单文件
2.函数阶段
有了一点编写思维会把功能都提前封装成函数进行来回的调用了 单文件
3.模块阶段
逐渐老成已经会利用别人的东西开始简洁代码,同时也可以自己写不同功能的模块供自己用 多文件
为了提高程序的可读性与可维护性,当我们把项目文件进行分类后大大的提高了后期的维护和查看,只需到对应的文件夹名称下找到对应的文件进行查看和修改即可,如果是一堆乱七八糟的文件估计时间一长连开发人员也不知道具体代码在哪个文件内了。
1.bin文件夹
用来存放项目的启动文件 一般取名为:start.py
2.conf文件夹
用来存放项目的一些配置文件 一般取名为:settings.py
3.core文件夹
用来存放项目的核心逻辑(实现功能的代码) 一般取名为:src.py
4.lib文件夹
用来存放项目的公共功能 一般取名为:common.py
5.db文件夹
用来存储项目的数据文件(数据库) 一般取名为:userinfo.py
6.log文件夹
用来存放项目的日志文件 一般取名为:log.log
7.interface文件夹
用来存放项目的借口文件 一般取名为:user.py order.py goods.py
8.readme文件夹
用来存放项目的说明、介绍、广告 类似于说明书
9.requirements.txt文件
用来存储项目所需的第三方模块名称和版本
ps:我们在编写的时候不需要硬性规定的按照上面的形式取名字,只要做到分类清晰就可以名字可以取别的
# 创建一个和tuple类似的对象 # from collections import namedtuple
from collections import namedtuple
Point = namedtuple('二维坐标系', ['x', 'y'])
res1 = Point(1, 3)
res2 = Point(10, 49)
print(res1, res2)
print(res1.x)
print(res1.y)
'''打印结果
二维坐标系(x=1, y=3) 二维坐标系(x=10, y=49)
1
3
'''
# 双端队列 # from collections import deque
from collections import deque a1 = deque() a1.append(1) a1.append(2) a1.appendleft(888) print(a1) '''打印结果 deque([888, 1, 2]) '''# 有序字典 # from collections import OrderedDict
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d)
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od)
'''打印结果
{'a': 1, 'b': 2, 'c': 3}
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
'''
# 完成计数 # from collections import Counter
res = 'acbcbabbcacabcbb'
from collections import Counter
res1 = Counter(res)
print(res1)
'''打印结果
Counter({'b': 7, 'c': 5, 'a': 4})
'''
2.时间模块之time模块
| 符号 | 属性 |
|---|---|
| %y | 表示年份(00-99) |
| %m | 表示月份(1-12) |
| %d | 表示一个月中的天数(1-31) |
| %H | 表示24小时制的时数(0-24) |
| %I | 表示12小时制的时数(1-12) |
| %M | 表示分钟(0-59) |
| %S | 表示秒数(0-59) |
| %j | 表示一年内的第几天(1-366) |
| %w | 表示星期几 |
| %x | 当地相应的日期表示 |
| %X | 当地相应的时间表示 |
(1).时间戳:time.time()
时间戳都表示从1970年1月1日0时到现在经过了多长时间
import time
now = time.time()
print("当前时间戳为:", now)
'''打印结果
当前时间戳为: 1657798735.424146
'''
(2).结构化时间:time.gmtime()
将一个时间戳转换为UTC时区
import time print(time.gmtime()) '''打印结果 time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=11, tm_min=45, tm_sec=7, tm_wday=3, tm_yday=195, tm_isdst=0) '''
| 符号 | 属性 |
|---|---|
| tm_year | 表示年份 |
| tm_mon | 表示月份 |
| tm_mday | 表示天数 |
| tm_hour | 表示小时 |
| tm_min | 表示分钟 |
| tm_sec | 表示秒钟 |
| tm_wday | 表示一周的第几天 |
(3).格式化时间:time.strftime()
用于格式化时间,返回以可读字符串表示的当地时间
import time
now_date = time.strftime("%Y-%m-%d")
print(now_date)
new_time = time.strftime("%H:%M:%S")
print(new_time)
'''打印结果
2022-07-14
19:51:43
'''



