当前位置: 首页 > news >正文

31天Python入门——第14天:异常处理

在这里插入图片描述

你好,我是安然无虞。

文章目录

    • 异常处理
      • 1. Python异常
      • 2. 异常捕获
        • try-except语句
        • 捕获所有的异常信息
        • 获取异常对象
        • finally块
      • 3. raise语句
      • 4. 自定义异常
      • 5. 函数调用里面产生的异常
      • 补充练习

在这里插入图片描述

异常处理

1. Python异常

Python异常指的是在程序执行过程中发生的错误或异常情况. 当代码遇到错误时, 会引发异常并中断程序的正常执行流程.

异常提供了一种机制来处理错误, 以便程序可以在错误发生时采取适当的行动, 而不会导致程序崩溃或产生意外结果.

在Python中, 异常是通过异常类表示的. 每个异常类都是Python内置的或自定义的, 用于表示特定类型的错误. 常见的内置异常类包括:

  • SyntaxError:语法错误, 通常是代码书写不正确.
  • NameError:名称错误, 尝试访问不存在的变量或函数.
  • TypeError:类型错误, 操作或函数应用于不兼容的数据类型.
  • ValueError:值错误, 当函数接收到不合法的值时引发.
  • ZeroDivisionError:零除错误, 尝试将一个数除以零.
  • Exception:所有内置异常类的基类, 即其他所有的异常都是基于它的.

除了这些内置异常类, Python还提供了许多其他的异常类, 用于特定的错误情况. 可以使用try-except语句来捕获和处理异常. 通过在try块中编写可能引发异常的代码, 并在except块中处理异常, 可以保护程序免受错误的影响(在程序出现异常时不会直接中断程序执行), 而是采取适当的措施来处理异常情况.

异常处理可以帮助我们提高程序的健壮性和容错能力, 使得程序能够更好地处理异常情况, 并给出恰当的反馈或采取相应的措施.

2. 异常捕获

try-except语句

在Python中, 我们使用try-except语句来捕获和处理异常. try块用于编写可能引发异常的代码, 而except块用于处理异常情况.

try:# 可能引发异常的代码块
except ExceptionType:# 处理异常的代码块
  • try块中的代码会按顺序执行, 如果发生异常, 则会跳转到匹配的except块.
  • except块中的代码会处理特定类型的异常, ExceptionType表示要捕获的异常类型.
  • 可以有多个except块, 每个块可以处理不同类型的异常, 或者使用一个块来处理多个异常类型.
def divide_numbers(a, b):result = a / bprint("result", result)divide_numbers(10, 2) # 5.0
divide_numbers(10, 0) # 触发除零异常, 程序中断, 后续代码都不会被执行 - 这样的话代码的容错能力很低
divide_numbers(9, 2)
divide_numbers(8, 2)
def divide_numbers(a, b):try:result = a / bprint("result", result)except ZeroDivisionError:print("0不能作为除数.")except TypeError:print("参数传递类型错误.")except Exception as e:print(f"程序出现了意外错误: 具体出错内容: {e}.")finally:print(f"{a}/{b}的结果计算完毕.")divide_numbers(10, 2) # 5.0
divide_numbers(10, 0) # 显示‘0不能作为除数’
divide_numbers(9, 2) # 4.5
divide_numbers(8, 2) # 4.0
捕获所有的异常信息
 # ---------方式一----------try:# 可能引发异常的代码块except:# 处理所有异常def divide_numbers(a, b):try:result = a / bexcept:print("程序出错了.")# ---------方式二----------# 根据基类Exception来捕获def divide_numbers(a, b):try:result = a / bexcept Exception:print("程序出错了.")
获取异常对象

在异常处理块中, 可以使用as关键字将异常信息赋给一个变量, 以便进一步处理或打印异常信息.

 try:# 可能引发异常的代码块except ExceptionType as e:# 处理异常, 并使用变量e访问异常信息def divide_numbers(a, b):try:result = a / bexcept Exception as e: # 注意: 根据基类Exception来捕获异常只能放在最后不能放在其他异常类之前print(f"程序出现了意外错误: 具体的出错内容: {e}")

else块

else块是try-except语句的可选部分, 用于指定在try块中的代码执行完毕且没有引发异常时要执行的代码. 如果在try块中发生了异常并被捕获, 则不会执行else块中的代码.

 try:# 可能引发异常的代码块except ExceptionType:# 处理异常的代码块else:# 在没有发生异常时执行的代码块, 发生异常时就不会执行

