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 ...
随机推荐
- 四单元总结&OO总结
目录 本单元架构总结 第一次作业 第二次作业 第三次作业 架构设计总结 第一单元 第二单元 第三单元 对测试演进 课程收获 改进建议 线上学习体验 本单元架构总结 第一次作业 第一次作业按照UML正常 ...
- 2021年HW0day-奇安信 网康下一代防火墙 RCE漏洞细节
漏洞信息: 漏洞名称:奇安信 网康下一代防火墙 RCE漏洞. 漏洞性质:远程命令执行 漏洞利用特点:命令执行之后没有回显 利用方式:防火墙使用linux进行开发的,可以使用echo xxx >1 ...
- Jenkins 项目类型及配置项
0. 简介 1. Freestyle project 1)General 2)源码管理 3)构建触发器 4)构建环境 5)构建 6)构建后操作 2. Maven 项目 1)所有配置项 2)Build ...
- k8s kubernetes给node节点添加标签和删除node节点标签
node节点IP 192.168.1.205 给节点添加标签的命令 添加label语法 kubectl label nodes <node-name> <label-key>= ...
- OO第四单元与全课程总结
OO第四单元与全课程总结 一.作业代码架构设计 1.第一次作业 作业类图如下: 具体架构设计: 第一次作业的全部查询工作都是和类图有关,需要解决的主要问题就是如何解析原有UML类图数据的结构,并形成自 ...
- Bootstrap自适应各种设备
<!DOCTYPE html><html><head> <title>Bootstrap 实例 - 手机.平板电脑.台式电脑</title> ...
- 从苏宁电器到卡巴斯基第16篇:我在苏宁电器当营业员 VIII
其实不想走,其实很想留 我在之前的故事中说过,在大四的时候,我其实是想考研的,但是看了一段时间的书以后,发现自己实在不是那块料,主要是数学实在是学不明白,那么也就只能作罢了.而后来面试中石化的时候,尽 ...
- 洛谷P1089 津津的储蓄计划
题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里 ...
- DVWA之 SQL Injection(Blind)
SQL Injection(Blind) SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法 ...
- poj2175费用流消圈算法
题意: 有n个建筑,每个建筑有ai个人,有m个避难所,每个避难所的容量是bi,ai到bi的费用是|x1-x2|+|y1-y2|+1,然后给你一个n*m的矩阵,表示当前方案,问当前避难方案是否 ...