zoukankan      html  css  js  c++  java
  • 3.1 模块的定义与分类,import,from...import

    什么是模块?一个模块就是一个py文件

    模拟博客园系统作业,100000行代码. 不可能全部存在一个文件.

    1. 不易维护.
    2. 效率低.

    分文件: 10个文件.每个文件有50个函数,有一写相同功能或者相似功能的函数.代码冗余,重复性.我们应该将这10个函数提取出来,放在一个文件中,随用随拿.

    1. 节省代码.
    2. 容易维护,组织结构更清晰.

    一个模块就是一个py文件,这个模块存储很多相似的功能,相似的函数的集合体.

    模块的分类:

    • 内置模块,标准库,python解释器自带的,time,os,sys 等等 200多种.
    • 第三方库(模块),人写的一些模块,通过pip install 安装 6000种
    • 自己写的模块.自定义模块

    2.import

    import tbjx
    当我引用tbjx模块的时候,实际上将tbjx.py执行一遍,加载到内存.
    import tbjx
    import tbjx
    import tbjx
    只能第一次引用时,将此模块加载到内存.
    
    1. 执行文件:02 模块import

    2. 被引用文件(模块): tbjx.py

    3. 第一次导入模块发生的三件事

      import tbjx
      n = 1
      引用模块发生三件事:
      	1. 将tbjx.py文件加载到内存(执行此模块).
          2. 在内存中创建一个以tbjx命名的名称空间.
          3. 通过tbjx名称空间的名字.等方式引用此模块的名字(变量,函数名,类名等等).
      
      print(tbjx.name)
      tbjx.read1()
      tbjx.read2()
      

      1561541400181

    4. 被导入模块有独立的名称空间

       坑:通过tbjx.的方式引用此模块的名字时,一定一定是从此模块中寻找.
       通过import 引用模块 他有自己的独立名称空间,与当前执行文件没有关系.
       name = 'tr'
       print(tbjx.name)# 太白
       def read1():
       	print('in 02 模块import')
       tbjx.read1()# tbjx模块: 太白金星,这个只能从模块中拿东西,永远不可能从此执行文件拿东西,若模块中没有read1(),就会报错.
      
    5. 为模块起别名

      import contextlib as cb
      from tbjx import name as n
      1 书写方便.
       import tbjx as tb
       print(tb.name)
       tb.read1()
      2 简化代码
      content = input('>>>').strip()
      if content == 'mysql':
          import mysql_
          mysql_.sqlprase()
      elif content == 'oracle':
          import oracle_
          oracle_.sqlprase()
      简化代码写法:
      content = input('>>>').strip()
      if content == 'mysql':
          import mysql_ as db
      elif content == 'oracle':
          import oracle_ as db
      
      db.sqlprase()  # 统一化接口
      
    6. 导入多个模块

      import time,os,sys # 不推荐.
      import time

      import os
      import sys

      易于阅读 易于编辑 易于搜索 易于维护。

    3.from... import *

    1. from tbjx import *

      from tbjx import name
      from tbjx import read1
      print(globals())#获取当前文件的全局变量
      相当于从tbjx模块的全局空间中将name,read1变量与值的对应关系
      复制到当前执行文件的全局名称空间中.
      print(name)
      read1()
      优点:使用起来方便了.
      缺点:容易与当前执行文件产生覆盖效果.
      示例1:
      from tbjx import name
      from tbjx import read1
      name = '李业'
      print(name)
      
      示例2:
      name = '怼怼哥'
      from tbjx import name
      from tbjx import read1
      def read1():
          print('在执行文件中')
      # print(name)
      read1()
      
      特殊情况:极值情况,工作中不会出现.(了解)
      因为如果你要是引用一些模块的变量,那么执行文件中就不应该出现同名变量.
      示例3:
      from tbjx import name
      from tbjx import change
      
      change()
      print(name)
      
      示例4:
      from tbjx import change
      
      change()
      from tbjx import name
      print(name)
      read1()
      read2()
      1,全部将tbjx的所有名字复制过来,无用功.
      2,容易覆盖.
      

      示例3:

      1561544971037

    2. from ... import * 与__all__配合使用(写在模块文件中)

      from tbjx import *
      read1()
      read2()
      模块中:
      __all__ = ['read1','read2']#列表中的元素是执行文件在引用模块时可以执行的函数
  • 相关阅读:
    Project Euler 389 Platonic Dice (概率)
    单纯形(相关题目)
    关于C++中的内存泄露
    莫比乌斯反演与积性函数求和筛法中的一些细节
    清华集训2015-Day 2
    bzoj3456-城市规划
    多项式运算的一些技术
    bzoj2302-Problem c
    bzoj4300-绝世好题
    bzoj4726-Sabota?
  • 原文地址:https://www.cnblogs.com/pythonblogs/p/11136143.html
Copyright © 2011-2022 走看看