注意点: 在try里如果return了, 即使没有报错, 也不会执行else里的代码

 # 示例代码, 大家自己跑到pycharm里运行的试试.def test():try:# 执行一些操作result = 3return result  # 在这里返回结果,函数立即退出except ValueError:# 处理异常passelse:# 这里的代码不会执行print("This code will not be executed.")# 调用函数result = test()print(result)

使用 else 块可以提高代码的可读性和可维护性, 但并不是所有人都认同这种做法.有些开发者更倾向于只使用 try-except 块, 将异常处理的逻辑放在一起, 使代码更加紧凑.总之, 使用 try-else 结构是一种代码组织的选择, 而不是强制性的规范.在实际开发中, 我们应根据代码的需求、可读性和一致性等因素来决定是否使用 else

很多大牛在开发中几乎不使用 else, 因为对代码的可读性并没有多大的提升.

所以了解即可.

finally块

除了try-except语句, 还可以使用finally(可选的)块来执行无论是否发生异常都需要执行的代码. finally块中的代码在try块中的代码执行完毕后无论是否发生异常都会执行.

 try:# 可能引发异常的代码块except ExceptionType:# 处理异常的代码块finally:# 无论是否发生异常, 都会执行的代码块def divide_numbers(a, b):try:result = a / bprint("result", result)except ZeroDivisionError:print("0不能作为除数.")except TypeError:print("参数传递类型错误.")except Exception as e:print(f"程序出现了意外错误: 具体出错内容: {e}.")finally:print(f"{a}/{b}的结果计算完毕.")

由于finally块来执行无论是否发生异常都会执行的代码块, 所以经常用来处理资源回收.

try:# 没有使用with语句打开文件的话, 需要手动关闭文件f = open('./contact1.txt', 'r')f.close()
except FileNotFoundError:print("不存在此文件")# 上面的代码是有问题的
# 如果打开文件的时候出错了, 比如当前目录下没有这个文件就会导致异常
# 打开文件导致异常后就不会执行f.close()关闭文件
# 但是有一点还需要格外注意就是如果是由于没有找到这个文件触发异常就会在打开文件的时候触发异常然后直接跳到except FileNotFoundError执行后面的代码, 由于表达式的执行是先计算右边的值然后再将计算结果赋值给左边, 这里由于打开文件触发异常导致没有执行赋值语句, 所以此时f变量是不存在的, 后续调用f.close()是没有意义的.# 还有一种情况是, 如果打开文件没有问题, 但是在后续处理异常时出现问题
# 这个时候就可以使用finally来关闭文件
try:f = open('./contact.txt', 'r')content = f.read()# 后续处理# ...
except FileNotFoundError:print("不存在此文件")
except Exception:print("后续处理异常")
finally:f.close()
# 如果在函数体的try代码块中有return语句和finally, 它们的执行顺序是怎样的:
def divide_numbers(a, b):try:result = a / breturn resultexcept ZeroDivisionError:print("0不能作为除数.")except TypeError:print("参数传递类型错误.")except Exception as e:print(f"程序出现了意外错误: 具体出错内容: {e}.")finally:print(f"{a}/{b}的结果计算完毕.")res1 = divide_numbers(10, 2)# 执行结果
# 10/2的结果计算完毕.
# 5.0# 从上面的执行结果说明了:
# 即使在函数定义里的try代码块中使用了return语句还是会执行后面finally代码块中的内容

总结

异常通常用于处理意外或异常的情况, 即那些无法在代码中预测和处理的情况.
当你无法准确预测可能出现的错误或无法在当前上下文中处理错误时, 抛出异常是一种更合适的方式.
异常提供了一种机制, 让你能够在错误发生时终止当前的代码执行, 并将控制权交给上层代码或异常处理机制

3. raise语句

raise语句是 Python 中的一个关键字, 用于手动引发异常.(前面都是自动触发异常)
通过 raise 语句, 我们可以选择性地在代码中引发特定类型的异常, 并提供相应的错误信息.这样, 我们就能够在需要的时候中断程序的正常执行流程, 并进行适当的异常处理.

语法:

 raise [ExceptionType([args])]# ExceptionType 是要引发的异常类型.# args 是一个可选参数, 用于向异常类传递附加的信息.# 如果只写一个raise, 则会默认引发RuntimeError.# raise语句后的代码不会执行.(类似return)
def check_age(age):if age < 18:raise ValueError('年龄小于18岁, 不允许注册.') # 手动抛出异常else:# 注册代码如下:passprint('恭喜, 注册成功')try:age = int(input("请输入年龄:"))check_age(age)
except ValueError as e:print(e) # 可以把在上面的raise中指定的抛出异常的信息打印出来, 请细品raise的使用 - 可以Chat一下# 执行结果:
# 请输入年龄:17
# 年龄小于18岁, 不允许注册.

