模块以及包
#注意三种模块! #引用的时候是默认从同级的找
python文件夹跟package的区别就是package会多一个init文件
import cal1 #调用过来的只是这个变量名 import执行的时候先执行 print(cal1.add(3,5)) #下面才是开始使用
import:1.执行调用模块文件 (比如说有print 那么它会先打印所有print再执行对应函数)
2.引入变量名
#第二种方式 用from跟import同时运用 更方便
from cal1 import add from cal1 import sub print(add(3,5)) print(sub(3,5))
#第三种方式 用*号 代表一切 但是不推荐此方法 因为会执行模块里所有的文件 比如说被调用文件所有的print都执行了
from cal1 import * print(add(3,5)) print(sub(3,5))
#错误示范
def add(x,y); return x+y+100 from cal1 import * #导致两个函数冲突 导致覆盖函数 可能会跟自己写的有重复 print(add(3,5))
路径:因为系统默认是找执行文件的本级路径以及上一级路径 所以最好统一用from引用文件 不是找得到的就需要路径 比如你执行文件在第二层 但是调用函数在第三层 而不仅仅是不在同级
import sys print(sys.path) #通过这个知道import是默认找到执行文件以及执行文件相关的路径
#针对上述情况可以用这个方法
from my_module import cal #从package中引用模块 也就是文件名 print(cal.add(1,2)) #当前执行的文件就是入口
包的概念(下面有init文件):1.用来组织模块 比如看了包之后就知道引用的大概是什么 2.防止有重复的变量名 只要包不同则路径不同 因此不会冲突 3.逻辑更清晰
#如果是多层就用这三种方式引用
from web.web1.web2 import cal #最好用第一种 print(cal.add())
from web.web1.web2.cal import add
print(add())
from web.web1 import web2 #执行web2的__init__文件,唯一不支持的调用方式 其实也可以在_init_里面加入一个引用与cal拼接起来,这样下面的print就不会报错
print(web3.cal.add()) #这一步不行 不能这么调用
__name__与__main__:在执行文件(bin文件)执行的时候print(__name__)就是打印main,如果是在执行文件执行调用文件中的print(__name__)就是打印文件路径
有什么用?
if __name__ == "__main__": #将这个if语句放在被调用文件里可以达到测试的作用 因为被调用的时候name不等于main,下面的执行代码就不会在执行文件里执行 print(add(1,5))
如果把上面这个表达式放在执行文件有什么用? 不想让这个文件被调用
time是解释器内部的模块!
BASE_DIR:灵活添加文件路径或者定位路径
import sys sys.path.append() #临时修改 永久修改就是改环境变量 也就是系统path
#修改路径的作用:有时候不能定位到想定位的层(比如要调用的在上一层,但是其实调用的时候只能从同级一步一步往里面找) 这时候就需要添加一个路径来到那一层 然后再引用
import sys sys.path.append(r"C:\Users\Administrator\PycharmProjects\untitled2\day21\web\web1\web2") #临时修改 永久修改就是改环境变量 也就是系统path 记得加引号
#打印当前文件,这样append的时候就是添加这个文件的路径 就不至于把引用写死 但是直接用__file__是得到当前执行文件的路径 而我们是要得到上量两层的路径 import sys sys.path.append(C:\Users\Administrator\PycharmProjects\untitled2\day21\web\web1\web2) #临时修改 永久修改就是改环境变量 也就是系统path C:/Users/Administrator/PycharmProjects/untitled2/day13/Hello.py
#不把路径写死的方法 其实__file__得到的只是一个文件名 但是pycharm帮你找到了这个文件的路径 如果我们要自己来找就需要os.path.abspath这个方法 这是一个绝对路径方法
import os,sys #dirname的作用就是在绝对路径的基础上往上走 BASE_DR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #这是os模块的内置方法 注意这里用了两个dirname 用一个是定位到当前文件目录 如果还要再往上一层就需要再加一个dirname
sys.path.append(BASE_DR) #意思就把这一层路径加进去 从这一层开始找