目录:
- 命名空间
- 作用域
- 异常
- sorted函数
- pop函数
- id函数
- dir函数
- help函数
- threading模块(了解)
- zipfile模块(了解)
1.命名空间
定义:
命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。
作用:
命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何联系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名,但建议在实际编程过程中尽量避免重名的情况。
说明: 一般有三种形式的命名空间。
- 内置命名空间(Built-in names): 用于存放Python 的内置函数的空间,比如,print,input等不需要定义即可使用的函数就处在内置命名空间。
- 全局命名空间(Global names):模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
- 局部命名空间(Local names):函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。在函数内定义的局部变量,在函数执行结束后就会失效,即无法在函数外直接调用函数内定义的变量。
命名空间查找顺序:
局部命名空间→全局命名空间→内置命名空间。
命名空间的生命周期:
命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。
举例:
# 在全局命名空间中给变量a赋值,令a=1。
a = 1
# 在定义函数“function1”的同时就为其创建了一个独立的局部命名空间。
def function1():
# 变量b在局部命名空间中被赋值“a+1”。
b = a + 1
# 此处所使用的print函数就是源自Python的内置命名空间。
print(b)
# 执行function1时,计算机会优先找到function1局部命名空间中的“b=a+1”,然后再找到全局命名空间中的“a=1”,最后找到内置命名空间中的print将b的值打印出来。
function1()
结果:
2
2. 作用域
作用域就是一个 Python 程序可以直接访问命名空间的正文区域。在一个 python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:
- Local:在程序的最内层,包含局部变量,比如,一个函数的内部。
- Enclosing:包含了非局部(non-local)也非全局(non-global)的变量。比如,两个嵌套函数,函数(或类)A里面又包含了函数B,那么对于B中的名称来说 A中的作用域就为no-nlocal。
- Global:当前脚本的最外层,比如,当前模块的全局变量。
- Built-in: 包含了内建的变量/关键字等,比如,int。
3.异常
3.1 什么是异常?
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
3.2 异常处理
捕捉异常可以使用try/except语句。try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。如果你不想在异常发生时结束你的程序,只需在try里捕获它。
说明:
try的工作原理是:
当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
- 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
- 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息)。
- 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
语法:
try:
语句 # 正常的操作。
except name:
语句 # 如果在try部份触发了'name'异常,执行这块代码。
except name,数据:
语句 # 如果触发了'name'异常,获得附加的数据,执行这块代码。
else:
语句 # 如果没有异常执行这块代码
finally:
语句 # 无论有没有异常都会执行
举例:
list1 = [1,2,3,4,'5',6,7,8]
list2 = []
for i in range(len(list1)):
try:
list1[i]+=1
list2.append(list1[i])
print(list2)
except:
print('有异常发生')
结果:
[2]
[2, 3]
[2, 3, 4]
[2, 3, 4, 5]
有异常发生
[2, 3, 4, 5, 7]
[2, 3, 4, 5, 7, 8]
[2, 3, 4, 5, 7, 8, 9]
4.sorted函数
Tip:sort与sorted区别:
sort是应用在list上的方法,sorted可以对所有可迭代的对象进行排序操作。
list的sort方法返回的是对已经存在的列表进行操作,而内建函数sorted方法返回的是一个新的list,而不是在原来的基础上进行的操作。
语法:
sorted(iterable, key=None, reverse=False)
# iterable:可迭代对象。
# key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
# reverse:排序规则,reverse = True 降序 , reverse = False 升序(默认)。
举例:
1.对list进行排序
# 定义一个由0-7乱序组成的“test_list”。
test_list = [5, 7, 0, 6, 4, 2, 1, 3]
# 使用sorted()函数对“test_list”进行排序。
result_list1 = sorted(test_list)
result_list2 = sorted(test_list, reverse=True)
result_list3 = sorted(test_list, key=lambda x: x * -1)
# 打印、查看并理解三种排序的结果。
print(result_list1, result_list2, result_list3)
结果:
[0, 1, 2, 3, 4, 5, 6, 7] [7, 6, 5, 4, 3, 2, 1, 0] [7, 6, 5, 4, 3, 2, 1, 0]
2.对字典进行排序。
# 定义一个乱序的key值为0-5,value值为A-E的字典。
test_dict = {4: 'D', 2: 'B', 1: 'A', 5: 'E', 3: 'C'}
# 使用sorte()函数对“test_dict”进行排序,打印排序的结果。
print(sorted(test_dict))
print(sorted(test_dict, reverse=True))
结果:
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
5.pop函数
Python中pop()函数可用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
语法:
list.pop([index])
index:index为可选参数,用于表示要移除列表元素的索引值,不能超过列表总长度。
默认为index值为“-1”,即删除列表中的最后一个值。
举例:
# 定义一个由0-7组成的list。
numbers = [0, 1, 2, 3, 4, 5, 6, 7]
# 对list使用pop()函数,查看pop()的返回值以及pop()之后的list。
print(numbers.pop(), numbers)
结果:
7 [0, 1, 2, 3, 4, 5, 6]
# 定义一个由0-7组成的list。
numbers = [0, 1, 2, 3, 4, 5, 6, 7]
# 对list使用pop(2)函数,查看pop(2)的返回值以及pop(2)之后的list。
print(numbers.pop(2), numbers)
结果:
2 [0, 1, 3, 4, 5, 6, 7]
6.id函数
Python中id()函数可返回对象的唯一标识符,标识符是一个整数。CPython 中id()可用于获取对象的内存地址。
语法:
id(object)
# object:需要获取标识符的对象。
举例:
# 定义变量a,b,c。
a = 1
b = 2.0
c = '3.0'
# 查看变量a,b,c的标识符及变量类型。
print(id(a), type(a))
print(id(b), type(b))
print(id(c), type(c))
结果:
94219067450144 <class 'int'>
140242766393936 <class 'float'>
140242505218608 <class 'str'>
7.dir函数
Python中dir()函数不带参数时,可返回当前范围内的变量、方法和定义的类型列表;带参数时,可返回参数的属性、方法列表。如果参数包含方法dir(),该方法将被调用。如果参数不包含dir(),该方法将最大限度地收集参数信息。
语法:
dir(object)
# object:对象、变量、类型。
举例:
dir(list)
结果:
['__add__',
'__class__',
'__contains__',
'__delattr__',
'__delitem__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__getitem__',
'__gt__',
'__hash__',
'__iadd__',
'__imul__',
'__init__',
'__init_subclass__',
'__iter__',
'__le__',
'__len__',
'__lt__',
'__mul__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__reversed__',
'__rmul__',
'__setattr__',
'__setitem__',
'__sizeof__',
'__str__',
'__subclasshook__',
'append',
'clear',
'copy',
'count',
'extend',
'index',
'insert',
'pop',
'remove',
'reverse',
'sort']
8.help函数
Python中help()函数可用于查看函数或模块用途的详细说明。help()函数相当于一个内置的Python帮助手册,当我们遇到一些新的函数名称时,掌握好help()函数的使用可以让我们更快更清晰地理解Python里面这些新函数的作用。
语法:
help(object)
# object:需要查看详细说明信息的对象。
举例:
# 查看Python常用的内置函数的help信息,此处为查看关于str的详细说明。
help('str')
# 查看自定义列表“my_list”的help信息。此处查看list的详细说明,也可以直接用 help('list')
my_list = ['a', 'b', 'c', 'd', 'e']
help(my_list)
# 查看作用于自定义列表的内置函数的help信息。此处查看appdend()函数的详细说明,也可以直接用 help(list.append)
my_list = ['a', 'b', 'c', 'd', 'e']
help(my_list.append)
# 查看一些package的help()信息,比如下面代码可查看正则表达式详细说明,需要注意的是package名称外面要加英文状态下的单引号或双引号,也可以用 help("re")
help('re')
9.threading模块(了解)
threading,基于线程的并行,这个模块在较低级的模块 _thread (底层多线程 API)基础上建立较高级的线程接口。
该模块定义了以下函数:
threading.active_count() 返回当前存活的线程类 Thread 对象。返回的计数等于 enumerate() 返回的列表长度。
threading.current_thread() 返回当前对应调用者的控制线程的 Thread 对象。如果调用者的控制线程不是利用 threading 创建,会返回一个功能受限的虚拟线程对象。
threading.get_ident() 返回当前线程的 “线程标识符”。它是一个非零的整数。它的值没有直接含义,主要是用作 magic cookie,比如作为含有线程相关数据的字典的索引。线程标识符可能会在线程退出,新线程创建时被复用。
10.zipfile模块(了解)
ZIP 文件格式是一个常用的归档与压缩标准。 这个模块提供了创建、读取、写入、添加及列出 ZIP 文件的工具。 任何对此模块的进阶使用都将需要理解此格式,其定义参见 PKZIP 应用程序笔记。
此模块目前不能处理分卷 ZIP 文件。它可以处理使用 ZIP64 扩展(超过 4 GB 的 ZIP 文件)的 ZIP 文件。它支持解密 ZIP 归档中的加密文件,但是目前不能创建一个加密的文件。解密非常慢,因为它是使用原生 Python 而不是 C 实现的。
下面展示一下zipfile的几个常用函数:
ZipFile.close() 关闭归档文件。 你必须在退出程序之前调用 close() 否则将不会写入关键记录数据。
ZipFile.getinfo(name) 返回一个 ZipInfo 对象,其中包含有关归档成员 name 的信息。 针对一个目前并不包含于归档中的名称调用 getinfo() 将会引发 KeyError。
ZipFile.infolist() 返回一个列表,其中包含每个归档成员的 ZipInfo 对象。 如果是打开一个现有归档则这些对象的排列顺序与它们对应条目在磁盘上的实际 ZIP 文件中的顺序一致。
ZipFile.namelist() 返回按名称排序的归档成员列表。
*ZipFile.open(name, mode=‘r’, pwd=None, , force_zip64=False) 以二进制文件类对象的形式访问一个归档成员。 name 可以是归档内某个文件的名称也可以是某个 ZipInfo 对象。 如果包含了 mode 形参,则它必须为 ‘r’ (默认值) 或 ‘w’。 pwd 为用于解密已加密 ZIP 文件的密码。