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. c++中 string类型 转为 char []类型

    将string类型转换为字符数组char [] char arr[50]; //数组大小根据s的大小确定 string s= "12slfjksldkfjlsfk"; int le ...

  2. SVN 常用 查看日志

    1.日志查看,有时候会遇到查看一下之前改过的代码,或者恢复某某某个版本,这时就需要用到SVN的查看日志功能了,如图 2.日志列表,这里能看到各个版本的所有信息,包含了版本号 提交人 提交时间 提交时所 ...

  3. 框架 get 请求乱码

    解决方案: 在 tomcat 配置文件中添加 URIEncoding="utf-8"

  4. Linux crontab命令:循环执行定时任务(详解版)

    前面学习了 at 命令,此命令在指定的时间仅能执行一次任务,但在实际工作中,系统的定时任务一般是需要重复执行的.而 at 命令显然无法满足需求,这是就需要使用 crontab 命令来执行循环定时任务. ...

  5. SDN第六次上机作业

    1.实验拓扑 实验拓扑图如下: 搭建代码如下: 创建py脚本文件,并编写代码,如下: class MyTopo(Topo): def __init__(self): # initilaize topo ...

  6. 刷题记录:[XNUCA2019Qualifier]EasyPHP

    目录 刷题记录:[XNUCA2019Qualifier]EasyPHP 解法一 1.error_log结合log_errors自定义错误日志 2.include_path设置包含路径 3.php_va ...

  7. 2015-2016-2《Java程序设计》团队博客4

    一.类结构图 这一周将所有的类都进行了实现,以下是这周实现的类图:         二.项目进展 目前已经将所有代码都编写完成,正在进行整体测试.虽然期间遇到了一些问题,但我们一起进行了讨论,并查找了 ...

  8. 【软工实践】Beta冲刺(3/5)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 新增数据分析展示等功能API 服务器后端部署,API接口的beta版实现 展示 ...

  9. TCP的连接如何知道对方已经异常断开

    断电的话,对方不会发送任何数据包过来,包括RST.主机无法得知.如果是TCP已经连接,有个定时器,会发送空包,sequence number不变.如果一直收不到ack,会断定对方已经无法通信,而释放系 ...

  10. kubectl -n ingress-nginx exec nginx-ingress-controller-78bd49949c-t22bl -- cat /etc/nginx/nginx.conf

    kubectl -n ingress-nginx exec nginx-ingress-controller-78bd49949c-t22bl -- cat /etc/nginx/nginx.conf