一,模块

  模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀,总体来说,import加载的模块一共分成四个通用的类别:

  1,使用python编写的py文件

  2,已被变异为共享或者DLL或者C++的扩展

  3,包好一组模块的包

  4,使用c编写并连接到python解释器的内置模块

  为什么要使用模块?为了我们写的代码可以重用不至于把所有的代码都写在一个文件内,当项目规模比较小的时候,完全可以使用一个py搞定整个项目的开发,但是如果是一个非常大的项目,此时就必须要把相关的功能进行分离,方便我们日常维护,以及新项目的开发,导入模块有两种方式:

  1,import 模块

  2,from xxx import xxx

二,import

  首先建一个tang.py文件。 

name='糖糖'
def xihuan():
print('%s喜欢看小说'%name)
print('她喜欢画画')
print('她喜欢喝冰红茶')
print('她喜欢吃胡豆')
xihuan()

  接下来,再建一个py文件,在这个文件中导入tang模块。

import tang   #此时运行新建的py文件时,会默认执行tang模块中的代码
import tang #不管后面调用几次,都是没有效果的,模块是不能够重复导入的
import tang
print(tang.name)
tang.xihuan() #在引入模块后,就可以调用tang模块中的属性和方法

  导入模块的时候都做了些什么?首先,在导入模块的一瞬间,python解释器会先通过sys.mudules来判断该模块是否已经导入过了,如果导入过了就不在导入,如果该模块还没导入过,则系统会做三件事:

  1,为导入的模块创立新的名称空间

  2,在新创建的名称空间中运行该模块中的代码

  3,创建模块的名字,并使用该名称作为该模块在当前模块中引用的名字

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

import tang
name='糖儿'
tang.xihuan() #结果还是用的是tang中的‘糖糖’

  注意:在模块中使用global,我们之前说global表示把全局的内容引入进到局部,但是,这个全局指的是py文件,换句话说,global指向的是模块内部,并不会改变外部模块的内容

tang.py
name='糖糖'
def xihuan():
  global name
  name='糖糖糖'
  print(name) 111.py
import tang
name='唐儿'
tang.xihuan() #结果是‘糖糖糖’
print(name) #结果是‘唐儿’

  特别要注意,如果我们在不同的模块中引入同一个模块,并且在某一个模块中改变了被引入模块中的全局变量,则其他模块看到的值也随之改变,原因是python的模块只会引入一次,大家共享同一个名称空间

tang.py
name='糖' 111.py
import tang
tang.name='糖糖'
#if __name__ == __main__: 此时,只有在111py文件为执行文件时才会改变值
  #tang.name='糖糖’
112.py
import tang
import 111
print(tang.name) #结果是‘糖糖’ 113.py
import tang
import 111
#print(tang.name) #而此时,结果就不在是‘糖糖’,而是‘糖’

  我们可以对引入的模块重新命名,还可以一次性引入多个模块

import tang as t
print(t.name) #这样也行的 import time,random,json,tang #一次引入多个,但引入的顺序是有规定的

  正确的导入模块的顺序:

  1,所有的模块导入都要写在最上面,这是最基本的

  2,先引入内置模块

  3,在引入扩展模块

  4,最后引入自定义的模块

三,from xxx import xxx

  其实就是选择性的导入

tang.py
name='糖糖'
def xihuan():
print('%s喜欢看小说'%name)
print('她喜欢画画')
print('她喜欢喝冰红茶')
print('她喜欢吃胡豆')
xihuan() from tang import xihuan
xihuan() #直接使用就可以,不用tang.

  但是这有个坑,当我们从一个模块中引入一个变量的时候,如果当前文件中出现了重名的变量时,会覆盖掉模块中引入的那个变量

tang.py
name='糖糖'
def xihuan():
print('%s喜欢看小说'%name)
print('她喜欢画画')
print('她喜欢喝冰红茶')
print('她喜欢吃胡豆')
xihuan() from tang import name
name='静静'
print(name) #此时结果是‘静静’

所以,不要重名,切记,不要重名!不仅仅是变量名不要重复,我们创建的py文件的名字不要和系统内置的模块重名,否则,引入的模块都是python内置的模块。

  还有一种特殊的写法,from xxx import *,此时也是把模块中的所有内容导入。注意:如果所导的模块中没有写__all__则默认所有内容导入,但如果写了__all__,此时导入的内容就是__all__列表中列出来的所有名字

tang.py
__all__=['name']
name='糖糖'
def xihuan():
print('%s喜欢看小说'%name)
print('她喜欢画画')
print('她喜欢喝冰红茶')
print('她喜欢吃胡豆')

