Python(模块)

一、模块定义与分类

​ 我们说一个函数就是一个功能,那么把一些常用的函数放在一个py文件中,这个文件就称之为模块,模块,就是一些列常用功能的集合体,模块就是文件,存放一堆常用的函数,一个模块就是一个py文件,这个模块存储很多相似的函数集合体

​ 10个文件有50个函数,有一些相同功能或者相似功能的函数,代码冗余,重复,我们应该将这10个函数提取出来,放在一个文件中.

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

模块分类

  • 内置模块,标准库python解释器自带的有200多种

  • 第三方库(模块),各种大神些的一些模块,通过pip install...安装,6000种

  • 自定义模块,我们自己在项目中定义的一些模块

    # 定义一个模块,定义一个模块其实很简单就是写一个文件
    print('from the tbjx.py')
    name = '张三丰'
    def read1():
    print('tbjx模块:',name)
    def read2():
    print('tbjx模块')
    read1()
    def change():
    global name
    name = 'barry'

二、import

  • import(导入的意思),模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行

  • import语句是可以在程序中的任意位置使用的,且针对同一个模块,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句)

    # 注意 : 那个文件执行文件,哪个文件是被执行模块。
    代码示例:
    import tbjx
    import tbjx
    import tbjx
    import tbjx
    import tbjx
    # import tbjx 只在第一次导入时才执行tbjx.py内代码,此处的显式效果是只打印一次,当然其他的顶级代码也都被执行了,只不过没有显示效果.

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

  1. 将tbjx.py文件加载到内存
  2. 在内存中创建一个以tbjx命名的名称空间
  3. 通过tbjx名称空间的名字,等方式引用此模块的名字(变量,函数名,类名等等)

注意 : 重复导入会直接引用内存中已经加载好的结果

四、被导入模块有独立的名称空间

​ 每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

# 模块名字 lern.py 模块内如下信息
print("乾坤")
name="张三丰"
---------------------------------
import lern # 执行结果 乾坤
name="张无忌"
print(lern.name) # 打印结果 张三丰

五、为模块起别名

  1. 将一个比较长的模块名化简成简单的

    import tbjx as t
    t.read1()
  2. 有利于代码的扩展和优化

    #mysql.py 模块内的内容如下
    def sqlparse():
    print('from mysql sqlparse')
    #oracle.py模块内的内容如下
    def sqlparse():
    print('from oracle sqlparse')
    ---------------------------------
    #test.py 执行文件
    db_type=input('>>: ')
    if db_type == 'mysql':
    import mysql as db
    elif db_type == 'oracle':
    import oracle as db
    db.sqlparse()

六、导入多个模块

​ 我们以后再开发过程中,免不了会在一个文件中,导入多个模块,

  • 注意 : 推荐写法是一个一个导入

    import os,sys,json   # 这样写可以但是不推荐
    ---------------------------------
    # 推荐写法
    import os
    import sys
    import json

七、from...import...

  1. form...import...的使用

    # 模块名字 lern.py 模块内如下信息
    print("乾坤")
    name="张三丰"
    def read1():
    print("丐帮")
    ---------------------------------
    # from ... import ... 的使用示例。
    from lern import name, read1 # 执行结果 乾坤
    print(name) # 张三丰
    read1() # 丐帮
  2. form...import...与import对比

    ​ 唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀

    ​ from...import...的优缺点

    • 优点 : 使用起来方便了
    • 容易与当前执行文件中的名字冲突

    注意1 : 执行文件有与模块同名的变量或者函数名,会有覆盖效果,例子如下

    # 模块名字 lern.py 模块内如下信息
    name = '武当'
    def read1():
    print('tbjx模块:',name)
    def read2():
    return read1()
    def change():
    global name
    name = 'barry'
    ---------------------------------
    name = 'oldboy'
    from lern import name, read1, read2
    print(name) # 武当
    ---------------------------------
    from lern import name, read1, read2
    name = 'oldboy'
    print(name) # oldboy
    ---------------------------------
    def read1():
    print(666)
    from lern import name, read1, read2
    read1() # tbjx模块:武当
    ---------------------------------
    from lern import name, read1, read2
    def read1():
    print(666)
    read1() # 666

    注意2 : 当前位置直接使用read1和read2就好了,执行时,仍然以lern.py文件全局名称空间

    # 模块名字 lern.py 模块内如下信息
    name = '武当'
    def read1():
    print('tbjx模块:',name)
    def read2():
    return read1()
    def change():
    global name
    name = 'barry'
    ---------------------------------
    from lern import read1
    name = 'alex'
    read1() # tbjx模块: 武当
    ---------------------------------
    from lern import read2
    def read1():
    print('==========')
    read2() # tbjx模块:武当
    ---------------------------------
    # 同时通过这种方式引用的模块也可以对模块进行改名。
    from tbjx import read1 as read
    read()
  3. form...import*

    • from spam import * 把tbjx中所有的不是以下划线(_)开头的名字都导入到当前位置

    • 大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。

    • 可以使用__ all __来控制(用来发布新版本),在lern.py中新增一行

      __all__=['money','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字
      
      

八、一行导入多个

from tbjx import read1,read2,name

九、py文件的两种功能

  1. 编写好的一个python文件可以有两种用途:

    • 脚本,一个文件就是整个程序,用来被执行(比如模拟博客园的登录)
    • 模块,文件中存放着一堆功能,用来被导入使用
  2. python为我们内置了全局变量__ name __

    • 当文件被当做脚本执行时:__ name __ 等于__ main __
    • 当文件被当做模块导入时:__ name __等于模块名

作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码)