使用注意事项:

  1. 选择适当的异常类型:根据具体的情况, 选择合适的异常类型来反映错误的性质. Python 提供了许多内置的异常类, 如 ValueErrorTypeErrorFileNotFoundError 等, 可以根据需要选择合适的异常类或自定义异常类.
  2. 提供明确的错误信息:在引发异常时, 尽量提供清晰、明确的错误信息, 以便在程序出错时能够准确地定位和理解错误的原因.
  3. 在适当的位置引发异常:raise语句应该放置在程序逻辑中合适的位置, 以便在需要时引发异常.根据代码的要求, 可以在函数、方法或其他控制流结构中使用 raise 语句.
  4. 捕获和处理异常:使用 try-except 块捕获和处理引发的异常.根据具体的异常类型, 编写相应的错误处理代码, 以便优雅地处理异常情况.
  5. 避免滥用 raise 语句:raise 语句应该用于合适的情况, 不应该滥用.只有在必要的时候才使用 raise语句, 以避免引发不必要的异常.

4. 自定义异常

异常类型都是 继承自Exception的类,表示各种类型的错误.

我们也可以自己定义异常,比如我们写一个用户注册的函数, 要求用户输入的电话号码只能是中国的电话号码,并且电话号码中不能有非数字字符.

可以定义下面这两种异常类型:

# 异常对象,代表电话号码有非法字符
class InvalidCharError(Exception):pass# 异常对象,代表电话号码非中国号码
class NotChinaTelError(Exception):pass

定义了上面的异常,当用户输入电话号码时,出现相应错误的时候,我们就可以使用raise 关键字来抛出对应的自定义异常.

def  register():tel = input('请注册您的电话号码:')# 如果有非数字字符if not tel.isdigit(): raise InvalidCharError()# 如果不是以86开头,则不是中国号码if not tel.startswith('86'): raise NotChinaTelError()return teltry:ret = register()
except InvalidCharError:print('电话号码中有错误的字符')
except NotChinaTelError:print('非中国手机号码')

5. 函数调用里面产生的异常

请看下面这段代码:

def level_3():print ('进入 level_3')a = [0]b = a[1]print ('离开 level_3')def level_2():print ('进入 level_2')level_3()print ('离开 level_2')def level_1():print ('进入 level_1')level_2()print ('离开 level_1')level_1()print('程序正常退出')

运行该代码会得到类似下面的结果:

进入 level_1
进入 level_2
进入 level_3
Traceback (most recent call last):File "E:\err.py", line 18, in <module>level_1()File "E:\err.py", line 14, in level_1level_2()File "E:\err.py", line 9, in level_2level_3()File "E:\err.py", line 4, in level_3b = a[1]
IndexError: list index out of range

函数调用次序是这样的

主体部分调用 函数 level_1

函数level_1调用 函数level_2

函数level_2调用 函数level_3

大家注意:函数 level_3 中有个 列表索引越界的错误.

所以执行到该函数的时候,解释器报错了。它在终端上显示了错误代码的具体位置. 也就是:

File "E:\err.py", line 4, in level_3b = a[1]

大家可以发现,上面还有输出的信息,说明了这行引起异常的代码, 是怎样被 一层层 的调用进来的.

这就是函数调用栈的信息.

当异常在函数中产生的时候,解释器会终止当前代码的执行, 查看当前函数是否 声明了该类型异常的 except 处理,如果有,就执行, 随后继续执行代码.

如果当前函数没有 声明了该类型异常的处理, 就会中止当前函数的执行,退出到调用该函数的上层函数中, 查看上层是否有 声明了该类型异常的 except 处理. 如果有,就执行该异常匹配处理. 随后继续执行代码.

如果上层函数也没有 该类型异常的匹配处理, 就会到继续到再上层的函数查看是否有 该类型异常的匹配处理.

如此这般,直到到了最外层的代码. 如果依然没有 声明了该类型异常处理,就终止当前代码的执行.

补充练习

案例: 模拟用户名校验.

