模块 | 循环导入

内容概要

  • 面向过程编程
  • 模块简介
  • import句式
  • from...import...句式
  • 循环导入问题

面向过程编程

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

面向过程编程的缺陷在于:一旦要修改功能,就需要整体改造(牵一发而动全身)

def rain():
    username = input('name: ').strip()
    password = input('pass: ').strip()
    if len(username) == 0 or len(password) == 0:
        print('用户名或密码不能为空')
        return
    dic = {
        '1': 'admin',
        '2': 'user'
    }
    print(dic)
    choice = input('输入编号: ').strip()
    if choice in dic:
        id = dic.get(choice)
        return data(username, password, id)
    else:
        print('输入不合格')
        return


def data(username, password, id):
    data1 = '%s|%s|%s\n' % (username, password, id)
    return data2(data1)


def data2(data1):
    with open(r'a.txt', 'a', encoding='utf8') as f:
        f.write(data1)
        print('用户注册成功')


rain()

模块简介

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句式导入模块之后
   通过模块名点的方式就可以使用模块中所有的名字,并且不会产生冲突(指名道姓)

from...import...句式

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

from...import...指名道姓的导入某个名字
   在使用的时候直接写名字,但是当前名称空间有相同名字的时候,就会产生冲突,使用的就变成了当前名称空间

导入模块扩展用法

1.起别名
   既可以给模块起别名,也可以给模块中某个名字起别名
   import aaasssasa as a
   from ssjdhasdjkaha import name as d

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

  from 模块名1 import 名字1,名字2,名字3

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

判断文件类型

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

if __name__ == '__main__'
   index()

在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'文件路径')
   
   2.from...import...句式
      from 文件夹名称.文件夹名称 import 模块名
	  from 文件夹名称.模块名称 import 名字

image

posted @ 2021-11-23 17:29  一览如画  阅读(88)  评论(0)    收藏  举报