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

AutoCV第二课:Python基础

目录

  • Python基础
    • 前言
    • 1.流程控制
      • 1.1 条件语句
      • 1.2 循环语句
        • 1.2.1 while循环语句
        • 1.2.2 for循环语句
      • 1.3 作业
      • 1.4 拓展-try except语法
    • 2.函数
      • 2.1 函数定义
      • 2.2 函数的参数
        • 2.2.1 位置参数
        • 2.2.2 命名参数
        • 2.2.3 默认参数
        • 2.2.4 可变参数
        • 2.2.5 参数展开
      • 2.3 递归函数
        • 2.3.1 递归函数定义
        • 2.3.2 斐波拉契数列实现
      • 2.4 作业
      • 2.5 匿名函数
        • 2.5.1 定义
        • 2.5.2 拓展-sorted()函数
    • 总结

Python基础

前言

手写AI推出的全新保姆级从零手写自动驾驶CV课程,链接。记录下个人学习笔记,仅供自己参考。

本次课程为第二课,主要讲解Python中的流程控制(条件和循环语句)以及函数(定义和函数参数)

课程大纲可看下面的思维导图。

在这里插入图片描述

1.流程控制

内容:认识控制流程,判断、循环

1.1 条件语句

Python中的条件语句包括if、elif和else关键字if语句的基本语法如下:

if condition1:statement
elif condition2:statement
elif condition3:statement
else:statement

1.2 循环语句

1.2.1 while循环语句

Python中的while循环语句用于重复执行一段代码,直到条件变为False为止,while的基本语法如下:

while condition:statement

while循环语句可以和break语句一起使用来提前结束循环

1.2.2 for循环语句

Python中的for循环语句可以对序列和可迭代对象进行遍历,语法格式如下:

for variable in Iterator:statement

其中,Iterator指的是支持迭代操作的对象,包括字符串、列表、元组、集合、字典等。variable是在每次循环中接收可迭代对象中的元素。

示例代码如下,遍历整数序列求和:

sum = 0
for i in range(1, 11):sum += i
print("1到10的和为:", sum)

此外,for循环语句还支持breakcontinue关键字,同于控制循环的执行流程。break用于终止整个循环,continue用于跳过当前循环,进入下一次循环。

for还可以和列表进行其它的配合,如

  1. list = [i for i in iterator]

这种方式使用了列表推导式,通过对iterator进行遍历,生成一个新的列表

  1. list = [i for i in range(0, 5, 2) if i != 4]

这种方式是在列表推导式的基础上,添加了一个条件表达式

1.3 作业

作业4:写一个计算器,输入表达式,输出计算结果
运行效果如下:

在这里插入图片描述

示例代码如下:

# 两数的四则运算
while True:# 获取输入表达式expression = input("mycalc>")# 获取+、-、*、/operators = '+-*/'index = [i for i in range(len(expression)) if expression[i] in operators]# 如果存在四则运算符if index:num1 = int(expression[:index[0]])num2 = int(expression[index[0]+1:])if expression[index[0]] == "+":print(num1+num2)elif expression[index[0]] == "-":print(num1-num2)elif expression[index[0]] == "*":print(num1*num2)elif expression[index[0]] == "/" and num2 != 0:print(num1/num2)else:print("Error, divisor cannot be zero! Please try again")

优化:使用函数封装以及try except优化,示例代码如下(Suggestion from chatGPT)

def add(num1, num2):return num1 + num2def subtract(num1, num2):return num1 - num2def multiply(num1, num2):return num1 * num2def divide(num1, num2):if num2 == 0:raise ValueError("Error, divisor cannot be zero!")return num1 / num2if __name__ == "__main__":while True:# 获取表达式expression = input("mycala>")# 获取+、-、*、/operators = '+-*/'index = [i for i in range(len(expression)) if expression[i] in operators]# 如果存在四则运算符if index:num1 = int(expression[:index[0]])num2 = int(expression[index[0]+1:])operator = expression[index[0]]# 根据不同的运算符调用不同的函数进行计算try:if operator == "+":result = add(num1, num2)elif operator == "-":result = subtract(num1, num2)elif operator == "*":result = multiply(num1, num2)elif operator == "/":result = divide(num1, num2)print(result)except ValueError as e:print(e)