def check_username(username):"""1. 长度不能小于5.2. 只能包含字符.3. 禁止使用系统用户名. admin, root.:param username: 传入的用户名.:return: None."""if username in ['admin', 'root']:raise ValueError('禁止使用系统用户名')if len(username) < 5:raise ValueError('用户名长度小于5')if not username.isalpha():raise ValueError('用户名只能包含字符')# 如果上面的3个判断都没进, 就会走到这里.print(f'{username}校验成功.')try:username = input("请输入用户名:")check_username(username)
except ValueError as e:print(e)
"""
对之前写的通讯录加上异常处理机制 使用异常捕获完善. 使其健壮性更强.
1. 如果用户输入了我们规则之外的指令. '1 2 3 4 5'以外的. 应该如何处理.
2. 读写我们上节课使用的'r+', 实际上读跟写要分离开, 才是最好的.
3. 若是我们本地没有通讯录文件的时候, 第一次读取, 会出错, 如何处理.
4. 删除联系人时, 如果用户输入错了想要删除的人, 如想要删除'张', 输入成了'刘', 容易出现误删, 而且会出现删除通讯录里不存在的人. 应该如何处理.
5. 手机号是不存在字母的, 如果用户输入有字母的话, 应该如何处理.
"""
import jsondef read_file():try:with open("./contact.txt", 'r', encoding='utf8') as f:content = f.read()return contentexcept FileNotFoundError:return Falsedef write_file(content):with open("./contact.txt", 'w', encoding='utf8') as f:f.write(content)def query_all():content = read_file()if content:# 如果存在, 就要展示所有的联系人.try:json_data = json.loads(content)if not json_data:print(f'该通讯录目前没有联系人, 请先添加联系人')returnexcept json.decoder.JSONDecodeError:print('系统出错, 稍后在尝试.')# 给开发人员发出提醒. 赶紧去修复.returnelse:print('为您查询到的所有联系人如下:')for key, val in json_data.items():print(f'{key}: {val}')else:print(f'该通讯录目前没有联系人, 请先添加联系人')def query_contact():name = input("请输入想要查询的联系人姓名:")content = read_file()if content:# 如果存在, 就要做查询操作.json_data = json.loads(content)phone = json_data.get(name)print(f'为您查询到的指定联系人{name}的电话是: {phone}')else:print(f'未找到指定联系人: {name}')def del_contact():name = input("请输入想要删除的联系人姓名:")content = read_file()if content:# 如果存在, 就要做删除操作.res = input(f"是否确认删除联系人; {name}. y/n?")if res.lower() == 'y':json_data = json.loads(content)# pop_value = json_data.pop(name, None)try:json_data.pop(name)except KeyError:print('没有找到指定的联系人.')returnwrite_file(json.dumps(json_data, ensure_ascii=False))print(f'删除{name}成功')else:print('已取消删除操作')else:# 如果不存在, 就没办法删了.print(f'未找到指定联系人: {name}')def add_contact():name = input("请输入联系人姓名:")phone = input("请输入联系人电话:")try:int(phone)except ValueError:print('您输入的手机号并不是纯数字的. 请重新添加')returncontact_dict = {name: phone}content = read_file()if content:json_data = json.loads(content)json_data.update(contact_dict)else:json_data = contact_dictwrite_file(json.dumps(json_data, ensure_ascii=False))print(f'添加{name}成功')def menu():print("欢迎使用通讯录管理系统")print("------welcome-----")print("菜单选项:")print("1. 添加联系人.")print("2. 删除联系人.")print("3. 查询指定联系人.")print("4. 查看所有的联系人.")print("5. 退出通讯录.")while True:try:choice = int(input("请输入您想要操作的选项:"))except ValueError:print('请输入1-2-3-4-5的对应指令.')continueif choice == 1:add_contact()elif choice == 2:del_contact()elif choice == 3:query_contact()elif choice == 4:query_all()elif choice == 5:print('已退出通讯录管理系统')breakelse:print('请输入1-2-3-4-5的对应指令.')menu()
遇见安然遇见你,不负代码不负卿。
谢谢老铁的时间,咱们下篇再见~

相关文章:

31天Python入门——第14天:异常处理

你好&#xff0c;我是安然无虞。 文章目录 异常处理1. Python异常2. 异常捕获try-except语句捕获所有的异常信息获取异常对象finally块 3. raise语句4. 自定义异常5. 函数调用里面产生的异常补充练习 异常处理 1. Python异常 Python异常指的是在程序执行过程中发生的错误或异…...

Linux使用集群服务器查看已安装conda环境,且环境名无显示、系统环境混乱等问题

一、问题 在使用集群服务器前可以查看导入&#xff0c;module load不需要安装。我都是自己重新下载Anaconda3-2024.10-1-Linux-x86_64.sh&#xff0c;然后安装&#xff0c;导致混乱。下面是情况 1.创建的环境名跑到目录下了 2.多个base,且有个base无显示 二、解决办法 1.删…...

【Linux】B站黑马程序视频学习笔记(一)

