面向过程编程和模块
模块简介
1、什么是模块
一系列功能的结合体
2、为什么要使用模块
为了提升开放效率
3、模块的三种来源
1、内置的(python解释器自带能够直接导入使用的)
2、第三方的(别人写好的发布在网上的,需要先下载好后使用)
3、自定义的(自己写的)
4、模块的四种表现形式
1、使用python编写的代码(.py文件)
2、已被编译为共享库或DLL的C或C++扩展
3、包好一组模块的包(文件夹)
4、使用C编写并链接到python解释器的内置模块
注:第三种包其实就是多个py文件的集合;包里面通常会含有一个__init__.py文件
import句式
1、格式:
import+文件名 导入py文件模块,文件后缀一定不要加
2、首次导入模块发生的事情(文件名以md为例)
1、运行导入文件产生该文件的全局名称空间
2、运行md.py文件
3、产生md.py全局名称空间,运行md文件内代码,将产生的名字全部存档于md.py名称空间
4、在导入文件名称空间产生一个md的名字指向md.py全局名称空间
3、import句式导入模块之后
1、通过模块名点的方式就可以使用到模块中所以的名字,并且肯定不会产生冲突(指名道姓)
2、多次导入相同模块,只会执行一次
from.....import....句式
1、运行过程
1、先产生执行文件的全局名称空间
2、执行模块文件,产生模块的全局名称空间
3、将模块中执行之后产生的名字全部存档于模块名称空间中
4、在执行文件中有一个money(举例)执行模块名称空间中的money指向的值
2、from...import....句式导入模块之后
1、在使用的时候直接写名字即可,但是当当前名称空间有相同名字的时候就会产生冲突,使用的就变成了当前名称空间
2、from...import....指名道姓的导入某个名字
3、from...import....多次导入也只会导入一次
导入模块的一些扩展用法
1、起别名
既可以给模块名起别名也可以给模块中某个名字起别名
2、连续导入
import 模块名1, 模块名2
from 模块名1 import 名字1, 名字2, 名字3
注意:只有当多个模块功能相似或者同属于一个系列的,可以连续导入模块;如果功能不同,并且不属于一个系列的,那么推荐分行导入
3、通用导入 *
from 模块名 import * 表示将模块中所以的名字全部导入*代表所有
__all__=[ 模块名] 在被导入的模块文件中可以使用__all__指定可以被导入的名字
判断文件类型
1、目的
判断py文件是作为模块文件还是执行文件
2、格式
__name__
3、结果
当文件是执行文件的时候会返回__main__;如果文件是被当做模块导入则会返回文件名(模块名)
4、if __name__ == '__main__' 当文件是运行的时候才可以运行,当时导入文件的时候只会显示模块名。
在pycharm中直接敲main按tab键就可以自动补全if判断
循环导入
如果在文件导入模块的时候出现了循环导入的情况,说明程序设计的不合理。在以后的编程过程中不允许出现循环导入的现象
怎么修改(只做了解,这种错不要犯)
1、调换顺序
将彼此导入的句式放在代码的最后
2、函数形式
将导入的句式放入函数体代码,等所有的名字加载完毕之后再调用
导入模块的顺序
1、查找顺序
1、先从内存中查找
2、再去内置模块中查找
3、最后去sys.path系统路径查找(自定义模块)
4、如果都没有就会报错
2、当某个自定义模块查找不到的时候的解决方案
1、自己手动将该模块所在的路径添加到sys.path中
2、from...import...句式
from 文件夹名称.文件夹名称 import 模块名
from 文件夹名称.模块名称 import 名字
注意:在给py文件命名的时候尽量不要和内置模块名发生冲突
绝对导入与相对导入
在程序中涉及到多个文件之间导入模块的情况,一律按照执行文件所在的路径为准
绝对导入:始终按照执行文件所在的sys.path查找模块
相对导入:能够打破始终以执行文件为准的规则,只考虑两个文件之间的位置。相对导入只能用在模块文件中,不能在执行文件中使用。
句点符(.):
. 表示当前文件路径
.. 表示上一层文件路径
面向过程编程(理论)
1、概念
面向过程编程就好比设计一条产品流水线,有相应的设计思路
例:
写用户注册功能思路
1、获取用户名和密码
2、组织成固定的格式
3、文件操作写入文件
2、缺点
一旦修改功能,那么需要整体改造(牵一发而动全身)
def get_info(): username = input('username>>>:').strip() password = input('password>>>:').strip() if len(username) == 0 or len(password) == 0: print('用户名或密码不能为空') return user_idf = { '1':'admin', '2':'user', } print(user_idf) choice = input('请选择您的身份>>>:').strip() if choice in user_idf: id = user_idf.get(choice) return deal_data(username, password,id) else: print('输入不合法') return def deal_data(username,password,id): data = '%s|%s|%s\n'%(username,password,id) return save_data(data) def save_data(data): with open(r'userinfo','a',encoding='utf8') as f: f.write(data) print('注册成功') get_info()