继续优化:

  1. 输入的表达式只能包含两个操作数,不能进行多个数的计算
  2. 多个表达式意味着需要考虑*和/的优先级,复杂度提高

优化的示例代码如下:(from chatGPT)

while True:# 获取表达式并去除空格expression = input("mycalc>")# 使用eval函数计算表达式try:result = eval(expression)print(result)except ZeroDivisionError:print("Error, divisor cannot be zero! Please try again")except:print("Invalid expression! Please try again")

说明

  • eval函数可以将包含数学运算符的字符串转换为实际的数学运算结果
  • try except是Python中异常处理的语法结构,用于处理可能会出现的异常代码块。

1.4 拓展-try except语法

try except是Python中异常处理的语法结构,用于处理可能会出现的异常代码块。具体来说try语句包含了要尝试执行的代码块,而except语句包含了在出现异常时要执行的代码块。如果在try代码块中出现了异常,那么程序会跳转到except代码块,并执行其中的代码。

try语句的基本结构如下:

try:# 尝试执行的代码块
except:# 发生异常时要执行的代码块

其中except可以指定不同的异常类型,以便更精确地处理异常。例如,下面代码处理了除以零异常:

try:x = 1 / 0
except ZeroDivisionError:print("除以零错误!")

除了指定具体的异常类型之外,也可以使用except语句来捕获所以异常,例如:

try:# 尝试执行的代码块
except Exception as e:# 发生异常时要执行的代码块

except中,可以使用as关键字来将异常对象赋值给一个变量,以便更详细地了解异常信息。

此外,还可以使用else来指定在没有发生异常时要执行的代码块,例如:

try:# 尝试执行的代码块
except:# 发生异常时要执行的代码块
else:# 没有发生异常时要执行的代码块

最后,还可以使用finally子句来指定不管是否发生异常都要执行的代码块,例如:

try:# 尝试执行的代码块
except:# 发生异常时要执行的代码块
finally:# 不管是否发生异常都要执行的代码块

这在需要释放资源或清理状态时非常有用

2.函数

内容:认识函数的定义、位置参数和命名参数、可变参数、参数的展开(from chatGPT)

2.1 函数定义

在Python中,函数的定义需要使用def关键字,基本的语法格式如下:

def function_name(parameter_list):"""Docstring"""# Function Bodyreturn expression

