师范生招聘,布拉克曼秀,无处可逃 铁扇公子
我们说一个函数就是一个功能,那么把一些常用的函数放在一个py文件中,这个文件就称之为模块,模块,就是一些列常用功能的集合体,模块就是文件,存放一堆常用的函数,一个模块就是一个py文件,这个模块存储很多相似的函数集合体
10个文件有50个函数,有一些相同功能或者相似功能的函数,代码冗余,重复,我们应该将这10个函数提取出来,放在一个文件中.
模块分类
内置模块,标准库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语句是可以在程序中的任意位置使用的,且针对同一个模块,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句)
# 注意 : 那个文件执行文件,哪个文件是被执行模块。 代码示例: import tbjx import tbjx import tbjx import tbjx import tbjx # import tbjx 只在第一次导入时才执行tbjx.py内代码,此处的显式效果是只打印一次,当然其他的顶级代码也都被执行了,只不过没有显示效果.
注意 : 重复导入会直接引用内存中已经加载好的结果
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突
# 模块名字 lern.py 模块内如下信息 print("乾坤") name="张三丰" --------------------------------- import lern # 执行结果 乾坤 name="张无忌" print(lern.name) # 打印结果 张三丰
将一个比较长的模块名化简成简单的
import tbjx as t t.read1()
有利于代码的扩展和优化
#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
form...import...的使用
# 模块名字 lern.py 模块内如下信息 print("乾坤") name="张三丰" def read1(): print("丐帮") --------------------------------- # from ... import ... 的使用示例。 from lern import name, read1 # 执行结果 乾坤 print(name) # 张三丰 read1() # 丐帮
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()
form...import*
from spam import * 把tbjx中所有的不是以下划线(_)开头的名字都导入到当前位置
大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。
可以使用__ all __来控制(用来发布新版本),在lern.py中新增一行
__all__=['money','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字
from tbjx import read1,read2,name
作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码)
当你引用一个模块时,不见得每次都可以import到
模块的查找顺序
注意:我们自定义的模块名不应该与系统内置模块重名。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python爬虫:Request Payload和Form Data的简单区别说明
浅谈Python中threading join和setDaemon用法及区别说明
Python3-异步进程回调函数(callback())介绍
python继承threading.Thread实现有返回值的子类实例
Python中使用threading.Event协调线程的运行详解
网友评论