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

文章目录

    • 命名空间
    • 作用域
    • 标准库预览

命名空间

命名空间(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 这很明显会变大,当然这只是一个简单的案例,其底层压缩算法要复杂的多

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

你可能感兴趣的:(Python,基础语法学习,Python,命名空间,Python,作用域,Python,标准库预览,python)