其中:

  • function_name是函数的名称,必须符合Python的标识规则,通常使用小写字母和下划线组成,不推荐使用与Python内置函数和关键字相同的名称
  • parameter_list是函数的参数列表,可以有零个或多个参数,多个参数之间用逗号分隔。参数可以是位置参数(必选参数)或关键字参数(可选参数)
  • Docstring是函数的文档字符串,用于描述函数的功能和使用方法,通常使用三引号"""包围
  • return语句用于返回函数的执行结果

示例如下:

def sum_numbers(*numbers):"""计算任意数量的数值的和"""sum = 0for n in numbers:sum += nreturn sum# 调用函数
result = sum_numbers(1, 2, 3, 4, 5)
print(result)   # 15

2.2 函数的参数

在Python中,函数参数可分为四种类型:位置参数、命名参数、默认参数和可变参数

2.2.1 位置参数

位置参数是指函数调用时按照定义的位置传递的参数。例如:

def func(a, b):print(a, b)func(1, 2)  # 输出: 1 2

在这个例子中,参数1被传递给了a,参数2被传递给了b。由于参数的位置是固定的,所以这些参数被称为位置参数。

2.2.2 命名参数

在Python中,还可以使用命名参数(关键字参数)指定参数的值,而不需要按照函数定义时参数的位置进行传递,例如:

def func(a, b):print(a, b)func(b=2, a=1)  # 输出: 1 2

在这个例子中,我们通过b=2a=1来指定参数的值。因为参数的值是根据名称指定的,所以这些参数被称为命名参数。

2.2.3 默认参数

默认参数是指在定义函数时为参数提供默认值,如果在调用函数时没有指定参数的值,就使用默认值。例如:

def func(a=1, b=2):print(a, b)func()         # 输出: 1 2
func(3)        # 输出: 3 2
func(b=5)      # 输出: 1 5
func(6, b=7)   # 输出: 6 7

在这个例子中,参数a的默认值为1,参数b的默认值为2。如果没有指定参数的值,则使用默认值。如果指定了某些参数的值,则只有指定的参数会使用这些值,而其它参数仍然使用默认值。

2.2.4 可变参数

可变参数是指能够接受不定数量的参数的函数。在Python中,有两种类型的可变参数:*args**kwargs

*args:接受不定数量的位置参数,这些参数被组合成一个元组。例如:

def func(*args):print(args)func(1, 2)   # 输出: (1, 2)

在这个例子中,参数1,2被组合成了一个元组,并作为参数传递给函数func()

**kwargs:接受不定数量的关键字参数,这些参数被组合成一个字典。例如:

def func(**kwargs):print(kwargs)func(a=1, b=2)  # 输出: {'a': 1, 'b': 2}

在这个例子中,参数a,b被组合成了一个字典,并作为参数传递给函数func()

2.2.5 参数展开

在Python中,使用展开操作符***可以将可迭代对象(例如列表、元组、字典等)中的元素展开成函数的参数,用于函数调用。

*可以将一个可迭代对象中的元素展开为位置参数,传递给函数。例如:

def my_func(a, b):print(a, b)my_list = [1, 2]
my_func(*my_list)  # 输出:1 2

**可以将一个字典中的键值对展开成关键字参数,传递给函数。例如:

def my_func(a, b):print(a, b)my_dict = {'a': 1, 'b': 2}
my_func(**my_dict)  # 输出:1 2

***可以混合使用将位置参数和关键字参数同时展开。例如:

def my_func(a, b, c):print(a, b, c)my_list = [1, 2]
my_dict = {'c': 3}
my_func(*my_list, **my_dict)  # 输出:1 2 3

2.3 递归函数

2.3.1 递归函数定义

Python中的递归函数指在函数内部调用自身的函数。递归函数通常需要满足两个条件:基本情况和递归情况。基本情况指满足某个条件时直接返回结果,递归情况则是指在函数内部调用自身,通常是将问题规模缩小到一个更小的子问题。

例如,下面的代码时一个求阶乘的递归函数:

def factorial(n):if n == 1:return 1else:return n * factorial(n-1)

在上述代码中,当n等于1时,直接返回1,这就是基本情况。递归情况则是将问题规模缩小到n-1的阶乘,这里通过factorial(n-1)实现。递归函数的执行过程是将问题不断地拆分成更小的子问题,直到最终的基本情况被满足,然后将所有子问题结果合并起来得到最终的结果。

2.3.2 斐波拉契数列实现

定义:斐波拉契数列是一个非常经典的数列,它的前两项为0和1,从第三项开始,每一项都是前两项的和,即0,1,1,2,3,5,8,13,…

实现:斐波拉契数列的实现包含循环和递归两种方法

实现1.循环方法

def fibonacci1(n):if n<=1:return nelse:fib_list = [0, 1]for i in range(2, n+1):fib_list.append(fib_list[-1] + fib_list[-2])return fib_list

实现2.递归方法

def fibonacci(n):if n == 1:return [0, 1]else:fib_list = fibonacci(n-1)fib_list.append(fib_list[-1] + fib_list[-2])return fib_list

递归函数是指在函数中调用函数本身的一种技术。代码简单但看得有点迷糊,自己画了个简单图示并理解了下(不知道理解是否正确😂)

递归就是一个套娃的过程,为了便于理解画了个图示,假设此时n=5,不同的颜色来表示不同的flib函数,

  1. n=5时,调用灰色的fib函数,程序运行到第5行进入新的fib函数(套的第一层)
  2. 新的fib函数即n=4.,也就是蓝色的fib函数,同理运行到第5行又进入新的fib函数(套的第二层)
  3. 继续上述过程,n=3,也就是绿色的fib函数,运行到第5行跳转(套的第三层)
  4. 继续,n=2,也就是橙色的fib函数,运行到第5行跳转(套的第四层)
  5. 继续,n=1,也就是黄色的fib函数,此时满足条件n==1,返回[0,1]的一个列表
  6. 开始往回走了,n=2,此时fib_list=[0,1],运行到第六行fib_list=[0,1,1],将结果返回到上一层(脱的第一层)
  7. n=3,此时fib_list=[0,1,1],运行到第六行fib_list=[0,1,1,2],继续将结果返回到上一层(脱的第二层)
  8. n=4,此时fib_list=[0,1,1,2],运行到第六行fib_list=[0,1,1,2,3],继续返回给上一层(脱的第三层)
  9. n=5,此时fib_list=[0,1,1,2,3],运行到第六行fib_list=[0,1,1,2,3,5],将最终的结果返回(脱的第四层)

在这里插入图片描述

递归图示

2.4 作业

作业5:定义一个函数extract(text, begin_token, end_token),返回text中,以begin_token开始end_token结束的中间内容

示例代码如下:

def extract(text, begin_token, end_token):begin_index = text.find(begin_token)end_index = text.find(end_token)return text[begin_index+len(begin_token):end_index]print(extract("爱听歌的周同学呀", "爱听歌的", "呀"))

运行效果如下:

在这里插入图片描述

存在的问题:(from chatGPT)

    1. 当begin_token或end_token不在text中时,会返回错误的结果
    1. begin_token和end_token必须按照顺序一次出现在text中,否则无法正确提取中间内容。

优化

def extract(text, begin_token, end_token):begin_index = text.find(begin_token)if begin_index == -1:raise ValueError("begin_token not found")end_index = text.find(end_token, begin_index+len(begin_token))if end_index == -1:raise ValueError("end_token not found")return text[begin_index+len(begin_token):end_index]print(extract("我爱Python,Python是一门很有用的语言", "Python", "语言"))

2.5 匿名函数

2.5.1 定义

Python中的匿名函数又称为lambda函数,是一种不需要定义函数名的函数。lambda函数的语法如下:

lambda arguments: expression

其中arguments表示函数的参数,可以有多个,使用逗号分隔。expression表示函数的表达式,可以是任何有效的表达式。lambda函数的返回值是一个函数对象。

lambda函数的简单示例如下:

sum = lambda x, y: x + y
print(sum(3, 5))	# 输出:8

在这个例子中,我们创建了一个lambda函数,将它赋值给了变量sum。这个函数接受两个参数x和y,共返回它们的和。我们通过调用sum(3,5)来调用这个函数,并输出结果8。

lambda函数通常用于需要简单函数的场景,可以简化代码,并提高代码的可读性。例如,使用lambda函数对列表进行排序:

data = [('apple', 3), ('banana', 2), ('orange', 4)]
sorted_data = sorted(data, key=lambda x: x[1])
print(sorted_data)	# 输出:[('banana', 2), ('apple', 3), ('orange', 4)]

在这个例子中,我们使用了lambda函数作为sorted()函数的key参数,以元组的第二个元素作为排序的关键字。

不由的想起检测器的NMS算法之前需要将boxes按照置信度的大小进行排序,其代码如下:

...# boxes-->[1,25200,85]  box->[left, top, right, bottom, confidence, img_id, label]
boxes = sorted(boxes.tolist(), key=lamda x:x[4], reverse=True)return NMS(boxes)
...

2.5.2 拓展-sorted()函数

在Python中,Sorted()函数用于对可迭代对象进行排序,返回一个新的已排序的列表,而不改变原始对象。

sorted()函数有以下几个参数:

  • iterable:必选参数,表示要排序的可迭代对象,可以是列表、元组、集合、字典等
  • key:可选参数,表示用于排序的关键字函数,用于比较两个元素的大小关系。默认值为None,表示使用元素本身的值进行比较。
  • reverse:可选参数,表示是否降序排列。默认值为False,表示升序排列。

sorted()函数使用示例如下:

# 对列表进行升序排列
nums = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_nums = sorted(nums)
print(sorted_nums)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]# 对字典按值进行升序排列
d = {'apple': 3, 'banana': 2, 'orange': 4}
sorted_d = sorted(d.items(), key=lambda x: x[1])
print(sorted_d)  # [('banana', 2), ('apple', 3), ('orange', 4)]

上面的代码中,第一个示例是对列表进行排序,不需要使用关键字函数key。第二个示例是对字典按值进行排序,使用了关键字函数key,并且使用匿名函数lambda来定义比较元素大小的规则,即按照每个元素的第二个值进行升序排列。其中d.items()方法将字典转换为元组列表。

总结

本次课程内容方面主要学习了Python中的流程控制和函数,流程控制方面掌握了for与列表构成带条件的列表推导式,同时回顾了Python中异常处理的语法结构try excepy。函数方面掌握了各种传递函数参数的方法,以及两种特殊的函数:递归函数和匿名函数。

相关文章:

AutoCV第二课:Python基础

目录Python基础前言1.流程控制1.1 条件语句1.2 循环语句1.2.1 while循环语句1.2.2 for循环语句1.3 作业1.4 拓展-try except语法2.函数2.1 函数定义2.2 函数的参数2.2.1 位置参数2.2.2 命名参数2.2.3 默认参数2.2.4 可变参数2.2.5 参数展开2.3 递归函数2.3.1 递归函数定义2.3.2…...

LeetCode算法 打家劫舍 和 打家劫舍II C++

目录题目 打家劫舍参考答案题目 打家劫舍II参考答案题目 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯…...

蓝桥杯刷题冲刺 | 倒计时10天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.有边数限制的最短路2.九进制转十进制1.有边数限制的最短路 题目 链接&#xff1a; 853. 有边数…...

个人练习-Leetcode-剑指 Offer II 109. 开密码锁

题目链接&#xff1a;https://leetcode.cn/problems/zlDJc7/ 题目大意&#xff1a;给出一个四位数字的密码锁&#xff0c;初始状态是0000&#xff0c;目标是targer。每一次转动只能让一个位的轮盘转动一下&#xff08;0往后转是9&#xff09;。有一个vector<string> dea…...

四个常见的Linux面试问题

四个常见的Linux面试问题。 刚毕业要找工作了&#xff0c;只要是你找工作就会有面试这个环节&#xff0c;那么在面试环节中&#xff0c;有哪些注意事项值得我的关注呢&#xff1f;特别是专业技术岗位&#xff0c;这样的岗位询问一般都是在职的工程师&#xff0c;如何在面试环节…...

15、接口(C#)

15.1 什么是接口 接口是指定一组函数成员而不实现它们的引用类型。所以只能类和结构实现接口。 15.2 声明接口 接口声明不能包含以下成员 数据成员静态成员 接口声明只能包含以下类型的费静态成员函数声明&#xff1a; 方法事件索引器属性 这些函数成员的声明不能包含任何实…...

C++中常见的容器类使用方法举例(vector、deque、map、set)

cpp中常见的容器类有vector、list、deque、map、set、unordered_map和unordered_set。 下面将举例直接说明各个容器的使用方法。 文章目录综合示例1. vector&#xff1a;动态数组&#xff0c;支持随机访问2. list&#xff1a;双向链表&#xff0c;支持双向遍历和插入删除3. de…...

什么是强缓存和协商缓存

什么是缓存 浏览器缓存就是把一个已经请求过的Web资源&#xff08;如html页面&#xff0c;图片&#xff0c;js&#xff0c;数据等&#xff09;拷贝一份副本储存在浏览器中。缓存会根据进来的请求保存输出内容的副本。当下一个请求来到的时候&#xff0c;如果是相同的URL&#…...

算法刷题之堆

1. heapq 堆 Python 中只有最小堆&#xff1a; import heapqa [] heapq.heappush(a, 3) # 添加元素 heapq.heappush(a, 2) heapq.heappush(a, 1) while len(a): # 判断堆的长度print(heapq.heappop(a)) # 弹出堆顶元素# 将列表转换为最小堆 nums [2, 3, 1, 4, 5, 6] hea…...

javaweb导师选择系统

本文以JSP为开发技术&#xff0c;实现了一个导师选择系统。导师选择系统分为三大模块&#xff0c;包括管理员&#xff1a;学员信息管理、导师信息管理、导师选择管理、导师分布图、公告信息管理、系统管理&#xff0c;学生&#xff1a;个人资料管理、导师选择管理、导师分布图管…...

LeetCode150 逆波兰表达式求值

题目&#xff1a; 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 ‘’、‘-’、‘*’ 和 ‘/’ 。每个操作数&#xff08;运算对象&#xff09;都可以…...

【Node.js】项目开发实战(中)

开发用户的注册和登录接口步骤1&#xff0c;打开MySQL Workbench&#xff0c;打开自己的数据库进入创建用户信息表新建 ev_users表安装并配置mysql模块安装mysql模块新建db文件夹下index.js,导入并配置mysql模块安装bcryptjs对密码进行加密处理新建/router_handler/user.js中&a…...

记录一次 New Bing 英语陪练

记录一次 New Bing 英语陪练 Now I start to speak english to chat with you . Help me find the mistake in my word and help me improve my english I’m glad you want to practice your English with me. I can help you find the mistakes in your words and help you i…...

【Python】照片居然能变素描?不会画画但是咱会代码

文章目录前言一、准备二、下载预训练模型总结前言 Photo-Sketching 一个能将照片的轮廓识别出来并将其转化为“速写”型图像的开源模块。 比如&#xff0c;这只小狗&#xff1a; 经过模型的转化&#xff0c;会变成卡通版的小狗&#xff1a; 非常秀&#xff0c;这很人工智能…...

已解决正确配置git环境变量

已解决git没有配置环境变量&#xff0c;抛出异常ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH?&#xff0c;附上正确配置git环境变量的教程 文章目录报错问题报错翻译报错原因解决方法《100天精通Python》专栏推荐白嫖80g Python全栈…...

【逐步剖C】-第十章-自定义类型之结构体、枚举、联合

一、结构体 前言&#xff1a;有关结构体的声明、定义、初始化以及结构体的传参等结构体的基本使用在文章【逐步剖C】-第六章-结构体初阶中已进行了详细的介绍&#xff0c;需要的朋友们可以看看。这里主要讲解的是有关结构体的内存问题。 1. 结构体的内存对齐 &#xff08;1&…...

Windows Server 2016 中文版、英文版下载 (updated Mar 2023)

Windows Server 2016 Version 1607&#xff0c;2023 年 3 月更新 请访问原文链接&#xff1a;https://sysin.org/blog/windows-server-2016/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 本站将不定期发布官方原版风格月度更…...

Linux 4G 通信实验

目录4G 网络连接简介高新兴ME3630 4G 模块实验ME3630 4G 模块简介ME3630 4G 模块驱动修改ME3630 4G 模块ppp 联网测试前面我们学习了如何在Linux 中使用有线网络或者WIFI&#xff0c;但是使用有线网络或者WIFI 有 很多限制&#xff0c;因为要布线&#xff0c;即使是WIFI 你也得…...

华为OSPF技术详细介绍,保姆级,谁都能看懂(一)

目录 1、简介 2、OSPF基本原理 3、OSPF的特点 4、OSPF区域 5、路由器的类型 6、OSPF5种报文 7、后半部分内容 1、简介 OSPF&#xff08;Open Shortest Path First&#xff0c;开放最短路径优先&#xff09;是一个基于链路状态的内部网关协 议。目前针对IPv4协议使用的是OS…...

行人车辆检测与计数系统(Python+YOLOv5深度学习模型+清新界面)

摘要&#xff1a;行人车辆检测与计数系统用于交通路口行人及车辆检测计数&#xff0c;道路人流量、车流量智能监测&#xff0c;方便记录、显示、查看和保存检测结果。本文详细介绍行人车辆检测&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码、PyQt的UI界面…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...