一、Linux内核与发行版 注意&#xff1a;下图程序指向内核的箭头用的是“调用”&#xff0c;内核指向硬件用的是“调度”。 Linux内核代码下载网站&#xff1a;https://www.kernel.org/ 二、虚拟机-VMware 学习Linux可以借助虚拟机&#xff08;其使用到的CPU、内存、硬盘都是…...

HarmonyOS NEXT——【鸿蒙原生应用加载Web页面】

鸿蒙客户端加载Web页面&#xff1a; 在鸿蒙原生应用中&#xff0c;我们需要使用前端页面做混合开发&#xff0c;方法之一是使用Web组件直接加载前端页面&#xff0c;其中WebView提供了一系列相关的方法适配鸿蒙原生与web之间的使用。 效果 web页面展示&#xff1a; Column()…...

【软件工程】习题及答案

目录 第一章 习题第一章 习题答案第二章 习题第二章 习题答案第三章 习题第三章 习题答案第四章 习题第四章 习题答案第五章 习题第五章 习题答案第六章 习题第六章 习题答案第七章 习题第七章 习题答案 第一章 习题 一、选择题 1&#xff0e;关于引起软件危机的原因&#xff…...

css选择最后结尾的元素DOM

前言 选中最后一个元素&#xff0c;实际使用非常频繁。 解决方案 使用 CSS 提供的选择器&#xff0c;即可完成。 如下代码示例&#xff0c;两种选择器均可实现。 <p>...</p>p:last-child{ background:#ff0000; }p:nth-last-child(1){background:#ff0000; }p&…...

【AI论文】挑战推理的边界:大型语言模型的数学基准测试

摘要&#xff1a;近年来&#xff0c;大型推理模型的迅猛发展导致现有用于评估数学推理能力的基准测试趋于饱和&#xff0c;这凸显出迫切需要更具挑战性和严谨性的评估框架。为填补这一空白&#xff0c;我们推出了OlymMATH&#xff0c;这是一项全新的奥林匹克级数学基准测试&…...

使用 Python包管理工具 uv 完成 Open WebUI 的安装

uv 是一个极其快速的 Python 包安装器和解析器&#xff0c;用 Rust 编写&#xff0c;旨在作为 pip 和 pip-tools 工作流的替代品 使用 uv 安装&#xff08;推荐&#xff09; macOS/Linux&#xff1a; curl -LsSf https://astral.sh/uv/install.sh | shWindows&#xff1a; po…...

【区块链安全 | 第三篇】主流公链以太坊运行机制

文章目录 1. 以太坊账户类型2. 以太坊网络架构2.1 节点类型2.2 交易流程 3. 共识机制4. Gas 机制4.1 Gas 计算方式4.2 以太坊 EIP-1559 交易机制 5. EVM&#xff08;以太坊虚拟机&#xff09;5.1 EVM 结构5.2 EVM 指令5.3 EVM 运行机制 6. 智能合约7. ERC 代币标准7.1 ERC-207.…...

C# 字符串(String)

C# 字符串&#xff08;String&#xff09; 引言 在C#编程语言中&#xff0c;字符串&#xff08;String&#xff09;是处理文本数据的基础。字符串是字符的有序集合&#xff0c;用于存储和处理文本信息。C#的字符串类型是System.String&#xff0c;它是一个引用类型&#xff0…...

Unity Shader 学习18:Shader书写基本功整理

1. Drawer [HideInInspector]&#xff1a;面板上隐藏[NoScaleOffset]&#xff1a;隐藏该纹理贴图的TillingOffset[Normal]&#xff1a;检查该纹理是否设为法线贴图[HDR]&#xff1a;将颜色类型设为高动态范围颜色&#xff08;摄像机也要开启HDR才有效果&#xff09;[PowerSlid…...

构建第一个SpringBoot程序

第一种方式&#xff1a; 注&#xff0c;构建过程中一定要联网 new module -->选择spring Initializr 选择Web --> 勾选Spring Web --> create 构建好的项目如下 这里的 .mvn .git* HELP.md mvnw* 都可以删除 编辑好controller 之后 点击即可运行第一个springbo…...

Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器

JVM是Java高级部分&#xff0c;深入理解程序的运行及原理&#xff0c;面试中也问的比较多。 JVM是Java程序运行的虚拟机环境&#xff0c;实现了“一次编写&#xff0c;到处运行”。它负责将字节码解释或编译为机器码&#xff0c;管理内存和资源&#xff0c;并提供运行时环境&a…...

使用飞书API自动化更新共享表格数据

