Python灰帽编程——错误异常处理与面向对象
文章目录
- 错误异常处理与面向对象
- 1. 错误和异常
- 1.1 基本概念
- 1.1.1 Python 异常
- 1.2 检测(捕获)异常
- 1.2.1 try except 语句
- 1.2.2 捕获多种异常
- 1.2.3 捕获所有异常
- 1.3 处理异常
- 1.4 特殊场景
- 1.4.1 with 语句
- 1.5 脚本完善
- 2. 内网主机存活检测程序
- 2.1 scapy 模块
- 2.1.1 主要功能
- 2.1.2 scapy 安装
- 2.1.3 进入scapy 模块
- 2.1.4 简单使用
- 2.2 主机存活检测程序
- 3. 面向对象编程
- 3.1 类
- 3.1.1 创建类
- 3.1.2 \__init__ 方法
- 3.2 方法
- 3.2.1 绑定方法
- 3.3 继承
- 3.3.1 子类继承
- 3.3.2 方法重写
- 3.3.3 多重继承
- 3.3.4 静态方法和动态方法的区别
- 3.4 魔法函数
- 3.4.1 类和实例的内建函数
- 3.4.2 常用的魔法函数
- 3.5 私有化
错误异常处理与面向对象
1. 错误和异常
如果遇到了错误(异常),如何去处理?
1.1 基本概念
1.1.1 Python 异常
当程序运行时,因为遇到未知的错误而导致中止运行,便会出现Traceback 消息,打印异常。异常即是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。一般情况下,在Python 无法正常处理程序时就会发生一个异常。异常是Python 对象,表示一个错误。当Python 脚本发生异常时我们需要响应处理它,否则程序会终止执行。
| 异常 | 描述 |
|---|---|
| SyntaxError | 语法错误 |
| NameError | 未声明/初始化对象 |
| IndexError | 序列中没有此索引 |
| KeyboardInterrupt | 用户中断执行(Ctrl+C) |
| EOFError | 没有内建输入,到达EOF 标记(Ctrl+D) 不适用windows 系统 |
| IOError | 输入/输出操作失败 |
| ValueError | 当操作或函数接收到具有正确类型但值不适合的参数, 并且情况不能用更精确的异常,例如 IndexError来描述时将被引发。 |
| TypeError | 字符串与整数相加时触发。 |
1.2 检测(捕获)异常
如果一个语句发生了错误或异常,跳过该语句的执行,执行另外的语句。
1.2.1 try except 语句
尝试执行try 语句,如果遇到异常则执行except 语句。两个语句执行执行一个。
语法规则
try:pass # 监控这里的异常
except Exception[, reason]:pass # 异常处理代码
示例:
# 01 - 异常初探.pytry:username = input("Please input your name: ")print(f"Welcome, {username}")except:print("\nSomething Error!")
1.2.2 捕获多种异常
算命脚本:输入年龄,预测明年的年龄。
可以把多个except 语句连接在一起,处理一个try 块中可能发生的多种异常。
# 02 - 捕获多种异常.pybanner = '''
算命脚本
1. 预测年龄
2. 预测财运
3. 预测姻缘
'''print(banner)choice = input("Please input the number: ")
choice = int(choice)if choice != 1:print("好好学习...")exit()try:age = input("Please input your age: ")print(f"The next year your name: {int(age) + 1}")except ValueError:print("Please input a number!")except KeyboardInterrupt:print("\nCtrl + C")except:print("\nSomething Error!")
1.2.3 捕获所有异常
如果出现的异常没有出现在指定要捕获的异常列表中,程序仍然会中断。可以使用在异常继承的树结构中,BaseException 是在最顶层的,所以使用它可以捕获任意类型的异常。
except BaseException: # 捕获所有异常,相当于exceptprint("\nSomething Error!")
Pyhton 异常树
BaseException 所有异常的基类||+-- SystemExit 解释器请求退出||+-- KeyboardInterrupt 用户中断执行(通常是输入^C)||+-- GeneratorExit 生成器调用close();方法时触发的||+-- Exception 常规错误的基类,异常都是从基类Exception继承的。|+-- StopIteration 迭代器没有更多的值|+-- StandardError 所有的内建标准异常的基类| +-- BufferError 缓冲区操作不能执行| +-- ArithmeticError 所有数值计算错误的基类| | +-- FloatingPointError 浮点计算错误| | +-- OverflowError 数值运算超出最大限制| | +-- ZeroDivisionError 除(或取模)零 (所有数据类型)| +-- AssertionError 断言语句失败| +-- AttributeError 访问未知对象属性| +-- EnvironmentError 操作系统错误的基类| | +-- IOError 输入输出错误| | +-- OSError 操作系统错误| | +-- WindowsError (Windows) 系统调用失败| | +-- VMSError (VMS) 系统调用失败| +-- EOFError 没有内建输入,到达EOF 标记| +-- ImportError 导入模块/对象失败| +-- LookupError 无效数据查询的基类,键、值不存在引发的异常| | +-- IndexError 索引超出范围| | +-- KeyError 字典关键字不存在| +-- MemoryError 内存溢出错误(对于Python 解释器不是致命的)| +-- NameError 未声明/初始化对象 (没有属性)| | +-- UnboundLocalError 访问未初始化的本地变量| +-- ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象| +-- RuntimeError 一般的运行时错误| | +-- NotImplementedError 尚未实现的方法| +-- SyntaxError 语法错误| | +-- IndentationError 缩进错误| | +-- TabError Tab 和空格混用| +-- SystemError 一般的解释器系统错误| +-- TypeError 对类型无效的操作| +-- ValueError 传入无效的参数| +-- UnicodeError Unicode 相关的错误| +-- UnicodeDecodeError Unicode 解码时的错误| +-- UnicodeEncodeError Unicode 编码时错误| +-- UnicodeTranslateError Unicode 转换时错误|+-- Warning 警告的基类+-- DeprecationWarning 关于被弃用的特征的警告+-- PendingDeprecationWarning 关于特性将会被废弃的警告+-- RuntimeWarning 可疑的运行时行为(runtime behavior)的警告+-- SyntaxWarning 可疑的语法的警告+-- UserWarning 用户代码生成的警告+-- FutureWarning 关于构造将来语义会有改变的警告+-- ImportWarning 关于模块进口可能出现错误的警告的基类。+-- UnicodeWarning 有关Unicode警告的基类。+-- BytesWarning 有关字节警告相关的基类。
1.3 处理异常
try: # 尝试执行某个语句num = int(input("The number:"))
except BaseException: # 如果遇到异常,执行的语句print("something error!")
else: # 如果没有遇到异常,执行的语句print(num)
finally: # 不管是否遇到异常,都要执行的语句。print("This is finally")
- else 子句:在try 范围中没有异常被检测到时,执行else 子句。在else 范围中的任何代码运行前,try 范围中的所有代码必须完全成功。
- finally 子句:finally 子句是无论异常是否发生,是否捕捉都会执行的一段代码。比如获取用户的输入,写入文件,但是如果在获取数据过程中,发生了异常,就会导致整个脚本结束执行,文件也无法关闭了。为了解决这个问题,可以采用异常处理中的finally 子句,也就是说,无论语句是否正常执行,都需要关闭。
# 03 - 处理异常.pybanner = '''
算命脚本
1. 预测年龄
2. 预测财运
3. 预测姻缘
'''print(banner)choice = input("Please input the number: ")
choice = int(choice)if choice != 1:print("好好学习...")exit()try:age = input("Please input your age: ")age = int(age) except ValueError:print("Please input a number!")except KeyboardInterrupt:print("\nCtrl + C")except:print("\nSomething Error!")else:print(f"The next year your name: {age + 1}")finally:print("脚本执行结束,祝你好运!")
1.4 特殊场景
1.4.1 with 语句
with 语句是用来简化代码的。比如在将打开文件的操作放在with 语句中,代码块结束后,文件将自动关闭。用来简化文件操作的打开和关闭,其中closed 属性是判断文件是否被关闭的
>>> with open('foo.py') as f:
1.5 脚本完善
from pyfiglet import Figlet
from termcolor import colored, cprintf = Figlet(font='slant')
print('*' * 75)
print('-' * 75)
print(f.renderText('WuHu Exception'))
banner = '''
算命脚本
1. 预测年龄
2. 预测财运
3. 预测姻缘
4. 退出脚本
'''
print(banner)
print('-' * 75)
print('*' * 75)choice = input("请输入你的选项: ")
choice = int(choice)if choice == 1:try: # 尝试执行某个语句age = int(input("Please input your age: "))except ValueError: # 遇到异常执行的语句cprint("\nPlease input a number!", "white", "on_red")except KeyboardInterrupt: # 遇到异常执行的语句cprint("\nCtrl + C", "white", "on_red")except: # 遇到异常执行的语句cprint("\nSomething Error!", "white", "on_red")else: # 如果没有遇到异常,执行的语句 cprint(f"\nThe next year your age: {int(age) + 1}", "white", "on_green")finally: # 无论是否遇到异常,都会执行的语句cprint("\n脚本执行完毕", "white", "on_green")
elif choice == 4:print("欢迎下次光临~")exit()
else:print("好好学习!")
2. 内网主机存活检测程序
2.1 scapy 模块
与scrapy 有非常大的区别。
scapy 是一个Python 的第三方模块,被称为“网络神器”。scapy 模块能够发送、捕获、分析和铸造网络数据包。
2.1.1 主要功能

2.1.2 scapy 安装
Windows 下安装scapy
python -m pip install scapy
Kali 中自带scapy 环境。
2.1.3 进入scapy 模块
┌──(ajest zh-CN)-[~]
└─$ sudo scapy aSPY//YASa apyyyyCY//////////YCa |sY//////YSpcs scpCY//Pp | Welcome to Scapyayp ayyyyyyySCP//Pp syY//C | Version 2.4.5AYAsAYYYYYYYY///Ps cY//S |pCCCCY//p cSSps y//Y | https://github.com/secdev/scapySPPPP///a pP///AC//Y |A//A cyP////C | Have fun!p///Ac sC///a |P////YCpc A//A | Craft packets before they craftscccccp///pSP///p p//Y | you.sY/////////y caa S//P | -- SocratecayCyayP//Ya pY/Ya |sY/PsY////YCc aC//Yp sc sccaCY//PCypaapyCP//YSs spCPY//////YPSps ccaacs using IPython 7.22.0
>>>
2.1.4 简单使用
构造数据包
>>> pkt = IP()/TCP()
>>> pkt.show()
###[ IP ]### version = 4ihl = Nonetos = 0x0len = Noneid = 1flags = frag = 0ttl = 64proto = tcpchksum = Nonesrc = 127.0.0.1dst = 127.0.0.1\options \
###[ TCP ]### sport = ftp_datadport = httpseq = 0ack = 0dataofs = Nonereserved = 0flags = Swindow = 8192chksum = Noneurgptr = 0options = ''
>>> pkt = IP(src = "192.168.1.11", dst = "192.168.1.1")/TCP()
>>> pkt.show()
###[ IP ]### version = 4ihl = Nonetos = 0x0len = Noneid = 1flags = frag = 0ttl = 64proto = tcpchksum = Nonesrc = 192.168.1.11dst = 192.168.1.1\options \
###[ TCP ]### sport = ftp_datadport = httpseq = 0ack = 0dataofs = Nonereserved = 0flags = Swindow = 8192chksum = Noneurgptr = 0options = ''>>>
发送数据包
| 发送数据包的函数 | 说明 |
|---|---|
| sr(pkt) | 发送数据包,接收所有返回包 |
| sr1(pkt) | 发送数据包,接收一个返回包 |
| send(pkt) | 发送数据包,不等待返回包 |
| srp(pkt) | 发送2 层数据包,等待回应 |
| sendp(pkt) | 发送2 层数据包,不等待返回包 |
>>> res = sr1(pkt)
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
>>>
解析:
-
Received 2 packets表示接收了2个包
-
got 1 answers表示响应了1个包
查看返回包
>>> res.show()
###[ IP ]### version = 4ihl = 5tos = 0x0len = 44id = 13990flags = frag = 0ttl = 255proto = tcpchksum = 0x46a4src = 10.9.21.1dst = 10.9.21.111\options \
###[ TCP ]### sport = httpdport = ftp_dataseq = 1510518667ack = 1dataofs = 6reserved = 0flags = SAwindow = 65535chksum = 0x4f9curgptr = 0options = [('MSS', 1460)]
###[ Padding ]### load = '\x00\x00'>>>
2.2 主机存活检测程序
# 04 - 内网主机存活检测程序.pyfrom scapy.all import *
from scapy.layers.inet import *
from termcolor import colored, cprintimport logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) network = "192.168.188."for host in range(1, 20):ip = f"{network}{host}"# print(f"[-] Trying: {ip}")# 创建数据包pkt = IP(src = "192.168.188.185", dst = ip)/ICMP()# 发送数据包res = sr1(pkt, timeout = 0.2, verbose = False)if res and res.type == 0:print(colored(f"\n{ip} is ALIVE!","green"))else:print(f"\n{ip} is NOT ALIVE!",end= "")
解析:
-
res = sr1(pkt, timeout = 0.2, verbose = False):sr1()函数将发送数据包并等待响应,然后返回第一个收到的响应数据包。如果在指定的超时时间内没有收到响应,则返回 None。并且禁用了详细输出。timeout = 0.2:设置的超时时间为0.2verbose = False:禁用了详细输出
-
logging:屏蔽信息模块。
-
logging.getLogger("scapy.runtime").setLevel(logging.ERROR):在scapy运行期间,只有ERROR才显示输出其他都不输出。
3. 面向对象编程
3.1 类
类是一类事物的统称,比如学生。对象就是类的实例化。
类有属性(变量),比如学生的姓名、性别、年龄、成绩等,也就是编程里面的变量。
类有方法(函数),比如学生的上课、下课等,也就是编程里面的函数。
3.1.1 创建类
类是一种数据结构,我们可以用它来定义对象,对象把数据值和行为特性融合在一起。
Python 使用 class 关键字来创建类:通常类名的第一个字母大写,推荐使用驼峰式命名法,单词首字母均大写。类有属性(变量)和方法(动作,函数)组成。
class ClassName(bases):'class documentation string' #'类文档字符串'class_suite # 类体
3.1.2 _init_ 方法
__init__() 是类的实例(对象)创建后第一个被调用的方法(自动被调用),通常被用来进行对象中属性(变量)的初始化。设置实例的属性可以在实例创建后任意时间进行,但是通常情况下优先在__init__() 方法中实现。
- 定义类型
- 实例化对象(创建一个对象)
- 初始化对象(第一次给对象属性赋值)
# 05 - __init__.pyclass Stu():def __init__(self, name, sex, age, score):self.name = nameself.sex = sexself.age = ageself.score = scorestu1 = Stu(name = "AJEST", sex = True, age = 24, score = 59.9)print(f"{stu1.name} 的成绩是{stu1.score}")
解析:
-
在 Python 类中,
self是一个约定俗成的名称也是一个特殊的参数,它表示类的实例(对象)本身。可以使用其他名称代替self,但强烈建议仍然使用self,这是因为self在Python社区中被广泛接受并被视为最佳实践。在类的方法中,使用self参数可以访问该对象的属性和方法。 -
在
__init__()方法中,self参数指向正在创建的对象。通过使用self参数,我们可以将传递给__init__()方法的参数的值分配给对象的属性,以便在整个类的其他方法中使用。 -
self.name = name表示将传递给构造函数的name参数的值赋给对象的name属性。类似地,self.sex = sex、self.age = age和self.score = score将传递的参数值分别赋给对象的sex、age和score属性。
3.2 方法
3.2.1 绑定方法
方法仅仅是类内部定义的函数,方法只有在其所属的类拥有实例时,才能被调用;任何一个方法定义中的第一个参数都是变量self,它表示调用此方法的实例对象就是自己。
类中的方法,也就是类中定义的函数,这个函数第一个参数永远是self,表示自己。
# 06 - 绑定方法.pyimport timeclass Stu():def __init__(self, name, sex, age, score):self.name = nameself.sex = sexself.age = ageself.score = scoredef getSocre(self):print(f"{self.name} 的成绩是{self.score}")def goodGoodStudy(self):print("好好学习中...")time.sleep(10)self.score += 0.1stu1 = Stu(name = "AJEST", sex = True, age = 24, score = 59.9)
stu2 = Stu(name = "HMM", sex = True, age = 24, score = 89.9)# 调用方法
stu2.getSocre()
stu2.goodGoodStudy()
stu2.getSocre()
解析:
- 在
getSocre()方法中,我们使用self.name来访问对象的name属性。这里的self指的就是调用getSocre()方法的对象本身。
3.3 继承
3.3.1 子类继承
继承描述了基类(祖先)的属性如何遗传给派生类(子孙),子类可以继承它的基类的任何属性,不管是数据属性还是方法。
# 34 - 子类继承.pyimport timeclass Kid():def __init__(self, name = "", sex = "", age = ""):self.name = nameself.age = ageself.sex = sexdef play(self):print("玩游戏中...")class Stu(Kid):def __init__(self,name = "", sex = "", age = "", score = ""):Kid.__init__(self, name, sex, age)self.score = scoredef get_score(self):print(f"{self.name} 的成绩是{self.score}")def good_good_study(self):print("好好学习中...")time.sleep(10)self.score += 0.1stu1 = Stu(name = "AJEST", sex = True, age = 24, score = 59.9)
stu2 = Stu(name = "LL", sex = True, age = 25, score = 49.9)
stu3 = Stu(name = "HMM", sex = True, age = 23, score = 99.9)
stu4 = Stu(name = "LH", sex = True, age = 24, score = 79.9)stu1.play()
3.3.2 方法重写
如果子类中有和父类同名的方法,父类方法将被覆盖;如果需要访问父类的方法,则要调用一个未绑定的父类方法,明确给出子类的实例。
# 08 - 方法重写.pyimport timeclass Kid():def __init__(self, name, sex, age):self.name = nameself.sex = sexself.age = agedef play(self):print("玩游戏中...")class Stu(Kid):def __init__(self, name, sex, age, score):Kid.__init__(self, name, sex, age)self.score = scoredef getSocre(self):print(f"{self.name} 的成绩是{self.score}")def goodGoodStudy(self):print("好好学习中...")time.sleep(10)self.score += 0.1def play(self):print("玩王者荣耀中...")time.sleep(2)self.score -= 10stu1 = Stu(name = "AJEST", sex = True, age = 24, score = 59.9)
stu2 = Stu(name = "HMM", sex = True, age = 24, score = 89.9)stu2.getSocre()
stu2.play()
stu2.getSocre()
stu2.goodGoodStudy()
stu2.goodGoodStudy()
stu2.getSocre()
stu2.play()
stu2.getSocre()
说明:
Kid.__init__(self, name, sex, age)是在Stu类的构造函数中调用了Kid类的构造函数来初始化从Kid类继承的属性。- 在Python中,当一个类继承自另一个类时,子类可以通过调用父类的构造函数来初始化继承的属性。在这个例子中,
Stu类继承自Kid类,因此在Stu类的构造函数中,我们需要先调用Kid类的构造函数来初始化继承的属性。
3.3.3 多重继承
需要注意的是,Python支持单继承和多继承。单继承指一个类只能继承自一个父类,而多继承指一个类可以同时继承自多个父类。在多继承的情况下,子类可以获得多个父类的属性和方法,但需要注意避免出现命名冲突和混淆的情况。
# 09 - 多重继承.pyclass A():def a():print("This is function A!")class B():def b():print("This is function B!")class C(A, B):passC.a()
C.b()
说明:
- 在Python中,
pass是一个空语句,不执行任何操作。当你在代码中遇到需要写一段代码但又暂时没有实现的情况时,可以使用pass来占位,使得代码结构完整而没有语法错误。
# 定义食物类
class Food():def __init__(self,name,price):self.name = nameself.price = price# 定义蔬菜类
class Vegetable(Food):def __init__(self,name,price,place):Food.__init__(self,name,price)self.place = place# 定义肥料类
class Manure():def __init__(self,flag): self.flag = flag # 定义西红柿类
class Tomato(Vegetable,Manure):def __init__(self, name, price, place,colour,flag):Vegetable.__init__(self, name, price, place)Manure.__init__(self,flag)self.colour = colourdef wuhu(self):print(f"{self.name}价格为{self.price},产地是{self.place},颜色是{self.colour}")print(f"添加肥料{self.flag}")tomato = Tomato("西红柿🍅","23💴","北京","红色🔴","💩")
tomato.wuhu()
3.3.4 静态方法和动态方法的区别
静态方法和动态方法的区别:
-
静态方法:静态方法是属于类的方法,它与实例无关。它们不需要访问或修改类的实例属性,也没有
self参数。静态方法可以被类本身直接调用,而不需要创建类的实例。静态方法通常用于执行与类关联但不依赖于实例的操作,或者在方法内部不需要访问实例属性的情况下。 -
动态方法:动态方法是属于实例的方法,它需要通过创建类的实例来调用。动态方法的第一个参数通常是
self,它代表实例本身。通过这个参数,动态方法可以访问和修改实例的属性。动态方法定义在类的内部,可以通过实例访问,也可以通过类访问。
3.4 魔法函数
3.4.1 类和实例的内建函数
| 函数 | 作用 |
|---|---|
| issubclass() | 判断一个类是另一个类的子类或子孙类 |
| isinstance() | 判定一个对象是否是另一个给定类的实例 |
| hasattr() | 判断一个对象是否有一个特定的属性 |
| getattr() | 获得一个对象的属性值 |
| setattr() | 设置一个对象的属性 |
| delattr() | 删除一个对象的属性 |
3.4.2 常用的魔法函数
魔法函数是系统自带的,会在“恰当”的时候自动调用。
# 10 - 魔术方法.pyclass Test():def __init__(self):print("Function __init__ is called!")def __str__(self):return "Why print(self)?"def __call__(self):print("Why call me like Function?")t = Test()print(t)t()
解析:
- _init_:该函数会在创建对象的时候调用。
- _str_:该函数用于返回对象的字符串表示,当尝试将对象转换为字符串时(例如通过
print()函数或str()函数),Python 会调用该方法来获取对象的字符串表示。 - _call_:当我们使用对象名后面加上一对小括号
()来调用对象时,Python 会调用该方法。 - _len_:长度方法,在使用
len()函数时自动调用,返回对象的长度。 - _getitem_:索引获取方法,在使用索引访问对象时自动调用,返回对应位置的值。
t():使用对象名后面加上一对小括号()来调用对象。
3.5 私有化
Python 为类元素(属性和方法)的私有性提供初步的形式,由双下划线开始的属性在运行时被“混淆”,所以直接访问是不允许的。
通过给属性和方法名添加双下划线 __ 来将它们私有化。例如,__score 表示一个私有属性,还可以__method()表示一个私有方法。私有属性和方法只能在类定义中被引用,子类也无法访问。
import timeclass Stu():def __init__(self, name, sex, age, score):self.name = nameself.sex = sexself.age = age# 定义私有属性self.__score = scoredef getSocre(self):print(f"{self.name} 的成绩是{self.__score}")def goodGoodStudy(self):print("好好学习中...")time.sleep(10)self.__score += 0.1# 定义私有方法def __wuhu(self):print("芜湖")class R(Stu):def __init__(self,name,sex,age,score):Stu.__init__(self, name, sex, age,score)def play(self):print("玩🐍")print(f"{self.name}的成绩是{self.__score}") stu1 = Stu("wuhu",True,24,77)stu1.getSocre()
stu1.goodGoodStudy()
stu1.getSocre()r = R("haha",True,24,66)
# 调用私有方法
r.__wuhu()
# r.play()
如果Stu的子类访问的话Stu中的私有属性就会抛出一个访问未知对象属性(AttributeError)的异常。

相关文章:
Python灰帽编程——错误异常处理与面向对象
文章目录 错误异常处理与面向对象1. 错误和异常1.1 基本概念1.1.1 Python 异常 1.2 检测(捕获)异常1.2.1 try except 语句1.2.2 捕获多种异常1.2.3 捕获所有异常 1.3 处理异常1.4 特殊场景1.4.1 with 语句 1.5 脚本完善 2. 内网主机存活检测程序2.1 scap…...
【每日一题】154. 寻找旋转排序数组中的最小值 II
154. 寻找旋转排序数组中的最小值 II - 力扣(LeetCode) 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到࿱…...
Linux中如何获取输入设备(如触摸屏、按键等)的事件信息
Linux中如何获取输入设备(如触摸屏、按键等)的事件信息 在Linux中,可以使用getevent命令来获取输入设备(如触摸屏、按键等)的事件信息。如果你想在C程序中获取输入设备事件,可以使用以下步骤: …...
Java学习day05:排序,选择、冒泡、快速、二分、杨辉三角
声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!) Java学习day05:排序࿰…...
Mybatis的mapper.xml批量插入、修改sql
今天要有个功能,要进行一批数据的插入和修改,为了不频繁调用数据库,所以想到了批量插入和修改,因为从毕业后,就没写过批量插入和批量修改,所以在这里记录一下,避免后续再遇到忘记怎么写了 批量…...
Centos7部署单机版MongoDB
目录 Centos7部署单机版MongoDBMongoDB介绍数据模型索引分布式高可用性查询语言驱动和社区用途缺点 下载并解压安装包创建相关文件夹和文件编辑mongod.conf文件启动mongodb创建管理员用户终止MongoDB服务配置自启动服务关闭SELinux编辑自启动服务文件mongodb服务命令 Centos7部…...
Docker实战-第一章欢迎来到Docker世界
Docker基础 什么是Docker docker是包括一个命令行程序、后台守护进程和一组远程服务,它简化了安装、运行、发布和删除软件的工作。docker实现的基础是UNIX的容器技术。所以在docker出世之前已经有容器的概念,而且像谷歌一类公司也在探索自己的容器&…...
初识C语言——详细入门一(系统性学习day4)
目录 前言 一、C语言简单介绍、特点、基本构成 简单介绍: 特点: 基本构成: 二、认识C语言程序 标准格式: 简单C程序: 三、基本构成分类详细介绍 (1)关键字 (2…...
python 学习笔记(6)—— Flask 、MySql
目录 Flask 1、起步 2、渲染项目的首页 3、处理无参数的 GET 请求 4、处理有 query 参数的 GET 请求 6、处理 params 参数的 get 请求 6、处理 application/json 类型请求体的 POST 请求 7、根据参数渲染模板页面 8、上传文件 数据库操作(mysql࿰…...
Deepin下vsftp服务安装配置虚拟用户
1. 系统环境 Deepin20.9 2. 在线安装 # apt install -y vsftp //安装ftp服务软件 # apt install -y db-util //安装虚拟用户密码库处理软件 3. 离线安装 3.1 下载依赖包 # apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --n…...
OpenpyxlWriter‘ object has no attribute ‘save‘
问题 将实验结果保存为EXCEL,报错“OpenpyxlWriter‘ object has no attribute ‘save‘” data_df pd.DataFrame(Experiment_result) #关键1,将ndarray格式转换为DataFrame writer pd.ExcelWriter(./results/ args.model_num _args.data_name …...
ES6(三)
文章目录 Promise概念作用回调地狱Promise使用对象的状态Promise.allPromise.race Generator 函数概念基本语法异步流程 Class语法类的写法getter与setter静态属性和静态方法继承模块化 Promise 概念 Promise 是异步编程的一种解决方案,比传统的解决方案回调函数,…...
Android 数据库封装(SQLite)
Android 数据库操作(SQLite) Android 数据库操作(SQLite)动态预览使用初始化生成表实体类插入数据批量插入删除数据删除全部修改数据查找(列表)查找(单条)条件查找(列表&…...
Git从入门到起飞(详细)
Git从入门到起飞 Git从入门到起飞什么是Git?使用git前提(注册git)下载Git在Windows上安装Git在macOS上安装Git在Linux上安装Git 配置Git配置全局用户信息配置文本编辑器 创建第一个Git仓库初始化仓库拉取代码添加文件到仓库提交更改推送 Git基本操作查看提交历史比较…...
R读写parquet文件
什么是parquet文件 Apache Parquet是一个开源的,列存储的数据文件格式。 https://parquet.apache.org/ 在R里面,我们可以通过arrow包来读写它。 我们先安装一下arrow包,并加载它。 install.packages("arrow") library(arrow)读写…...
Java21 LTS版本
一、前言 除了众所周知的 JEP 之外,Java 21 还有更多内容。首先请确认 java 版本: $ java -version openjdk version "21" 2023-09-19 OpenJDK Runtime Environment (build 2135-2513) OpenJDK 64-Bit Server VM (build 2135-2513, mixed mo…...
【性能优化】虚拟懒加载(下拉滚动加载长列表)element-puls+el-table
目录 前言一、卡顿的原因?二、解决1、滚动懒加载2.官方 总结 前言 提示:这里可以添加本文要记录的大概内容: 在element-plus中,如果数据超过1k,就会感觉到明显的卡顿,应该是渲染的卡顿吧。反正我在请求回…...
一对多映射处理
8.3.1 、collection /** * 根据部门id查新部门以及部门中的员工信息 * param did * return */ Dept getDeptEmpByDid(Param("did") int did);<resultMap id"deptEmpMap" type"Dept"> <id property"did" column"did&quo…...
关于IDEA没有显示日志输出?IDEA控制台没有显示Tomcat Localhost Log和Catalina Log 怎么办?
问题描述: 原因是;CATALINA_BASE里面没有相关的文件配置。而之前学习IDEA的时候,把这个文件的位置改变了。导致,最后输出IDEA的时候,不会把日志也打印出来。 检查IDEA配置; D:\work_soft\tomcat_user\Tomcat10.0\bin 在此目录下&…...
蛇形填数 rust解法
蛇形填数。 在nn方阵里填入1,2,…,nn,要求填成蛇形。例如,n=4时方阵为: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 解法如下: use std::io;fn main() {let mut buf String::new();…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
