一、模块
 
模块就是一个包含了python定义和申明的文件,文件名就是模块的名字加上.py的后缀/
模块的分类:
    1、使用python编写的py文件
    2、已被编译位共享库或者DLL或C或者C++的扩展
    3、包好一组模块的包
    4、使用c编写并连接到python解释器的内置模块
 
使用模块是为了让我们写的代码可以重用,不至于把所有的文件都写到一个py文件内。如果都写在一个py文件内,项目大时,不易维护。
 
导入模块的两种方式
1、import模块
2、from XXX import XXXX
 
yitian.py
print('...................')

main_actor = '张无忌'
main_actress = '赵敏'
fan_main_actor = '成昆'
fan_main_actress = '周芷若' def light_war():
print(f"{main_actor}破坏了{fan_main_actor}的阴谋诡计") def shaolin_war():
print(f"{main_actor}打败了{fan_main_actress}") def ending():
print(f"{main_actor}和{fan_main_actress}幸福的在一起了") def change(name):
global main_actor
main_actor = name
print("..................."
金庸来了
jinyong.py
import sys
import yitian as yt # as 给模块重新命名# pycharm报错,模块路径有差异
# sys.path 搜索模块的路径
# print(sys.path)
# import yitian # 如果已经到如果该模块,此时则不会再执行模块中的代码了 print(yt.main_actor)
# print(main_actor) 报错 当前名称空间中没有main_actor yt.light_war()
yt.shaolin_war()
yt.ending()
导入模块后的流程:
 
1、在导入模块的开始,python解释器会先通过sys.modules 来判断爱模块是否已经导入了该模块,如果导入了,则不会再导入。如果该模块还未导入过,则系统会做三件事:
        1、为导入的模块创立新的名称空间
        2、在新创建的名称空间中运行该模块中的代码
        3、创建模块的名字,并使用该名称作为该模块在当前模块中引用的名字(前提时没有as)
 
可以使用globals来查看模块的名称空间
print(globals())

结果:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000172F298C1D0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'F:/python_workspace_hxt/day24 内置模块 re/yitian.py', '__cached__': None, 'main_actor': '张无忌', 'main_actress': '赵敏', 'fan_main_actor': '成昆', 'fan_main_actress': '周芷若', 'light_war': <function light_war at 0x00000172F2881E18>, 'shaolin_war': <function shaolin_war at 0x00000172F2BFA268>, 'ending': <function ending at 0x00000172F2BFA158>, 'change': <function change at 0x00000172F9C3A400>}

注: 由于模块在导入的时候会创建自己的名称空间,所以在使用模块中的变量的时候一般不会产生冲突

import yitian as yt

main_actor = '周游'
print(yt.main_actor) # 张无忌
print(main_actor) # 周游
特别注意:如果我们在不统的模块这种引入了同一个模块,并且在某一个模块中改变了被引入模块中的全局变量,则其他模块看到的之也跟着变,原因是python的模块只会引入一次,大家共享一个名称空间
 
在yitian.py中添加如下代码
def change():
global fan_main_actress
fan_main_actress = '呵呵'

jingyong1.py

import yitian  as  yt
yt.fan_main_actress = '哈哈'

jingyong.py

import  yitian as  yt
import jingyong1 print(yt.fan_main_actress) # 哈哈
出现上述问题的原因
 
    1、大家同享一个模块的名称空间
     2、在jinyong1.py中改变了反角的名字
 
解决方案:
利用__name__这个内置变量,在python中,每个模块都有自己的__name__但是这个__name__的值是不定的。当我们把一个模块作为程序运行的人口时,此时该模块的__name__是“__main__”而如果我们把模块导入时,此时模块内部的__name__就是该模块自身的名字
 
在jinyong1.py
print(__name__)

# 结果为__main__

在jinyong.py中

import jinyong1

print(__name__)

结果为 jinyong1
 我们可以利用这个特性来控制模块内哪些代码是在被加载的时候就运行的,哪些时在模块被别人导入的时候就要执行的,也可以屏蔽掉一些不希望别人导入就运行的代码
 
if __name__=='__main__':
    yitian.main_actor = '张无忌'  # 此时,只有从该模块作为入口运行的时候才会把main_actor设置为张无忌
    print('张无忌其实是一个渣男')  # 只有运行该模块才会打印,import的时候是不会执行这里的代码的
 
我们还可以对导入的模块进行重命名
import yitian as yt  # 导入yitian,但是名字被重命名为yt,就好比变量赋值一样
a = 1 b = a yt.shaoli_war() # 此时可以正常运行 print(globals()) {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002CC30D7C1D0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'F:/python_workspace_hxt/day24 内置模块 re/practice24.py', '__cached__': None, 're': <module 're' from 'C:\\Users\\huxia\\AppData\\Local\\Programs\\Python\\Python36\\lib\\re.py'>, 'sys': <module 'sys' (built-in)>, 'yt': <module 'yitian' from 'F:\\python_workspace_hxt\\day24 内置模块 re\\yitian.py'>}

一次也可以导入多个模块

import time,random,json,yitian
正确的导入模块顺序:
 
    1、所有的模块导入都要写在最上面,基本
     2、先引入内置模块
     3、再引入扩展模块
     4、最后引入自己定义的模块
三、from  XXX  import  XXX
     在使用from的时候,python也会给我们的模块创建名称空间,这一点和import是一样的,但是from XXX import XXXX