www.py
from tang import *
print(name) #结果是‘糖糖’
xihuan() #报错

  

模块,import,from xxx import xxx的更多相关文章

  1. 第二十四天- 模块导入 import from xxx import xxx

    # 模块:# 模块就是⼀个包含了python定义和声明的⽂件,⽂件名就是模块的名字加上.py后缀# 换句话说我们⽬前写的所有的py⽂件都可以看成是⼀个模块# 为何用模块:写大项目时,把相关的功能进⾏分 ...

  2. VUE引入模块之import xxx from 'xxx' 和 import {xxx} from 'xxx'的区别

    import FunName from ‘../xxx’ export defualt function FunName() { return fetch({ url: '/article/list' ...

  3. 浅谈python中得import xxx,from xxx import xxx, from xxx import *

    在python中import跟from import都是用来导入的,但是导入的机制不同 1.import xxx:导入模块,或者文件夹,对于调用模块或者文件夹中子模块的变量或者函数,需要使用" ...

  4. import和from .xxx import *的一点重要区别

    import zzz 不会导入zzz中已导入的模块 from .xxx import * 会导入xxx中已导入的模块 特别注意: 使用logging时,x模块导入了log.py,y模块导入了log.p ...

  5. python基础之 025 模块加载与import的使用

    内容梗概: 1. 模块 2. import 3. from xxx import xxx 1.模块定义:模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀.目前写的所有 ...

  6. Python中的import,from...import以及模块、包、库的概念

    首先,说明一下,我使用的是python3.6.3win32版本,使用的IDE是pycharm2017社区免费版. 刚开始接触python编程不久,有很多概念都不是特别清楚,但是我觉得既然选择,尽自己最 ...

  7. Python6_模块、包、import、from import的解释

    先说一下模块和包是什么? 模块(module):简单来说一个模块(module)就是一个py文件.在python中是这么约定. 模块里面有函数.类,就是一组代码的集合.   模块显然要有一个名字,这个 ...

  8. python基础--自定义模块、import、from......import......

    自定义模块.import.from......import...... 1)模块的定义和分类 1.模块是什么? 我们知道一个函数封装了一个功能,软件可能是有多个函数组成的.我们说一个函数就是一个功能, ...

  9. [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题

    http://www.cnblogs.com/mizhon/p/4242073.html [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题 最近想 ...

随机推荐

  1. Asterisk 11 chan_sip.c: Failed to authenticate device 看不到IP的问题

    Asterisk 11 chan_sip.c: Failed to authenticate device 看不到IP的问题   没有验证过 原文地址 http://www.coochey.net/? ...

  2. Linux学习笔记:常用软件

    Linux系统下常用软件(针对CentOS,其他系统类似) lrzsz 可用于上传和下载,安装 yum -y install lrzsz ,使用 上传 rz 下载 sz mysql 安装 yum -y ...

  3. Innodb IO优化-配置优化

    作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 对于数据库来讲 ...

  4. Eclipse添加JDK,JRE切换

    Eclipse添加JDK Window---preferences 切换JDK,JRE

  5. qhfl-2 ContentType组件

    一般商城里有很多的商品,计优惠券对应着活动类型商品,家电是一类商品,食物是一类商品,优惠券对应着不同的商品类别. from django.db import models class Applianc ...

  6. C#延时函数

    用Thread方法: 先using system.threading; 再在需要延时的进程处插入 thread.sleep(int);

  7. TensorFlow 计算模型 -- 计算图

    TensorFlow是一个通过计算图的形式表述计算机的编程系统 TensorFlow程序一般分为两个阶段,第一个阶段需要定义计算图中所有的计算(变量) 第二个阶段为执行计算 如以下代码 import ...

  8. electron、vue.js、vuex、element-ui、sqlite3

    总结一下这两周的入门之路. 1.安装node.js 过程就是下载:https://nodejs.org/en/,安装,完了在命令行窗口,在任何目录下都可录入node -v应能看到类似反馈 如果提示&q ...

  9. A1280. 最长双回文串

    学习了回文树,地址:http://blog.csdn.net/u013368721/article/details/42100363: 这个题就是正这反着加一遍就好,一开始我想的是枚举每个位置,然后一 ...

  10. Linux(以RHEL7为例)下添加工作区的方法|| The Way To Add Workspace On Linux

    Linux(以RHEL7为例)下添加工作区的方法 The Way To Add Workspace On Linux 作者:钟凤山(子敬叔叔) 编写时间:2017年5月11日星期四 需求:有时候在使用 ...