飞书API开发之自动更新共享表格 天马行空需求需求拆解1、网站数据爬取2、飞书API调用2.1 开发流程2.2 创建应用2.3 配置应用2.4 发布应用2.5 修改表格权限2.6 获取tenant_access_token2.7 调用API插入数据 总结 天马行空 之前一直都是更新的爬虫逆向内容&#xff0c;工作中基本…...

C++中ShellExecute函数使用方法说明,如果一开始参数为隐藏,后面还能再显示出来吗

文章目录 一、ShellExecute基础用法函数原型关键参数 nShowCmd示例代码&#xff1a;启动程序并隐藏窗口 二、隐藏后能否重新显示窗口直接答案 三、实现隐藏后显示窗口的步骤1. 获取目标窗口句柄2. 显示窗口 四、完整流程示例五、注意事项六、总结 在C中使用ShellExecute函数时&…...

MySQL的多表查询

我们之前在讲解SQL语句的时候&#xff0c;讲解了DQL语句&#xff0c;也就是数据查询语句&#xff0c;但是之前讲解的查询都是单表查询&#xff0c;而本章节我们要学习的则是多表查询操作&#xff0c;主要从以下几个方面进行讲解。 5.1 多表关系 项目开发中&#xff0c;在进行…...

(UI自动化测试web端)第二篇:元素定位的方法_css定位之层级选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写&#xff1f; 文章介绍了第五种写法&#xff0c;层级选择器 &#xff0c;你要根据网页中的实际情况来判断自己到底要用哪一种方法来进行元素定位。每种方法都要多练习&#xff0c;全都熟了之后你在工作当中使…...

《Python Web部署应知应会》No2:如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务

《Python Web部署应知应会》No2&#xff1a;如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务&#xff08;上&#xff09; 摘要&#xff1a; 在 FastAPI 和 OLLAMA 架构中实现高并发 AI 推理服务&#xff0c;并优化性能指标采集和缓存策略&#xff0c;可以充分利用 asy…...

【LeetCode 题解】算法:8.字符串转换整数(atoi)

一、问题描述 在 LeetCode 的算法题库里&#xff0c;有这样一道题目&#xff0c;要求我们实现一个名为 myAtoi(string s) 的函数&#xff0c;其功能是将给定的字符串转换为一个 32 位有符号整数。具体的转换规则如下&#xff1a; 处理步骤 剔除前导空格&#xff1a;读取字符串…...

Uni-app页面信息与元素影响解析