的时候,只是把这个空间中的一些变量引入过来,部分导入。当一个模块中的内容过多的时候,可以选择性的导入要使用的内容。
  from的坑:当我们从一个模块中引入一个变量的时候,如果当前文件中出现了崇明的变量时,会覆盖掉模块引入的哪个变量。
所以要切记,不可以重名,不仅仅变量名不要重复,我们自己创建的py文件的名字不要和系统内置的模块重名,否则,引入的模块都是python内置的模块。
 
那有⼀种 特殊的写法: from xxx import *  我们说此时是把模块中的所有内容都导入.  注意, 如果模块中 没有写出__all__ 则默认所有内容都导入. 如果写了了__all__ 此时导入的内容就是在__all__列表 中列出来的所有名字

# haha.py
__all__ = ["money", "eat"]
money = 100
def eat():
print("我是吃")
def drink():
print("我是呵呵") # test.py
from haha import *
eat()
print(money)
drink() # 报错

25 Python之模块与包的更多相关文章

  1. Python之模块和包导入

    Python之模块和包导入 模块导入: 1.创建名称空间,用来存放模块XX.py中定义的名字 2.基于创建的名称空间来执行XX.py. 3.创建名字XX.py指向该名称空间,XX.名字的操作,都是以X ...

  2. 一文搞懂 Python 的模块和包,在实战中的最佳实践

    最近公司有个项目,我需要写个小爬虫,将爬取到的数据进行统计分析.首先确定用 Python 写,其次不想用 Scrapy,因为要爬取的数据量和频率都不高,没必要上爬虫框架.于是,就自己搭了一个项目,通过 ...

  3. Python之模块和包

    一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  4. 《Python》模块和包

    一.模块 1.什么是模块: 一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编写的代码(. ...

  5. Python之模块和包(Day21)

    一.Python模块 Python模块(module),是一个Python文件,以.py结尾,包含了Python对象定义和Python语句. 模块让你能够有逻辑的组织你的Python代码段 把相关的代 ...

  6. python 深入模块和包

    模块可以包含可执行语句以及函数的定义. 这些语句通常用于初始化模块. 它们只在 第一次 导入时执行.只在第一次导入的时候执行,第一次.妈蛋的第一次...后面再次导入就不执行了. [1](如果文件以脚本 ...

  7. (Python )模块、包

    本节开始学习模块的相关知识,主要包括模块的编译,模块的搜索路径.包等知识 1.模块 如果我们直接在解释器中编写python,当我们关掉解释器后,再进去.我们之前编写的代码都丢失了.因此,我们需要将我们 ...

  8. Python 基金会 —— 模块和包简介

    一.模块(Module) 1.模块的作用      在交互模式下输出的变量和函数定义,一旦终端重新启动后,这些定义就都不存在了,为了持久保存这些变量.函数等的定义,Python中引入了模块(Modul ...

  9. python基础-------模块与包(一)

    模块与包 Python中的py文件我们拿来调用的为之模块:主要有内置模块(Python解释器自带),第三方模块(别的开发者开发的),自定义模块. 目前我们学习的是内置模块与第三方模块. 通过impor ...

随机推荐

  1. 如何安装Vscode软件及设置成中文界面?

    最新小编开始研究前端,想写点东东玩,要想开始首先就要安装工具,写前端有好几个工具,安装推荐开源的vscode,第一次安装是英文版的,如何修改成中文版,也是很简单的,跟随小编一起来安装设置工具吧. 方法 ...

  2. php下intval()和(int)转换使用与区别

    没啥区别,一般用(int),另外还有 float, string, array 等 intval()而言,如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值.如果字符串第一 ...

  3. GIS面积计算问题

    好长时间不更新了,今天说点干货,项目用到的. 1.项目中要用到计算面积的,根据火星坐标: 2.百度找了各种面积计算,google了半天,也没发现那个比较准确: 直接说干货吧.咱也高大上一会,用 Arc ...

  4. JS编程规范

    在第一家公司用C++时,公司有着严格的代码规范,甚至到了严苛的地步,现在回想起来,对它充满感激.一个好的习惯让你收益终身. 之后使用JS/TS却没有为自己定一套编程规范,所幸为时不晚,在这里参考air ...

  5. GitHub:Python

    ylbtech-GitHub:Python 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 1. https://github.com/python 2.   6 ...

  6. Bootstrap-CSS:目录

    ylbtech-Bootstrap-CSS:目录 1.返回顶部 1.   2. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 1.   2.   6.返回顶部   7.返回顶部 ...

  7. NGUI中UILabel使用url标签的一个bug

    在NGUI里,UILabel控件可以支持一些简单功能的标签,使文本显示更丰富及实现类似超链接的功能.但是在使用的时候发现了NGUI3.5.9版本里存在着一个bug.不过还好修复这个bug也很简单. 在 ...

  8. Mac搭建学习PHP环境

    在sublime text 3中学习PHP,编写PHP代码: 使用的xampp开发环境: 第一步,就是安装xampp,这个没啥可说的,根据自己的系统下载安装就好,我的是OSX;第二步,就是用XAMPP ...

  9. 转SQLSERVER 会不会自动加锁

    [SQL]提升查询效率与避免LOCK发生nolock: 可能把没有提交事务的数据也显示出来,可能会产生脏读readpast: 会把被锁住的行不显示出来 所有Select加 With (NoLock)解 ...

  10. 网络实验 02-交换机的Telnet远程登录设置

    交换机的Telnet远程登录设置 一.实验目标 掌握采用telnet方式配置交换机的方法 二.技术原理 1. 配置交换机的管理IP地址(计算机的IP地址与交换机管理IP地址在同一网段) 2. 为tel ...