模块
![image]()
1、面向过程编程
# 面向过程编程
# 可以理解为按照工厂里的流水线工作,把整个编程过程分解为多个步骤进行
# 用户注册
# 1、获取用户输入
# 2、判断用户的身份
# 3、把用户的输入组织称固定格式
# 4、文件操作写入文件
def get_input():
username = input('username:').strip()
password = input('password:').strip()
if len(username) == 0 or len(password) == 0:
print('用户名或者密码不能为空')
return
user_identify = {'1': 'admin',
'2': 'staff'}
get_info = input('你的身份:').strip()
if get_info in user_identify:
idf = user_identify.get(get_info)
return data(username, password, idf)
else:
print('输入不合法')
return
def data(username, password, idf):
login_msg = f'{username}|{password}|{idf}\n'
return w_file(login_msg)
def w_file(login_msg):
with open(r'login_msg.txt', 'a', encoding='utf8') as f:
f.write(login_msg)
print('注册成功')
get_input()
'''面向过程优缺点:
优点:思路较为清晰,每一步应该怎么做怎么做
缺点:修改起来较为麻烦,牵一发而动全身
'''
![image]()
2、模块简介
# python语言的起源
'''
python语言起源于linux运维,又叫胶水语言,而所谓的python程序员又被戏称为调包侠
之所以被称为调包侠是因为,python本身有很强大的第三方模块库,很多复杂的功能不需要程序员自身写
也正是因为这个特点,在python初期,被很多其他编程人员所鄙视,但是随着IT行业的发展,高效率逐渐变成了
it公司更加看重的,也因此调包侠这个词从最开始的贬义词逐渐成为了褒义词
'''
# 什么是模块
'所谓的模块,简单来说就是拥有一系列功能的结合体'
# 为什么要用模块
'大大提升开放效率'
# 模块的三种来源
'''
1、python内置的模块库,可以直接调用
2、别人写好的放在网上的,需要先下载才能调用
3、自定义的模块(自己写的)
'''
# 模块的四种表现形式
'''
1、用python写的文件(.py文件)
2、已被编译为共享库或DLL的c或c++扩展
3、含有一组模块文件的包(文件夹)
# 包其实就是一组模块(文件)的集合
包里通常会含有一个__init__.py文件
4、用c语言写的并链接到python解释器的内置模块
'''
'''
待学完模块以后,在写一些大型项目时,如果遇到比较复杂的问题,
可以优先考虑使用模块
'''
![image]()
3、导入模块方式一
import md
# 导入模块的两种句式
# import句式
# 在导模块的时候,一定要记住谁导入文件,谁是模块
# 语法句式
'''
import + 模块名 # 导入模块名的时候,不能加后缀(.py)
'''
'''
多次导入相同模块,只会执行一次
首次导入模块时发生的过程:
1、在运行导入文件时生成该文件的名称空间
2、运行模块文件并生成一个模块文件的名称空间
3、运行模块文件产生的名字全都存放在模块文件的名称空间里
4、在导入文件的名称空间里产生一个和模块名一样的名字指向模块文件所在的名称空间
在使用import句式导入模块以后,可以使用模块名点的方式使用模块名称空间里的任意名字,并且不会引发冲突(指名道姓)
'''
key = 5
# print(md.func())
print(md.key)
![image]()
4、导入模块方式二
# 语法结构
'''
from 模块名 import 模块中的名字
'''
from md import key
key = 200
print(key)
'''
from...import....句式多次调用相同的模块也只会执行一次
from...import...句式在导入模块时的过程
1、运行当前文件并产生当前文件的名称空间
2、运行模块产生模块对应的名称空间
3、运行模块时产生的名字存放在模块对应的名称空间里
4、在当前文件的名称空间里产生一个和导入的名字相同的名字指向导入的名字所指向的值
from...import...在导入模块时可以指名道姓的要到某个名字
但是若当前文件下有一个和导入的名字相同的名字的时候,所执行的是当前文件下的名字
会引起冲突
'''
![image]()
5、导入模块的扩展用法
# 导入模块的扩展用法
# 1、起别名
'''
当我们要导入的某个模块名字或者模块中的某个名字很复杂,在我们调用的时候就会很麻烦,
这时候我们可以利用起别名的方式,使得我们在使用的时候更加方便
并且我们在使用该模块或者模块中的某个名字时,可以使用别名就能调用
语法格式:
import 模块名 as 别名
from 模块名 import 模块中某个名字 as 别名
import mddddddd as m
from md import nameeeeeee as n
'''
# 2、连续导入
'''
当我们遇到需要导入多个模块的情况时:
1、当我们所导入的多个模块属于同一个系列,或者说功能相似,相辅相成时,可以采用模块名之间用逗号隔开的形式
import time,os
from md import name,index()
2、当我们所导入的多个模块不属于同一个系列时,分行导入
import time
import os
'''
# 3、通用导入
'''
当我们想要导入一个模块中的所有的名字时,可以采用通用导入的方式
from 模块名 import * 将模块中的所有名字都导入
这时候我们再调用模块中的某个名字时,可以直接使用该名字
eg:from md import *
print(key)
print(index())
同时和*号一起连用的有一个__all__方法,可以在模块中指定被调用的名字,未被指定的不能调用
__all__ = ['key','index()'
'''
![image]()
6、判断文件类型
# 判断py文件是作为模块被调用还是执行文件
# __name__方法
print(__name__) # __main__
'''
当文件为执行文件时,__name__返回为__main__
当文件为调用模块时,__name__返回为模块名
'''
'''
我们经常会看到,在某个文件中会出现下面的情况
if __name__ = '__main__':
pass
这样的句式一般是若当前文件被作为模块调用时,我if判断下面的句式不执行,
只有在执行当前文件时才会执行
在pycharm中可以直接敲main按tab键会自动补全语法结构
'''
![image]()
7、循环导入
"""以后我们在导入模块的时候如果出现了循环导入的情况 说明你程序设计的不合理"""
# 记住在以后的编程生涯中不允许出现循环导入的现象!!!
# 发生循环导入时,也是根据在调用模块时的发生过程一步步推导
# 一错再错
# 1.调换顺序
# 将彼此导入的句式放在代码的最后
# 2.函数形式
# 将导入的句式放入函数体代码 等待所有的名字加载完毕之后再调用
![image]()
8、导入模块的顺序
"""
导入模块时的查找顺序:
1.先从内存中查找
2.再去内置模块中查找
3.最后去sys.path系统路径查找(自定义模块)
如果都没有查找到则报错
"""
'''
以后在自定义模块时尽量不要与内置模块的名字冲突,否则会引起混乱
'''
import sys
print(sys.path) # 结果中第一个元素永远是当前执行文件所在的路径
'''当某个自定义模块查找不到的时候解决方案:
1.自己手动将该模块所在的路径添加到sys.path中
import sys
sys.path.append(r'D:\py20\day18\aaa')
2.from...import...句式
from 文件夹名称.文件夹名称 import 模块名
from 文件夹名称.模块名称 import 名字
'''
![image]()
9、绝对导入与相对导入
# 绝对导入与相对导入
在程序中一般涉及到多个文件之间导入模块的情况,一律按执行文件所在的路径为基准
# 绝对导入
始终按照执行文件所在的sys.path查找
# tips:
当出现导入不同层级模块文件的情况时,先把文件当前所在的顶级目录添加到sys。path中
import sys
import os
# 先找到当前文件所在的顶级目录,然后添加到sys.path中,再导入模块时就不会出错了
print(os.path.abspath(__file__)) # 返回当前文件的绝对路径
print(os.path.dirname(__file__)) # 返回当前文件的上一层目录所在路径
base_path = os.path.dirname(os.path.dirname(__file__)) # 套娃,返回当前文件的上上一层目录所在的路径
sys.path.append(base_path)
# 相对导入
'''
在了解相对导入之前,先了解一个名词
句点符(.)
在相对路径中:
.代表当前文件夹下
..代表上一层文件夹
相对导入可以打破始终按照当前文件所在的sys.path查找的规则,
但是相对导入只能用在模块文件中,不能用在执行文件中
'''
![image]()