【Python 进阶2】命名空间,作用域,标准库预览

本文探讨了Python中的命名空间概念,包括内置、全局和局部命名空间,以及它们的查找顺序和生命周期。介绍了作用域的四种类型,并强调了`global`和`nonlocal`关键字在修改变量时的作用。此外,还简要预览了Python标准库中的操作系统接口、文件通配符、网络通信和文件压缩等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命名空间

命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。

命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响

就好比不同的文件夹下,可以有重复的文件名,但是在同一个文件夹下就不能有相同的文件名

三种命名空间

  • 内置名称(built-in names):Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等
  • 全局名称(global names):模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量
  • 局部名称(local names):函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量(类中定义的也是)

命名空间的查找顺序

局部命名空间 > 全局命名空间 > 内置命名空间

如果找不到则会抛出一个 NameError 的异常

命名空间的生命周期

命名空间的生命周期取决于对象作用域,如果对象执行完成,则该命名空间的生命周期就结束,因为无法从外部命名空间访问内部命名空间对象

作用域

Python 程序可以直接访问命名空间的正文区域

Python 作用域有四种

  1. 最内层,包含局部变量,比如一个函数方法内部
  2. 非局部也非全局的变量
  3. 当前脚本的最外层,当前模块的全局变量
  4. 包含了内建的变量,关键字,最后才被搜索
g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域

注意:在 Python 中,只有模块,类,以及函数,才会引入新的作用域,其它代码块 if/else try/except while/else 是不会引入新的作用域

global 和 nonlocal 关键字

当内部作用域想要修改外部作用域的变量,就要用到 global 和 nonlocal 关键字

num = 1
def fun1():
    global num
    print(num) # 1
    num = 100
    print(num) # 100

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了

def fun1():
    num = 1
    def fun2():
        nonlocal num
        num = 100 
        print(num) # 100
    fun2()
    print(num) #100

有一种特殊情况需要注意

num = 1
def fun1():
    num = num + 1
    print(num)

这个是会报错的,因为 fun1 中的 num 是局部变量,无法修改

所以应该

num = 1
def fun1():
    global num
    num = num + 1
    print(num)

num = 1
def fun1(num):
    num = num + 1
    print(num)
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    fun1(num)

标准库预览

操作系统接口

os 模块提供了很多与操作系统相关的函数

import os
import shutil
def Library():
    str = os.getcwd()
    os.chdir('../venv') # 进入到同级的 /venv 目录
    os.system('rmdir today') # 删除 today 目录
    os.system('mkdir today') # 创建目录
    shutil.copyfile('./main.py','main1.py')
    os.remove('main1.py') # 删除指定文件
    shutil.move('./main1.py','test')

文件通配符

搜索当前目录下以 .py 结尾的文件

import glob
def File():
    dict1 = glob.glob('*.py')
    print(dict1)

另外还有字符串正则,这个会在另外一篇博客详细总结

访问互联网

这个就是传说中的 爬虫,这里只是简单了解,后期也会总结专栏 Python 爬虫

用于访问互联网以及处理网络通信协议。其中最简单的两个是用于处理从 urls 接收的数据的 urllib.request 以及用于发送电子邮件的 smtplib

def PyPachong():
    url='http://www.taobao.com'
    res=urlopen(url) #通过urlopen方法访问拼接好的url
    res=res.read().decode() #read()方法是读取返回数据内容,decode是转换返回数据的bytes格式为str
    print(res) # 输出百度官网的源码

文件压缩

import zlib
def ZlibPress():
   s = b'abcdabcdabcdabcdabcd'
   print(len(s)) # 20
   t = zlib.compress(s)
   print(len(t)) # 14
   zlib.decompress(t)
   print(len(s)) #20

如果出现压缩后变大的情况,其实也很正常,这和 zlib 底层的压缩算法有关,但是当你写的字符串越长的时候,其实压缩的越明显,比如你给的 s = ‘abcdefg’

但是压缩后可能变为 a:1,b:1,c:1,d:1,e:1,f:1,g:1 这很明显会变大,当然这只是一个简单的案例,其底层压缩算法要复杂的多

另外也有一些,性能度量,测试模块,这里也不再总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的温柔香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值