十、模块的搜索路径

当你引用一个模块时,不见得每次都可以import到

  • Python中引用模块是按照一定的规则以及顺序去寻找的,这个查询顺序为:先从内存中已经加载的模块进行寻找找不到再从内置模块中寻找,内置模块如果也没有,最后去sys.path中路径包含的模块中寻找。它只会按照这个顺序从这些指定的地方去寻找,如果最终都没有找到,那么就会报错。
  • 内存中已经加载的模块->内置模块->sys.path路径中包含的模块

模块的查找顺序

  1. 在第一次导入某个模块时(比如lern),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用(ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看)
  2. 如果没有,解释器则会查找同名的内置模块
  3. 如果还没有找到就从sys.path给出的目录列表中依次寻找lern.py文件。

注意:我们自定义的模块名不应该与系统内置模块重名。

14.Python略有小成(自由模块)的更多相关文章

  1. 18.Python略有小成(collections模块,re模块)

    Python(collections模块,re模块) 一.collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据 ...

  2. 17.Python略有小成(包,logging模块)

    Python(包,logging模块) 一.包 什么是包 官网解释 : 包是一种通过使用'.模块名'来组织python模块名称空间的方式 , 具体来讲 , 包就是一个包含有__ init __.py文 ...

  3. python之platform模块

    python之platform模块 ^_^第三个模块从天而降喽!! 函数列表 platform.system() 获取操作系统类型,windows.linux等 platform.platform() ...

  4. 学习PYTHON之路, DAY 6 - PYTHON 基础 6 (模块)

    一 安装,导入模块 安装: pip3 install 模块名称 导入: import module from module.xx.xx import xx from module.xx.xx impo ...

  5. Python学习之模块进程函数详解

    今天在看<Beginning Linux Programming>中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Pyt ...

  6. python 中time模块使用

    在开始之前,首先要说明这几点: 1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主 ...

  7. python(九)re模块

    python中re模块提供了正则表达式相关操作. 1. 字符串匹配: .    匹配除换行符以外的任意字符 \w 匹配字符或数字或下划线或汉字 \s  匹配任意空白字符 \d 匹配数字 \b 匹配单词 ...

  8. Python中optionParser模块的使用方法[转]

    本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值.分享给大家供大家参考之用.具体分析如下: 一般来说,Python中有两个内 ...

  9. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

随机推荐

  1. 将idea中xml文件背景颜色去除(转)

    原贴链接:https://blog.csdn.net/weixin_43215250/article/details/89403678 第一步:除去SQL代码块的背景颜色,步骤如下 设置后还是很影响视 ...

  2. POJ P3009 Curling 2.0 题解

    深搜,向四个方向,在不越界的情况下一直闷头走,直到撞墙.到达终点就输出,没到就回溯. #include<iostream> #include<cstring> #include ...

  3. 是Mscoreei.dll的正确版本吗?

    在安装.NET 4.0或更高版本之后,您可能会注意到.NET进程有点不寻常.下面是用.NET 2.0编译器编译的简单“Hello World”可执行文件的加载模块的部分列表. 开始-结束模块名称 60 ...

  4. CLR 调试体系结构

    公共语言运行时 (CLR) 调试 API 专门用作操作系统内核的一部分. 在非托管代码中,当程序生成异常时,内核将暂停执行进程,并使用 Win32 调试 API 将异常信息传递给调试器. CLR 调试 ...

  5. hasura skor 构建安装

    hasura skor 前边有介绍过是一个挺不错的event trigger 插件,我们可以用来进行事件通知处理 官方有提供构建的方法,但是有些还是会有点问题,所以结合构建碰到的问题,修改下 clon ...

  6. C语言博客作业--结构体,文件

    1.本章学习总结(2分) 1.1 学习内容总结 (1)结构体如何定义.成员如何赋值 结构体的一般形式为:      struct  结构体名     {      数据类型 成员名1:      数据 ...

  7. hive 整合ranger

    一.安装hive插件 1.解压安装 #  tar zxvf ranger-2.0.0-SNAPSHOT-hive-plugin.tar.gz -C /data1/hadoop/ 2.修改install ...

  8. 使用python3完成人脸识别

    原文地址:https://www.jb51.net/article/160197.htm 第一种: # -*- coding:utf-8 -*- import cv2 as cv import num ...

  9. 刷题记录:[SUCTF 2019]EasyWeb(EasyPHP)

    目录 刷题记录:[SUCTF 2019]EasyWeb(EasyPHP) 一.涉及知识点 1.无数字字母shell 2.利用.htaccess上传文件 3.绕过open_basedir/disable ...

  10. 解决idea创建Maven项目速度慢

    idea在创建maven项目的时候会去网上自动下载需要的插件,这样就会导致项目创建后一直处于下载插件的状态中,影响开发效率 此时我们可以在创建maven骨架的时候,加入键值对来让maven调用本地的骨 ...