day23 模块
1. 模块
1. 首先,我们先看个老生常谈的问题. 什么是模块. 模块就是一个包含了python定义和声
明的文件, 文件名就是模块的名字加上.py后缀. 换句话说我们目前写的所有的py文件都可以
看成是一个模块但是我们import加载的模块一共分成四个通用类别:
1. 使用pyhton编写的py文件
2. 已被变异为共享库或者DLL或C或者C++的扩展
3. 包好一组模块的包.
4. 使用c编写并连接到python解释器的内置模块 2. 为什么要使用模块
为了我们写的代码可以重复利用,不至于把所有的代码都行写在一个文件内;对于大项目可以进行功能分离
方便我们日常的维护及新项目的开发. 3. 调用模块的方式
1. import XXXXX
2. from XXX import XXXX
2. import #创建模块 yitian
print("啊啊啊啊啊啊啊啊啊啊啊啊啊...............")
mian_person_man="张无忌"
mian_person_women="赵敏" bad_person_one="周芷若"
bad_person_two="成昆" def fight_shao_lin():
print("在少林%s粉碎了%s的阴谋"%(mian_person_man,bad_person_two))
print("哦哦哦哦哦哦哦哦哦哦哦哦哦哦...................") 例. 1
#打开 jinyong文件
import yitian #导入yitian模块 在导入模块会把模块先运行一次,所以片头曲片尾曲会被先打印出来
print(yitian.mian_person_man) # 使用模块中定义好的名字
print(yitian.bad_preson_one) #张无忌 周芷若 yitian.fight_in_shaolin() # 调用模块中的函数
yitian.fight_on_light_top()
在导入某块的时候,解释器会做几件事:
1. 通过sys.modules来判断模块是否已经导入过,导入过就不会重复导入
说白了,就是统同一模块只会被导入一次
2. 如果模块还没有被导入过,则系统会为他在内存开辟一块名称空间
3. 在他的名称空间中运行该模块中的代码
4. 创建模块的名字,并使用该名称作为该模块在当前模块中引用的名字 --------------------------------------------------------
例 .2
import yitian
mian_person_man = "胡一菲"
def fight_in_shaolin():
print(mian_person_man, "大战曾小贤") print(yitian.main_person_man) # 张无忌
print(mian_person_man) # 胡一菲 yitian.fight_in_shaolin() # yitian模块的
fight_in_shaolin() # 自己的的
注意. 由于模块在导入的时候会创建其自己的名称空间. 所以. 我们在使用模块中的变量
的时候一般般是不会产生冲突的
--------------------------------------------------------------------
例 .3
模块 yitian 中:
print("片头曲. 啊! 啊~ 啊! 啊. 啊啊啊啊啊啊啊...")
main_person_man = "张无忌"
main_person_woman = "赵敏"
low_person_man_one = "成昆"
low_person_man_two = "周芷若"
def fight_on_light_top():
print("光明顶大战", main_person_man, "破坏了", low_person_man_one, "的⼤阴
谋")
def fight_in_shaolin():
global low_person_man_two # 注意看, 此时的global是当前模块. 并不会影响
其他模块
low_person_man_two = "战五渣"
print("少林寺⼤战", main_person_man, "破坏了", low_person_man_two, "的⼤阴
谋") 调用方:
import yitian
low_person_man_two = "刘海柱"
yitian.fight_in_shaolin()
print(yitian.low_person_man_two) # 战五渣
print(low_person_man_two) # 刘海柱. 并没有改变当前模块中的内容. 所以模块内部的
global只是用于模块内部 在模块中使用global. 我们之前说global表示把全局的内容引入到局部. 但是. 这个
全局指的是py文件. 换句话说. global指向的是模块内部. 并不会改变外部模块的内容 这边要说明的就一个,在一个py文件中global的作用域就是当前文件,不会延伸到调用或者被调用的的模块中
----------------------------------------------------------------------------------
特别特别要注意. 如果我们在不同的模块中引入了同一个模块. 并且在某一个模块中改
变了被引入模块中的全局变量. 则其他模块看到的值也跟着边. 原因是python的模块只会引入
一次. 大家家共享一个名称空间
例 .4
金庸:
import yitian
yitian.main_person_man = "灭绝师太" 金庸二号:
import yitian
import 金庸
print(yitian.main_person_man) # 灭绝师太.
都引用了yitian,都是金庸把一天中的
main_person_man改变了,金庸二引用了该模块,其
main_person_man的值也会跟着改变
#那这个问题如何改变呢 --------------------------------------------------------------
此时, 我们就要利用一下__name__
这个内置变量了. 在Python中. 每个模块都有自己的__name__ 但是这个__name__的值是不
定的. 当我们把一个模块作为程序运行的入口时. 此时该模块的__name__是"__main__" , 而
如果我们把模块导入时. 此时模块内部的__name__就是该模块文件的名字
例.5
金庸:
print(__name__)
# 此时如果运行该文件. 则__name__是__main__ 金庸二号:
import 金庸
#此时打印的结果是"金庸" 我们可以利用这个特性来控制模块内哪些代码是在被加载的时候就运行的. 哪些是在模
块被别人导入的时候就要执行的. 也可以屏蔽掉那些不希望别人导入就运行的代码. 尤其是测
试代码
if __name__ == '__main__':
yitian.main_person_man = "灭绝师太" # 此时, 只有从该模块作为入运行的时候
会把main_person_man设置成灭绝师太 print("哇哈哈哈哈哈") # 只有运行该模块才会打印. import的时候是不会执行这些的代
码的
这边不是很好理解,要重点看一下 -----------------------------------------------------------------------
我们还可以对导入的模块进行重新命名:
import yitian as yt # 导⼊yitian. 但是名字被重新命名成了yt. 就好比变量赋值⼀样.
a = 1 b = a
yt.fight_in_shaolin() # 此时可以正常运行
# yitian.fight_in_shaolin() # 此时程序报错. 因为引用的yitian被重命名成了yt 也可以一次引用多个模块
import time, random, json, yitian
正确的导入模块的顺序:
1. 所有的模块导入都要写在最上面. 这是最基本的
2. 先引入内置模块
3. 再引入扩展模块
4. 最后引入你自己定义的模块
3. 关于 from xxx import xxx
接下来. 我们来看from xxx import xxx这种导入模块的
效果. 在使用from的时候, python也会给我们的模块创建名称空间. 这一点和import是一样
的. 但是from xxx import xxx的时候. 我们是把这个空间中的一些变量引入过来了. 说白了. 就
是部分导入. 当一个模块中的内容过多的时候. 我们可以选择性的导入要使用的内容
例.
from yitian import fight_in_shaolin, fight_on_light_top, main_person_man
fight_in_shaolin()
fight_on_light_top()
print(main_person_man)
最后. 看一下from的坑. 当我们从一个模块中引入多个变量的时候. 如果当前文件中出现
了重名的变量时. 会覆盖掉模块引入的那个变量.
from yitian import main_person_man
main_person_man = "超级大灭绝"
print(main_person_man) #超级大灭绝 所以. 不要重名. 切记. 不要重名! 不仅仅是变量名不要重复.我们自己
创建的py文件的名字不要和系统内
置的模块重名. 否则. 引入的模块都是python内置的模块. 切记, 切记.
day23 模块的更多相关文章
- day23 模块引入的一些说明
模块导入多次也是只导入一次 sys.modules里面会查看有没有被导入 导入后的模块内部的函数,变量就都可以拿来用了 给模块起别名,可以提高代码的兼容性 import time as t 但是被起别 ...
- day23 模块02
核能来袭--模块 2 1.nametuple() 2.os模块 3.sys模块(重点) 4.序列化 (四个函数) 5.pickle(重点) 6.json(重点中的重点) 1.nametuple() 命 ...
- day23 Pythonpython 本文re模块
re模块用于对python的正则表达式的操作. 字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配 ...
- day23 序列化模块
概念: 序列化 -- 其他数据类型转换成一个字符串数据类型 反序列化 -- 字符串转换成其他数据类型 序列 -- 字符串 必须要转换成字符串的场景: 往文件里面写数据的时候只能写字符串,不能写字典的 ...
- day23 正则,re模块
一. 简谈正则表达式 元字符 . 除了换行符外任意字符. \w 数字.字母.下划线 \s 空白符 \b 单词的末尾 \d 数字 \n 匹配换行符 \t 匹配制表符 \W 除了数字. 字母 下划线 \D ...
- day23 xml模块、面向对象编程介绍
今日内容: 1.xml模块 2.面向对象编程 一.xml模块 什么是xml? xml是一种可扩展的标记语言 xml语言的语法: <person name="jack"> ...
- day23 常用模块(中)
目录 一.json&pickle模块 1 什么是序列化 2 为什么要序列化 2.1 持久保存状态 2.2 跨平台数据交互 3 如何序列化 二.shelve模块 三.configparser模块 ...
- day23 Pyhton学习 昨日回顾.re模块.序列化模块
一.昨日回顾 #__file__查看当前文件所在的绝对路径 #time 时间模块 time.time 获取当前时间戳时间 字符串->time.strptime->结构化->mktim ...
- day23单例模式 , 日志处理 , 项目结构目录
# day23笔记 ## 一.补充,作业 ### 1.字符串格式化 ```pythonmsg = "我是%(n1)s,年龄%(n2)s" % {'n1': 'alex', 'n2' ...
随机推荐
- 使用/dev/dsp的wav文件播放器源码
转载于:http://blog.csdn.net/dux003/article/details/5459423 #include #include #include #include #include ...
- No bean class specified on bean definition 解决方案
调试Spring项目出现No bean class specified on bean definition异常 但是控制台并没有给出其他相关信息了 这个时候可以在AbstractBeanDefini ...
- 面试题:struts 值栈 有用
一. 核心部分 1. [核心试题]完成当天课堂练习 2. [多选题] 阅读如下代码中,下列哪种方式可以在页面正确迭代获取集合中的数据 (ABC) public String add(){ ValueS ...
- 一篇docker的详细技术文章
http://www.open-open.com/lib/view/open1423703640748.html
- CPU时钟是个什么东西
CPU时钟说的是频率生成器,可能生成的是方波也可能是其它波. 频率生成器那是什么东西?这教要讲到压电效应了. 压电效应这个词是一个统称,它包括正压电效应和逆压电效应. 传说在很久以前有一个科学家发现了 ...
- python3-while与if
# Auther: Aaron Fan age_of_oldboy = 56 #定义一个while循环的起始判断值countcount = 0#当count小于3的情况下一直执行while循环whil ...
- 树莓派(Raspberry Pi 3) 使用wifi模块连接网络
树莓派3B内置了wifi和蓝牙模块,启动WIFI模块有两种方式,一种是图形界面,一种是命令行模式. 使用图形界面: 在桌面右上角的菜单栏里面选择wifi,输入密码就可以了. 使用命令行: 第一步:配置 ...
- c# ftp创建文件(非上传文件)
c# ftp创建文件(非上传文件) 一.奇葩的故事: 今天项目中遇到这么个奇葩的问题,ftp文件传输完成后要在ftp目录下另一个文件夹下创建对应的空文件,听说是为了文件的完整性,既然这么说,那么就必 ...
- 没固定公网 IP 的公司内网实现动态域名解析( 阿里云万网解析 )
情景说明 前段时间应公司需求,需要将内网的服务映射到公网.由于公司使用的是类似家庭宽带的线路,没有固定的公网 IP 地址,所以决定使用域名来完成. 当时有几种方案: 1.花生壳:但是目前需要乱七八糟的 ...
- ubuntu - 14.04,解决Gnome桌面右键菜单失效问题!
我安装完ubuntu14.04,首先安装经典版的Gnome,刚安装完经典版的Gnome,在桌面点击鼠标右键会弹出菜单,使用非常方便,但是当我安装了最新版的Gnome15.10之后,我发现再进入经典版的 ...