获取窗口信息uni.getWindowInfo {pixelRatio: 3safeArea:{bottom: 778height: 731left: 0right: 375top: 47width: 375}safeAreaInsets: {top: 47, left: 0, right: 0, bottom: 34},screenHeight: 812,screenTop: 0,screenWidth: 375,statusBarHeight: 47,windowBottom: 0,win…...

飞书电子表格自建应用

背景 coze官方的插件不支持更多的飞书电子表格操作&#xff0c;因为需要自建应用 飞书创建文件夹 创建应用 开发者后台 - 飞书开放平台 添加机器人 添加权限 创建群 添加刚刚创建的机器人到群里 文件夹邀请群 创建好后&#xff0c;就可以拿到id和key 参考教程&#xff1a; 创…...

《云原生安全攻防》-- K8s容器安全:权限最小化与SecurityContext

一旦容器被入侵&#xff0c;攻击者就可以获取到容器的权限&#xff0c;所以&#xff0c;容器运行过程中&#xff0c;我们首先需要考虑的是容器的权限问题。 在本节课程中&#xff0c;我们将重点介绍权限最小化以及如何使用SecurityContext来管理容器的权限。 在这个课程中&…...

uniapp中的流式输出

一、完整代码展示 目前大多数的ai对话都是流式输出&#xff0c;也就是对话是一个字或者多个字逐一进行显示的下面是一个完整的流式显示程序&#xff0c;包含的用户的消息发出和ai的消息回复 <template><view class"chat-container"><view class&quo…...

PipeWire 音频设计与实现分析一——介绍

PipeWire 是一个基于图的媒体处理引擎&#xff0c;一个可以运行多媒体节点图的媒体服务器&#xff0c;是 Linux 的音频/视频总线&#xff0c;它管理 Linux 系统中&#xff0c;不同应用程序对音频和视频设备的共享访问。它提供了一个本地客户端音频 API&#xff0c;但也提供兼容…...

MVC 文件夹:架构之美,开发之魂

MVC 文件夹&#xff1a;架构之美&#xff0c;开发之魂 引言 在软件开发领域&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;架构模式已经成为了一种广泛应用的架构设计理念。它将应用程序分为三个核心部分&#xff1a;模型&#xff08;Model&#xff09;、视图…...

IO模型之于并发编程模型、并发模型之于架构模式

一、并发编程模型主要包括以下几种‌&#xff1a; ‌多进程模型‌&#xff1a;利用操作系统的进程模型来实现并发。每个用户请求接入时都会创建一个进程&#xff0c;适用于I/O密集型任务。缺点是创建进程的开销高&#xff0c;且上下文切换的开销也大。典型应用如Apache Web Ser…...

Postman 7.3.5 旧版下载指南(Win64)及注意事项

Postman-win64-7.3.5-Setup 是 Postman 的一个旧版本&#xff08;2019年发布&#xff0c;适用于 Windows 64位系统&#xff09;。以下是相关信息和建议&#xff1a; 1. Postman 7.3.5 版本说明 功能&#xff1a;用于 API 开发、测试和协作。 系统要求&#xff1a;Windows 64位…...

​Flink/Kafka在python中的用处

一、基础概念 1. ​Apache Kafka 是什么&#xff1f; ​核心功能&#xff1a;Kafka 是一个分布式流处理平台&#xff0c;主要用于构建实时数据管道和流式应用程序。​核心概念&#xff1a; ​生产者&#xff08;Producer&#xff09;​&#xff1a;向 Kafka 发送数据的程序。…...

【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望

【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望 #微服务实战 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事务 #Seata #ServiceMesh #总结 #SpringCloud #SpringBoot 系列终章&#xff1a;经过前九篇 [【深度 Mape 系列】] 的系统学习…...

轻松理解Python装饰器:从基础到应用

一、为什么需要装饰器 想象一下&#xff0c;你写了很多函数来完成不同的任务&#xff0c;突然有个新需求&#xff1a;在每个函数执行前打印一条“函数开始执行”的消息&#xff0c;执行后打印“函数执行结束”。如果没有装饰器&#xff0c;你就得在每个函数里手动添加这两条打…...

RabbitMQ 技术详解:异步消息通信的核心原理与实践

这里写目录标题 RabbitMQ 技术详解&#xff1a;异步消息通信的核心原理与实践一、RabbitMQ 本质剖析核心架构组件 二、核心功能与应用场景主要作用典型应用场景 三、工作流程深度解析消息传递流程关键协议机制 四、Java 实现示例1. 依赖配置&#xff08;Maven&#xff09;2. 消…...

MySQL-- 多表查询的分类,SQL92与SQL99,7种JOIN的实现,SQL99语法的新特性

目录 一&#xff0c;多表查询的分类 角度1&#xff1a;等值连接 vs 非等值连接 角度2&#xff1a;自连接 vs 非自连接 角度3&#xff1a;内连接 vs 外连接 二&#xff0c;SQL92语法实现内连接&#xff1a;见上&#xff0c;略SQL92语法实现外连接&#xff1a;使用 -…...

Selenium文件上传

在 Web 自动化测试中,文件上传是一项常见的任务。不同的网站和前端技术可能导致上传方式有所不同,因此需要采用不同的方法进行处理。 方法 1:使用 send_keys() 直接上传(最常用) 适用场景: 页面中 有标准的 <input type="file"> 标签。 不需要弹出 Wind…...

getID3获取本地或远程视频时长

音频文件也可使用&#xff0c;使用ffmeg安装太复杂了 附ffmpeg方式&#xff1a;centos下安装ffmpeg_yum安装ffmpeg-CSDN博客 使用composer先安装 composer require james-heinrich/getid3 获取本地视频 //获取本地视频$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…...

OpenAI流式解析

OpenAI 流式的代码&#xff1a; 首选一般请使用os.getenv 去读环境变量的内容 注意使用pip install python-dotenv 的安装方法 load_dotenv 是这个库提供的一个函数&#xff0c;用于读取 .env 文件并将其中定义的键值对设置为系统的环境变量。 默认情况下&#xff0c;load_…...

在Trae中设置Python解释器版本

Python 是一种广泛使用的高级编程语言&#xff0c;因其简洁易读的语法和强大的功能而备受欢迎。随着 Python 的不断发展&#xff0c;多个版本相继发布&#xff0c;每个版本都带来了新特性和改进。然而&#xff0c;这也带来了一些问题&#xff0c;比如不同的工程&#xff0c;需要…...

第 6 章:优化动态分配内存的变量_《C++性能优化指南》_notes

优化动态分配内存的变量 第六章核心知识点详解总结第六章 动态内存优化 重点难点梳理 一、多选题&#xff08;每题至少2个正确答案&#xff09;二、设计题答案与详解多选题答案设计题答案示例 第六章核心知识点详解 动态内存分配的开销 知识点&#xff1a;动态内存分配需要调用…...

图像数据增强教程:为目标检测任务准备数据

目录 一、简介 二、代码结构 三、环境要求 四、数据增强类 4.1 调整增强概率和参数 4.2 增强方法参数 五、数据增强主函数 六、主函数 效果展示 完整代码 一、简介 在目标检测任务中&#xff0c;数据增强是一种关键技术&#xff0c;通过对原始图像应用多种变换来增加…...

Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能

Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具&#xff0c;帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API&#xff0c;或者叫做一个工具类&#xff0c;包含一系列静态…...

HarmonyOS WebSocket全场景应用开发深度解析

注&#xff1a;适用版本&#xff08;Harmony OS NEXT / 5.0 / API 12 &#xff09; 一、最终效果预览 二、基础代码结构 Entry Component struct ChatApp {State messages: Message[] [] // 所有聊天记录State inputText: string "" // 输入框内容State isCon…...

JCRQ1河马算法+消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测

JCRQ1河马算法消融实验&#xff01;HO-CNN-LSTM-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法消融实验&#xff01;HO-CNN-LSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-LSTM-Attention、CNN-LSTM-Attent…...

ubuntu 安装 postgresql

在 Ubuntu 系统中安装 PostgreSQL 的步骤如下&#xff1a; 步骤 1&#xff1a;更新软件包列表 sudo apt update步骤 2&#xff1a;安装 PostgreSQL Ubuntu 默认仓库包含 PostgreSQL&#xff0c;直接安装&#xff1a; sudo apt install postgresql postgresql-contrib -ypost…...

深入实践:基于WebSocket的全球化金融数据实时对接方案。 马来西亚、印度、美国金融数据API

深入实践&#xff1a;基于WebSocket的全球化金融数据实时对接方案 在全球金融市场中&#xff0c;实时数据的高效获取与处理是量化交易、行情监控等场景的核心能力。本文将以技术实践为核心&#xff0c;详细解析如何通过WebSocket技术实现美国、印度、马来西亚等多国金融数据&a…...

深度学习处理时间序列(5)

Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过&#xff0c;二者有一点小区别&#xff1a;SimpleRNN层能够像其他Keras层一样处理序列批量&#xff0c;而不是像NumPy示例中的那样只能处理单个序列。也就是说&#xff0c;它接收形状为(batch_si…...

Linux: 进程间通信

目录 一 前言 二 进程间通信目的 三 进程间通信方法 四 管道通信 1. 进程如何通信 2.管道概念 2.1匿名管道 2.2 匿名管道对多个进程的控制 2.3 命名管道 2.4 命名管道原理 一 前言 在我们学习进程的时候&#xff0c;我们知道正是因为程序地址空间的存在&#xff…...

为什么idea显示数据库连接成功,但操作数据库时,两边数据不同步

今日份小bug又叕又来了&#xff01; 一、原因分析 1. 未提交的事务 - IDEA 中执行了修改操作但未提交事务 - 其他客户端有未提交的修改 2. 连接隔离级别问题 - 不同连接使用了不同的事务隔离级别 - 读未提交(READ UNCOMMITTED)导致看到未提交数据 3. 多客户端同时操作…...

VMware中新建Ubuntu虚拟机系统,并安装Anaconda

详细介绍 Ubuntu18.04版本的安装Anaconda的安装 Ubuntu20.04版本的安装给出其他参考 安装Ubuntu18.04 新建虚拟机 如果不习惯图文形式的&#xff0c;也可参考该up主的环境安装分享&#xff0c;和我如下记录有些不同&#xff0c;但不影响&#xff0c;大部分均一致。 …...

LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板

LangChain 基础系列之 Prompt 工程详解&#xff1a;从设计原理到实战模板 一、揭开 LangChain 的 “灵魂引擎”&#xff1a;Prompt 的核心作用 在 LangChain 构建的智能应用中&#xff0c;Prompt&#xff08;提示词&#xff09;堪称驱动大模型的 “神经中枢”。这个承载着任务…...

项目如何安装本地tgz包并配置局部registry

一、判断包来源是否正确 1. 检查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步骤&#xff1a; 1. 全局配置 如果你希望对所有项目生效&#xff0c;可以将这行配置添加到全局.npmr…...

unity客户端面试高频2(自用)

标题是我 1.构造函数为什么不能为虚函数&#xff1f;析构函数为什么要虚函数&#xff1f;2.C智能指针3.左值和右值完美转发 4.深拷贝与浅拷贝5.malloc VS new 你们知道吗 1.构造函数为什么不能为虚函数&#xff1f;析构函数为什么要虚函数&#xff1f; 构造函数不能定义为虚函…...