模块


面向过程编程(理论)

        面向过程编程就好比在设计一条产品流水线

        # 用户注册功能
        1.获取用户名和密码
        2.组织成固定的格式
        3.文件操作写入文件

        '''面向过程编程的缺陷在于:一旦要修改功能 那么需要整体改造(牵一发而动全身)'''
        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()

模块简介

        python语言
            最早起源于linux运维、胶水语言、调包侠(贬义词>>>褒义词)

        1.什么是模块?
            模块:一系列功能的结合体
        2.为什么要用模块?
            为了提升开发效率(站在巨人肩膀)
        3.模块三种来源
            1.内置的(python解释器自带能够直接导入使用)
            2.第三方的(别人写好的发布在网上的 需要先下载后使用)
            3.自定义的(自己写的)
        4.模块的四种表现形式
            1 使用python编写的代码(.py文件)
          2 已被编译为共享库或DLL的C或C++扩展
          3 包好一组模块的包(文件夹)
                # 包其实就是多个py文件(模块)的集合
                    包里面通常会含有一个__init__.py文件
          4 使用C编写并链接到python解释器的内置模块
        """
        学习完模块之后 以后我在编写大型项目的时候 
        遇到一些比较复杂的功能可以先考虑是否有相应的模块可以调用
        """

import句式

        # 在学习模块的时候 一定要区分谁是导入文件谁是模块文件
        import md  # 导入py文件模块 文件后缀一定不要加


        """
        多次导入相同模块 只会执行一次

        首次导入md模块发生的事情
            1.运行导入文件(import句式.py)产生该文件的全局名称空间
            2.运行md.py文件
            3.产生md.py全局名称空间 运行md文件内代码 将产生的名字全部存档于md.py名称空间
            4.在导入文件名称空间产生一个md的名字指向md.py全局名称空间

        import句式导入模块之后
            通过模块名点的方式就可以使用到模块中所有的名字 并且肯定不会产生冲突(指名道姓)
        """
        # money = 999
        # md.change()
        # print(money)
        # print(md.money)

from...import...句式

        from md import money,read1,change


        """
        from...import...多次导入也只会导入一次
            1.先产生执行文件的全局名称空间
            2.执行模块文件 产生模块的全局名称空间
            3.将模块中执行之后产生的名字全部存档于模块名称空间中
            4.在执行文件中有一个money执行模块名称空间中money指向的值

        from...import...指名道姓的导入某个名字
            在使用的时候直接写名字即可 但是当当前名称空间有相同名字的时候
            就会产生冲突 使用的就变成了当前名称空间
        """
        # money = 999
        # print(money)
        money = 999
        # def read1():
        #     print('董小姐')
        # read1()
        change()
        print(money)

导入模块扩展用法

        1.起别名
            既可以给模块名起别名也可以给模块中某个名字起别名
            import mdddddddd as m
            from mddddddd import name as n

        2.连续导入
            import 模块名1,模块名2
                # 可以连续导入多个模块 但是只有当多个模块功能相似或者属于同一个系列
                # 如果功能不同并且不属于一个系列 那么推荐分行导入
                import 模块名1
                import 模块名2
            from 模块名1 import 名字1,名字2,名字3

        3.通用导入
            from md import *  # 将模块中所有的名字全部导入(*表示所有)
            print(money)
            print(read1)
            print(read2)
            print(change)
            __all__ = ['money','read1']  # 在被导入的模块文件中可以使用__all__指定可以被导入使用的名字

判断文件类型

        # 判断py文件是作为模块文件还是执行文件
        __name__当文件是执行文件的时候会返回__main__
        如果文件是被当做模块导入则返回文件名(模块名)

        if __name__ == '__main__':
          read1()
        """在pycharm中可以直接敲 main按tab键即可自动补全if判断"""

循环导入

        """以后我们在导入模块的时候如果出现了循环导入的情况 说明你程序设计的不合理"""
        # 记住在以后的编程生涯中不允许出现循环导入的现象!!!

        一错再错
            1.调换顺序
                将彼此导入的句式放在代码的最后
            2.函数形式
                将导入的句式放入函数体代码 等待所有的名字加载完毕之后再调用

模块导入的顺序

        """
        1.先从内存中查找
        2.再去内置模块中查找
        3.最后去sys.path系统路径查找(自定义模块)
        如果都没有查找到则报错
        """

        # 以后在给py文件命名的时候尽量不要与内置模块名冲突

        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 名字

py