python基础之包、模块、命名空间和作用域
一、模块介绍
模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能。
模块的作用:
(1)从文件级别组织程序,更方便管理;随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用;
(2)拿来主义,提升开发效率同样的原理,我们也可以下载别人写好的模块然后导入到自己的项目中使用,这种拿来主义,可以极大地提升我们的开发效率。
二、创建及使用模块
1、创建一个模块sendmsg.py
def test1():
print("----test1-1------")
print("----test1-2------")
print("----test1-3------")
def test2():
print("----test2-1------")
print("----test2-2------")
print("----test2-3------")
2、创建一个main.py,调用sendmsg中的函数
import sendmsg
# 第一种导入方法:
sendmsg.test1() # 需要先写模块名+调用;比如把工具箱拿过来用,需要再从工具箱里在取东西
sendmsg.test2()
# 第二种导入方法:
# 有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以用下面方法实现:
from 模块名 import 函数名1,函数名2....
from sendmsg import test1
test1()
注意:
通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数。
思考:为什么必须加上模块名调用呢?
因为可能存在这样一种情况:在多个模块中含有相同名称的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。所以如果像上述这样引入模块的时候,调用函数必须加上模块名
from sendmsg import * #调用一个模块中的所有函数
test1()
test2()
as起别名
from sendmsg import test1 as t1
t1()
包
包是一种管理python模块命名空间的形式,采用“点模块名称”;比如一个模块的名称是A.B,表示一个包A中的子模块B
在导入一个包的时候,python会根据sys.path中的目录来寻找这个包中包含的子目录;目录只有包含一个叫做__init__.py的文件才会被认作是一个包,主要是为了避免一些滥俗的名字不小心的影响搜索路径中的有效模块。
from . import FUNC
from .. import FUNC
三、命名空间
1、命名空间的概念
命名空间是对一个名字起作用的范围
命名空间的本质:存放名字与值得绑定关系
2、命名空间的种类:
(1)内置命名空间(int string def print等)
就是Python解释器一启动就可以使用的名字存储在内置的命名空间中
内置的名字在启动解释器的时候被加载在内存里
(2)全局命名空间:位于模块的最上层
是在程序上到下被执行的过程依次加载到内存里
放置了我们设置的所有变量名和函数名
(3)局部命名空间:位于函数内
就是在函数内部定义的名字
当调用函数的时候,才会产生这个名称空间,随着函数执行的结束
这个命名空间就又消失了
3、三种命名空间之间的加载与取值顺序
加载顺序:
内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
访问顺序:
局部 --------> 全局 --------> 内置
在正常情况下,直接使用内置的名字
当我们在全局定义了和内置命名空间中同名的名字时,会使用全局的名字
(当我自己有的时候,我就不找我的上级要了)
如果自己没有,就找上一级要,上一级没有再找上一级,如果内置的命名空间都没有就报错
多个函数应该拥有多个独立的局部命名空间,不互相共享
四、作用域
1、作用域的概念
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
局部作用域:局部名称空间,只能在局部范围内生效
作用域
在之前学习变量的作用域时,经常会提到局部变量和全局变量,之所有称之为局部、全局,就是因为他们的自作用的区域不同,这就是作用域
2、局部变量(Locals)
def test():
a = 100
b = 200
print(locals()) #打印局部变量
test()
---------------------------------------
{'a': 100, 'b': 200}
3、全局变量(global)
num = 5
def func():
global num # 加上这行把num变成了全局变量
num += 1
print(num)
func()
print(num)
4、全局变量和局部变量名字相同时,函数使用的是局部变量
a =1
b = 2
def func():
x = "aaa"
y = 'bbb'
print(locals()) #查看局部作用域所有名字用locals()
print(globals())
func() #最后一步骤注释
print(globals()) # 查看全局作用域和内置有哪些名字
print(locals()) # 翻译成中文是本地的 所有和全局是一样的。
# 总结:
#globals 永远打印全局的名字
#locals 输出什么是根据locals所在的位置
# 输出
{'x': 'aaa', 'y': 'bbb'}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000008AAC1B62E8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/renyz02/Desktop/py_test1/20190916/main.py', '__cached__': None, 'a': 1, 'b': 2, 'func': <function func at 0x0000008AAC4B8BF8>}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000008AAC1B62E8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/renyz02/Desktop/py_test1/20190916/main.py', '__cached__': None, 'a': 1, 'b': 2, 'func': <function func at 0x0000008AAC4B8BF8>}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000008AAC1B62E8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/renyz02/Desktop/py_test1/20190916/main.py', '__cached__': None, 'a': 1, 'b': 2, 'func': <function func at 0x0000008AAC4B8BF8>}
例子1:
a =1 #a = 1
def func(a): #func(1) = 2
a = 2 #a = 2
return a #a = 2
a = func(a) #a = func(1);a = 1
print(a) #a = 2
例子2:
num = 100
nums = [11,22]
def test():
#修改了执行,全局变量指向了一个新的地方(即100+100),需要使用global
global num
num += 100
def test2():
#只是在全局变量中增加了66,指向的空间未发生变化,则不需要使用global
nums.append(66)
print(num)
print(nums)
test()
test2()
print(num)
print(nums)
总结:
在函数外边定义的变量叫做全局变量
全局变量能够在所有的函数中进行访问
如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,小技巧强龙不压地头蛇
全局变量要定义在函数调用前,否则会报错。
python基础之包、模块、命名空间和作用域的更多相关文章
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- python基础31[常用模块介绍]
python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...
- 十八. Python基础(18)常用模块
十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...
- [python基础]关于包,类,模块的那些事儿
转载请注明出处:http://www.cnblogs.com/codefish/p/5032753.html 在理解python的包,类,模块之前,我一直是将他类比为dll,C#的类,命名空间的这种参 ...
- Python基础入门(模块和包)
1 模块 1.1 什么是模块 在 Python 中,一个 .py 文件就称之为一个模块(Module). 我们学习过函数,知道函数是实现一项或多项功能的一段程序 .其实模块就是函数功能的扩展.为什么这 ...
- 2015/9/15 Python基础(12):模块和包
模块是用来组织 Python 代码的方法,而包则是用来组织模块的. 当代码量很大时,我们一般会把代码分成几个有组织的代码段,然后每个代码段之间有一定的联系.代码单之间是共享的,所以Python允许调入 ...
- python基础14 ---函数模块5(模块和包)
模块与包 一.模块 1.模块是怎么诞生的. 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到 不同的文 ...
- 【python基础语法】模块和包管理,文件的操作(第8天课堂笔记)
''' 模块和包管理 模块和包的定义: 模块:模块是一个Python文件,以.py结尾,包含了Python对象定义和Python语句 包:Python中的包就是一个包含__init__.py文件的目录 ...
- Python全栈开发之路 【第六篇】:Python基础之常用模块
本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...
随机推荐
- Dynamics CRM邮箱配置
Dynamics CRM对邮箱有很好的支持,开通邮箱后方便用户通过邮件进行Dynamics CRM的业务处理,同时也可以作为一直消息流提醒的手段应用于审批.通知等场景,可以做一些更深入的功能拓展. 本 ...
- 软工热身——回顾&展望
项目 内容 这个作业属于哪个课程 2021春季软件工程 (罗杰 任健) 这个作业的要求在哪里 第一次阅读作业 我在这个课程的目标是 从实践中学习软件工程相关知识(结构化分析和设计方法.敏捷开发方法.软 ...
- Apache Hudi C位!云计算一哥AWS EMR 2020年度回顾
1. 概述 成千上万的客户在Amazon EMR上使用Apache Spark,Apache Hive,Apache HBase,Apache Flink,Apache Hudi和Presto运行大规 ...
- 网络编程之BIO和NIO
目录 OSI网络七层模型 TCP/UDP协议 TCP消息头 TCP三次握手.四次挥手 UDP协议 TCP协议/UDP协议区别 HTTP协议 HTTP协议请求头 HTTP协议响应头 HTTP状态码 so ...
- 我最近做了一个react的后台管理系统,用于快速创建后台项目模板
react-ant-admin 此框架使用与二次开发,前端框架使用react,UI框架使用ant-design,全局数据状态管理使用redux,ajax使用库为axios.用于快速搭建中后台页面.欢迎 ...
- Matrix Chain Multiplication UVA - 442
Suppose you have to evaluate an expression like ABCDE where A,B,C,D and E are matrices. Since matrix ...
- 支持多线程的Redis6.0来了
支持多线程的 Redis 6.0 版本于 2020-05-02 终于发布了,为什么 Redis 忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安 ...
- Java 常用类总结(SE基础)
本篇博客对java常用类相关知识进行了归纳总结,比较详细,适用于学习和复习. 1. 字符串相关的类 1.1 String String是一个final类,代表不可变的字符序列.不可被继承. Strin ...
- 使用IDEA模拟git命令使用的常见场景
目录 使用IDEA模拟git命令使用的常见场景 前期准备 新建一个远程仓库 在一个文件夹内建立两个子文件夹作为两个本地仓库的存放位置 本地仓库与远程仓库建立联系 模拟两个用户协同开发的场景(使用IDE ...
- 991. Broken Calculator
On a broken calculator that has a number showing on its display, we can perform two operations: Doub ...