30.python的异常处理机制

  1. 语法
try:
    # 可能出现异常的代码
except 异常类型:
    # 异常处理
except 异常类型:
    # 异常处理
else:
    # 没有异常执行的代码
  1. 示例:实现两个整数的除法
try:
    a = int(input('请输入第一个整数:'))
    b = int(input('请输入第二个整数:'))

    result = a / b

except ZeroDivisionError:
    print('除数不能为0!')
except ValueError:
    print('只能输入数字')
else:
    print('结果为:', result)
  1. try...except...else结构:如果try块中没有抛出异常,则执行else块,否则执行except块
  2. try...except...else...finally结构:finally块无论是否发生异常都会被执行,常用来释放try块中申请的资源。
  3. python中常见的异常类型
    1. ZeroDivisionError:除零或者取模零
    2. IndexError:序列中不存在此索引
    3. KeyError:映射中没有这个键
    4. NameError:未声明对象或者属性
    5. SyntaxError:语法错误
    6. ValueError:无效的参数
  4. traceback模块:可以使用traceback模块打印异常信息
import traceback
try:
    print(1 / 0)
except:
    traceback.print_exc()

31.模块

1.模块的定义
  1. 在python中一个扩展名为.py的文件就是一个模块。在每个模块的定义中都包含一个记录模块名称的变量_name_。顶级模块(文件被当做脚本执行)的__name__变量的值为__main__。当python源文件被当做模块导入时:__name__等于模块名
#在自定义模块example.py中让其以主程序运行:右键,run example
if __name__ == '__main__':
    main()
2.模块的导入
  1. 模块的导入:使用import xxx方式进行导入时,其后面只能跟包名或者模块名;使用from...import可以导入模块名/函数名/属性名。这些方式只能导入模块的公有属性/类/函数
import 模块名称 [as 别名]
#将包导入后,解释执行当前包下的__init__.py文件
import 包名 

from 模块名称 import 函数/变量/类
#将某个模块中的公有函数,变量,类等全部导进来
from 模块名称 import *
from 包名 import 模块名
#如果包里还有包则
from 包名.子包名 import 模块名
  1. __all__属性:用于在当前模块中定义其他模块可以导入的属性/类/函数。不希望其他模块导入使用的属性/类/函数,则不定义在__all__属性中。
# 使用from xxx import *导入方式时,_func1和__func2函数在其他模块中可以使用
__all__ = ['_func1', '__func2']

def _func1():
    print("func1()")

def __func2():
    print("func2()")

# 使用from xxx import *导入方式时,func函数在其他模块中不能使用
# 但是可以通过from xxx import func的导入方式,在其他模块中使用func函数
def func():
    print("func()")

32.包

  1. python中的包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下。为了避免模块名冲突,引入了包。
    1. 包与目录的区别:包含_init_.py文件的目录称为包;而目录里通常不包含该文件。总之,包等同于包含_init_.py文件的目录,模块等同于python源文件。
  2. 模块的导入
import 包名.模块名
  1. python中常用的模块
    1. random模块:这个模块可以用于生成随机数,示例:
    import random
    
    # 使用默认种子生成[0,1)范围内的随机数
    random.seed()
    number = random.random()
    print(number)
    
    1. request模块这个模块可以用于向后端发送HTTP请求,示例
    import requests
    # 发送get请求
    status = requests.get('https://www.runoob.com/', verify=False)
    print(status.status_code) # 获取响应码
    print(status.text) # 返回响应体的内容
    
    1. operator模块:这个模块提供了和python内置的运算符功能一致的函数,示例如下
    import operator
    print(operator.contains("helloworld", "hello")) # True
    
    1. urllib库:这个库用于操作url,并对url的响应进行处理
    from urllib.request import urlopen
    results = urlopen("http://www.baidu.com/") # 返回一个HTTPResponse对象
    print(results.read()) # 读取响应体的内容
    print(results.getcode()) # 获取响应码
    
    
    # 解析网站根目录下的robots协议,这个协议指定了搜索引擎对网站的抓取规则
    import urllib.robotparser
    rp = urllib.robotparser.RobotFileParser()
    rp.set_url("https://www.baidu.com/robots.txt")
    rp.read()
    print(rp.can_fetch("*", "https://www.baidu.com/robots.txt"))  # False
    
    1. json模块:这个模块可以对json数据进行编解码
    2. threading/_thread模块:两者都和多线程相关。
      1. 创建线程
        1. 方式1:使用threading模块创建线程
        import threading
        
        class MyThread(threading.Thread):
            def __init__(self, threadId, threadName):
                threading.Thread.__init__(self)
                self.threadId = threadId
                self.threadName = threadName
            def run(self):
                print(f'线程id:{self.threadId},线程名称:{self.threadName}')
        
        
        t1 = MyThread(1, "thread-1")
        t2 = MyThread(2, "thread-2")
        
        t1.start()
        t2.start()
        
        t1.join()
        t2.join()
        
        1. 方式2:使用_thread模块的start_new_thread方法创建线程:
        import _thread
        
        def func():
            for i in range(10):
                print(i)
        tid = _thread.start_new_thread(func, ())
        print(tid)
        while 1:
            pass
        
      2. 线程同步:
        1. 方式1:使用互斥锁,通过threading.lock方法创建
    3. socket模块:这个模块用于网络编程
      1. 创建套接字:使用socket模块中的socket函数