百面算法工程师 | python解释器基础问答

news2024/11/22 9:41:00

本文给大家带来的百面算法工程师是深度学习python解释器面试总结,文章内总结了常见的提问问题,旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中,我们还将介绍一些常见的python用法,并提供参考的回答及其理论基础,以帮助求职者更好地准备面试。通过对这些问题的理解和回答,求职者可以展现出自己的算法语法领域的专业知识、解决问题的能力以及对实际应用场景的理解。同时,这也是为了帮助求职者更好地应对深度学习目标检测岗位的面试挑战,提升面试的成功率和竞争力

目录

2.1 Python的装饰器的作用是什么,为什么要这么做

2.2 什么是解释性语言,什么是编译性语言

2.3 python程序的执行过程

2.4 python的作用域

2.5 python的数据结构

2.6 python多线程

2.7 python多进程

2.8 Python互斥锁与死锁

2.9 Python的深拷贝与浅拷贝

2.10 hasattr() getattr() setattr() 函数使用详解

2.11 __init__.py 文件的作用以及意义

2.12 点积和矩阵相乘的区别


 

 欢迎大家订阅我的专栏一起学习共同进步

祝大家早日拿到offer! let's go

🚀🚀🚀http://t.csdnimg.cn/dfcH3🚀🚀🚀

2.1 Python的装饰器的作用是什么,为什么要这么做

Python中的装饰器是一种高级功能,它允许你在不改变函数代码的情况下,动态地修改函数的行为。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。这种技术常用于在函数执行前后添加额外的功能,例如日志记录、性能监控、权限检查等。

装饰器的主要作用有几个方面:

  1. 代码复用和简化:装饰器可以将与函数相关的功能从函数中抽取出来,使得代码更简洁、易读,并且可以在多个函数之间共享相同的功能。
  2. 增强函数功能:通过装饰器,你可以在不修改原始函数的情况下,为函数添加新的功能,例如日志记录、性能监控、缓存等,从而增强函数的功能和灵活性。
  3. 分离关注点:装饰器可以将关注点分离开来,使得代码更易于维护和理解。原始函数只需要关注核心逻辑,而其他非核心功能则可以由装饰器来处理。
  4. 可重用性:装饰器本身是可重用的,它可以应用于多个函数上,从而避免了重复编写相同功能的代码。

为什么要使用装饰器呢?主要原因在于它可以提高代码的可维护性、可扩展性和可读性。通过将非核心功能与原始函数分离,使得代码结构更清晰,易于理解和修改。此外,装饰器还能够促进代码复用,提高开发效率。

静态装饰器可以直接使用函数名进行调用,而不需要通过类名因为静态装饰器本身就是函数

# 类装饰器,添加额外的功能
class LogCalls:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print(f"Calling function {self.func.__name__} with args {args} and kwargs {kwargs}")
        return self.func(*args, **kwargs)

@LogCalls
def multiply(x, y):
    return x * y

result = multiply(4, 6)
print("Result:", result)
2.2 什么是解释性语言,什么是编译性语言

解释性语言和编译性语言是两种不同的编程语言类型,它们的主要区别在于代码执行的方式。

  1. 解释性语言
    • 在解释性语言中,源代码通过解释器一行一行地被解释执行。解释器读取源代码并直接将其转换为机器代码或者其他形式的中间代码,然后立即执行。因此,解释性语言的执行是逐行进行的。
    • 解释性语言的典型代表包括Python、JavaScript和Ruby等。
  2. 编译性语言
    • 在编译性语言中,源代码首先需要通过编译器被转换成机器码或者中间代码,然后再由计算机执行。编译过程将源代码转换成目标代码,这个目标代码可以在不同的计算机上运行,而不需要重新编译。编译性语言的执行是在编译完成后进行的。
    • 编译性语言的典型代表包括C、C++、Java等。

总的来说,解释性语言的优势在于其灵活性和跨平台性,因为它们不需要事先的编译步骤,而编译性语言通常执行速度更快,但需要额外的编译步骤。

2.3 python程序的执行过程

Python 是一种解释性语言,因此 Python 程序的运行过程如下:

  1. 编写代码
    开发者编写 Python 代码,通常保存为以 .py 结尾的文件。
  2. 解释器执行
    当要运行 Python 代码时,通过命令行或集成开发环境(IDE)等工具调用 Python 解释器,将代码传递给解释器执行。解释器按照代码的顺序逐行解释执行,将代码转换为计算机可以理解的指令并执行。
  3. 词法分析和语法分析
    解释器首先进行词法分析和语法分析,将源代码分解成标记(tokens)和语法树。
  4. 字节码生成
    解释器将源代码转换为字节码(bytecode),这是一种中间形式的代码,不是直接的机器码。
  5. 解释执行字节码
    解释器逐行执行字节码指令,将其翻译成机器码并执行。

整个过程中,Python 解释器负责将代码转换为可执行的指令序列,并负责管理内存、处理异常等运行时任务。这种解释性语言的方式使得 Python 具有跨平台性和灵活性,但也可能导致一些性能上的损失。

2.4 python的作用域

在 Python 中,作用域(Scope)指的是变量和函数的可访问性和可见性范围。Python 中的作用域可以分为以下几种:

  1. 全局作用域(Global Scope
    在 Python 程序的最外层定义的变量和函数处于全局作用域中,它们可以在代码中的任何地方被访问。全局作用域在整个程序执行过程中都是有效的。
  2. 局部作用域(Local Scope
    在函数内部定义的变量和函数处于局部作用域中,它们只能在函数内部被访问。当函数执行结束后,局部作用域中的变量通常会被销毁。
  3. 嵌套作用域(Enclosing Scope
    如果在一个函数内部定义了另一个函数,内部函数就处于嵌套作用域中。内部函数可以访问外部函数中定义的变量,但外部函数不能直接访问内部函数的变量。
  4. 内置作用域(Built-in Scope
    Python 内置的函数和对象的作用域属于内置作用域,这些函数和对象可以在任何地方被访问。例如,print() 和 len() 等函数就是内置作用域中的内容。

Python 使用 LEGB【每个域的首字母】 规则来确定变量的作用域:

  • L(Local):局部作用域
  • E(Enclosing):嵌套作用域
  • G(Global):全局作用域
  • B(Built-in):内置作用域

按照 LEGB 规则,Python 在查找变量时,首先在局部作用域中查找,然后逐级向上查找直到找到为止,如果都没有找到,则会抛出 NameError 异常。

2.5 python的数据结构

数据结构 (Data Structure)

可变性 (Mutability)

列表 (List)

列表是一种有序的数据集合,可以包含不同类型的元素,并且可以动态地修改。列表使用方括号 [ ] 定义,元素之间使用逗号 , 分隔。

可变 (Mutable)

元组 (Tuple)

元组类似于列表,但是元组是不可变的,一旦创建就不能被修改。元组使用圆括号 ( ) 定义,元素之间使用逗号 , 分隔。

不可变 (Immutable)

集合 (Set)

集合是一种无序且不重复的数据集合。集合中的元素没有索引,不支持通过索引访问,但可以进行集合运算,如并集、交集和差集等。集合使用花括号 { } 或 set() 函数定义。

可变 (Mutable)

字典 (Dictionary)

字典是一种无序的键值对集合,每个键值对用冒号 : 分隔,键值对之间使用逗号 , 分隔。字典中的键必须是唯一的,但值可以重复。字典使用花括号 { } 定义。

可变 (Mutable)

字符串 (String)

字符串是由字符组成的有序序列,Python 中的字符串是不可变的,不能被修改。字符串可以使用单引号 ' '、双引号 " " 或三引号 ''' ''' 定义。

不可变 (Immutable)

2.6 python多线程

在 Python 中,多线程是一种同时执行多个线程的机制,每个线程都可以执行不同的任务。Python 提供了多种方式来实现多线程编程,其中最常用的有以下两种:

  1. 使用 threading 模块
    Python 内置了 threading 模块,可以使用该模块来创建和管理线程。通过创建 Thread 类的实例来定义新线程,然后调用 start() 方法启动线程的执行。线程可以是执行函数或者可调用对象。虽然 Python 的多线程可以在同一个进程中执行并发任务,但由于 GIL(全局解释器锁)的存在,多线程并不能实现真正的并行执行,适用于 I/O 密集型任务,但不适用于 CPU 密集型任务。
  2. 使用 concurrent.futures 模块
    concurrent.futures 模块提供了 ThreadPoolExecutor 和 ProcessPoolExecutor 两个类,分别用于创建线程池和进程池,以实现多线程和多进程编程。与 threading 模块相比,concurrent.futures 模块提供了更高级别的接口,并且可以通过使用进程池来规避 GIL 的限制,实现真正的并行执行。

无论是使用 threading 模块还是 concurrent.futures 模块,多线程编程都需要注意线程安全性(如使用锁、信号量等机制保护共享资源)、避免死锁(如避免资源竞争)、线程间通信等问题。

Python 的多线程使用的是操作系统的原生线程(例如在 Windows 上是使用的是 Windows 线程,而在 Unix/Linux 上是使用的 POSIX 线程),这些线程是由操作系统调度的。但是,Python 中的多线程受到 GIL(全局解释器锁)的限制。

GIL 是 Python 解释器中的一个全局锁,它确保同一时刻只有一个线程在解释器中执行 Python 字节码。因此,尽管 Python 的多线程可以在多个 CPU 上并行执行 I/O 密集型任务,但在 CPU 密集型任务上并不能真正实现并行执行,因为同一时刻只有一个线程能够执行 Python 代码。

如果想要充分利用多核 CPU,可以考虑使用多进程而不是多线程。Python 的多进程可以使用 multiprocessing 模块来实现,并且每个进程都有自己独立的 GIL,因此可以在多个 CPU 上并行执行 CPU 密集型任务。

总的来说,Python 的多线程适合于 I/O 密集型任务,但对于 CPU 密集型任务,应该考虑使用多进程来充分利用多核 CPU。

2.7 python多进程

在 Python 中,多进程是一种同时执行多个进程的机制,每个进程都有自己独立的内存空间和系统资源。Python 提供了多种方式来实现多进程编程,其中最常用的有以下两种:

  1. 使用 multiprocessing 模块
    Python 内置了 multiprocessing 模块,可以使用该模块来创建和管理进程。通过创建 Process 类的实例来定义新进程,然后调用 start() 方法启动进程的执行。与多线程编程类似,进程可以是执行函数或者可调用对象。multiprocessing 模块可以充分利用多核 CPU,实现真正的并行执行,适用于 CPU 密集型任务。
multiprocessing import Process

def worker():
    print("Worker process")

if __name__ == "__main__":
    p = Process(target=worker)
    p.start()
    p.join()
  1. 使用 concurrent.futures 模块
    除了用于多线程编程,concurrent.futures 模块还可以用于多进程编程。通过使用 ProcessPoolExecutor 类来创建进程池,以实现多进程并行执行任务。与 threading 模块类似,concurrent.futures 模块提供了更高级别的接口来管理进程池,简化了多进程编程的复杂性。
concurrent.futures import ProcessPoolExecutor

def worker():
    return "Worker process"

if __name__ == "__main__":
    with ProcessPoolExecutor() as executor:
        future = executor.submit(worker)
        print(future.result())

多进程编程需要注意的问题包括进程间通信(如使用队列、管道等)、进程池管理(如限制最大进程数)、避免资源竞争等。

2.8 Python互斥锁与死锁

互斥锁和死锁是多线程编程中常见的两个概念,它们之间存在一定的关系。

  1. 互斥锁(Mutex
    互斥锁是一种同步机制,用于确保在任意时刻只有一个线程可以访问共享资源。当一个线程获得了互斥锁,其他线程就必须等待该线程释放锁之后才能访问共享资源,从而避免了多个线程同时修改共享资源而导致的数据竞争问题。Python 中的 threading 模块提供了 Lock 类来实现互斥锁。
  2. 死锁(Deadlock
    死锁是指两个或多个线程互相持有对方所需的资源,并且等待对方释放资源,从而导致所有线程都无法继续执行的情况。死锁通常发生在多个线程同时尝试获取多个互斥锁时,如果不恰当地管理锁的获取顺序,可能会导致死锁的发生。

互斥锁通常用于避免死锁的发生,但在编写多线程程序时,需要特别注意以下几点来避免死锁的发生:

  • 避免循环等待:确保线程在获取锁时不会发生循环等待,即所有线程都以相同的顺序获取锁。
  • 尽量减少锁的持有时间:获取锁后应尽快释放,以减少其他线程等待锁的时间。
  • 使用超时机制:在获取锁时使用超时机制,避免线程长时间等待锁而无法执行。

虽然互斥锁可以帮助避免死锁的发生,但它并不能完全消除死锁的可能性。因此,在编写多线程程序时,需要仔细考虑并谨慎处理锁的获取和释放,以尽量减少死锁的发生。

2.9 Python的深拷贝与浅拷贝

在 Python 中,深拷贝(deep copy)和浅拷贝(shallow copy)是用于复制对象的两种不同方式,它们有不同的行为和应用场景。

  1. 浅拷贝(Shallow Copy
    浅拷贝是创建一个新的对象,其中包含原始对象中的所有元素的引用。换句话说,浅拷贝只复制了对象的一层,如果对象中包含了可变对象(如列表或字典),则原始对象和拷贝对象会共享这些可变对象。在 Python 中,可以使用 copy() 方法或 copy 模块的 copy() 函数来实现浅拷贝。
original_list = [1, [2, 3], 4]
shallow_copy = copy.copy(original_list)

# 修改原始对象中的可变对象
original_list[1][0] = 'a'

print(original_list)   # Output: [1, ['a', 3], 4]
print(shallow_copy)    # Output: [1, ['a', 3], 4]
  1. 深拷贝(Deep Copy
    深拷贝是创建一个新的对象,其中包含原始对象中的所有元素的副本,包括所有嵌套对象。换句话说,深拷贝会递归地复制所有嵌套对象,确保原始对象和拷贝对象彼此独立,互不影响。在 Python 中,可以使用 copy() 方法或 copy 模块的 deepcopy() 函数来实现深拷贝。
original_list = [1, [2, 3], 4]
deep_copy = copy.deepcopy(original_list)

# 修改原始对象中的可变对象
original_list[1][0] = 'a'

print(original_list)   # Output: [1, ['a', 3], 4]
print(deep_copy)       # Output: [1, [2, 3], 4]

总的来说,浅拷贝只复制对象的一层,而深拷贝则会递归地复制所有嵌套对象。因此,在需要完全独立的拷贝时,应使用深拷贝。

2.10 hasattr() getattr() setattr() 函数使用详解

hasattr(), getattr(), 和 setattr() 是 Python 中用于操作对象属性的三个内置函数。它们的主要作用如下:

  1. hasattr(object, name)
    • hasattr() 函数用于检查一个对象是否具有指定的属性(attribute)或者方法(method)。
    • 如果对象中存在指定名称的属性或方法,则返回 True,否则返回 False。
    • 语法:hasattr(object, name),其中 object 是要检查的对象,name 是要检查的属性或方法名称。
MyClass:
    attr = 123

obj = MyClass()
print(hasattr(obj, 'attr'))  # Output: True
print(hasattr(obj, 'method'))  # Output: False
  1. getattr(object, name[, default])
    • getattr() 函数用于获取对象中指定名称的属性或方法的值。
    • 如果对象中存在指定名称的属性或方法,则返回其值;如果指定名称不存在,并且提供了默认值,则返回默认值;如果未提供默认值,则会引发 AttributeError 异常。
    • 语法:getattr(object, name[, default]),其中 object 是要获取属性或方法的对象,name 是要获取的属性或方法名称,default 是可选的默认值。
MyClass:
    attr = 123

obj = MyClass()
print(getattr(obj, 'attr'))  # Output: 123
print(getattr(obj, 'method', 'default'))  # Output: 'default'
  1. setattr(object, name, value)
    • setattr() 函数用于设置对象中指定名称的属性或方法的值。
    • 如果对象中存在指定名称的属性或方法,则将其值设置为指定的值;如果指定名称不存在,则会创建新的属性或方法并设置其值。
    • 语法:setattr(object, name, value),其中 object 是要设置属性或方法的对象,name 是要设置的属性或方法名称,value 是要设置的值。
MyClass:
    pass

obj = MyClass()
setattr(obj, 'attr', 123)
print(obj.attr)  # Output: 123

这些函数对于动态地操作对象的属性和方法非常有用,特别是在编写通用代码时,可以根据需要动态地获取、设置或检查对象的属性和方法。

2.11 __init__.py 文件的作用以及意义

__init__.py 文件是 Python 包中一个特殊的文件,用于指示 Python 解释器该目录是一个包,它具有以下几个作用和意义:

  1. 包标识符
    __init__.py 文件的存在表示该目录是一个 Python 包。在 Python 3.3 之前的版本中,必须存在 __init__.py 文件才能将目录视为包。从 Python 3.3 开始,如果没有 __init__.py 文件,仍然可以将目录视为包,但是 __init__.py 文件仍然被用作包标识符的标准方式。
  2. 初始化包
    __init__.py 文件可以包含包的初始化代码,例如初始化模块、定义包级别的变量和函数等。当导入包时,Python 解释器会执行 __init__.py 文件中的代码。
  3. 导入子模块
    在 __init__.py 文件中可以使用 import 语句来导入子模块,从而使得在导入包时同时导入子模块,使得用户可以更方便地访问包中的功能。
  4. 控制包的导入行为
    __init__.py 文件还可以控制包的导入行为,例如限制导入的内容、导入时执行特定的操作等。通过在 __init__.py 中设置 __all__ 变量,可以指定导入时包外部可见的模块列表。
  5. 向后兼容性
    尽管从 Python 3.3 开始,不再需要 __init__.py 文件来标识包,但为了向后兼容性和与旧代码的兼容性,建议仍然在包目录中包含 __init__.py 文件。

总的来说,__init__.py 文件是 Python 包中的一个重要组成部分,它用于标识包、初始化包、导入子模块以及控制包的导入行为,对于组织和管理 Python 项目和模块非常有用。

2.12 点积和矩阵相乘的区别

点积(内积)和矩阵相乘是线性代数中两个不同的运算,它们之间有一些区别。

  1. 点积(内积)
    • 点积,也称为内积或数量积,是两个向量之间的运算。对于两个长度相等的向量 ab,它们的点积定义为:
      ab=a1b1+a2b2+⋯+anbn
      其中aibi 分别表示向量 ab 中的第 ( i ) 个元素。
    • 点积的结果是一个标量,表示两个向量之间的相似程度。如果点积为零,则表示两个向量正交(垂直);如果点积大于零,则表示两个向量之间的夹角小于 90∘,反之则大于90∘。
  2. 矩阵相乘
    • 矩阵相乘是针对两个矩阵进行的运算。对于两个矩阵 ( A ) 和 ( B ),如果 ( A ) 的列数等于 ( B ) 的行数,则它们可以相乘,结果矩阵 ( C ) 的维度为m×n,其中 ( m ) 是 ( A ) 的行数,( n ) 是 ( B ) 的列数。
    • 矩阵相乘的定义为:

    • 其中 Cij表示结果矩阵 ( C ) 中第 ( i ) 行第 ( j ) 列的元素,( p ) 是 ( A ) 的列数或 ( B ) 的行数。
    • 矩阵相乘的结果是一个新的矩阵,表示了两个矩阵之间的线性变换关系。它通常用于描述多个线性变换的组合效果。

总的来说,点积是针对向量的运算,结果是一个标量,表示向量之间的相似程度;而矩阵相乘是针对矩阵的运算,结果是一个新的矩阵,表示了两个矩阵之间的线性变换关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1652124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微生物群落构建(community assembly)

Introduction Zhou, J. & Ning, D. Stochastic Community Assembly: Does It Matter in Microbial Ecology? Microbiol Mol Biol Rev 81, e00002-17 (2017). This review is very comprehensive (1)! 周集中老师实验室的长期研究兴趣集中在从基因组到生态系统…

史上最简单给大模型注入新知识的方法

《史上最简单给大模型注入新知识的方法》 image-20240508093410856 先执行 pip install --upgrade openai 。 from openai import OpenAI# 加载.env 文件到环境变量from dotenv import load_dotenv, find_dotenv_ load_dotenv(find_dotenv())# 初始化 OpenAI 服务。会自动从环…

第一个C++项目

文章目录 一、新建项目1.打开软件,选择“创建新项目”2.新建项目栏中,按自己的需求来设置项目模板,项目名称和文件存放位置,设置好后点击“确认”3. 点击“Next”4. 按照自己需求设置,设置完后,点击“Next”…

MySQL增删查改(进阶)

目录 数据库约束 表的设计 查询操作的进阶 查询搭配插入使用 聚合查询 1>count(*) 2>sum(*) 3>avg(*) 4>max(*) 5>min(*) group by分组分别进行聚合查询 联合查询 / 多表查询[重点] 外连接 自连接 子查询 合并查询 小结: 数据库约束 有时候…

虚拟机镜像文件qcow2格式转vmdk

一、在esxi上虚拟机导出qcow2镜像文件 1、卸载数据盘、网卡 2、登录虚拟机所在物理服务器,查找系统盘名为vm-101-disk-0的文件位置 find / -name "vm-101-disk-0"使用命令导出qcow2镜像(进度条走完就完成了): qemu…

基于FPGA的数字信号处理(10)--定点数的舍入模式(1)四舍五入round

1、前言 将浮点数定量化为定点数时,有一个避不开的问题:某些小数是无法用有限个数的2进制数来表示的。比如: 0.5(D) 0.1(B) 0.1(D) 0.0001100110011001~~~~(B) 可以看到0.5是可以精准表示的,但是0.1却不行。原因是整数是离散的…

蓝桥杯【第15届省赛】Python B组 32.60 分

F 题列表越界访问了……省一但没什么好名次 测评链接:https://www.dotcpp.com/oj/train/1120/ C 语言网真是 ** 测评,时间限制和考试的不一样,E 题给我整时间超限? A:穿越时空之门 100🏆 【问题描述】 随…

LLMs之unsloth:unsloth的简介、安装和使用方法、案例应用之详细攻略

LLMs之unsloth:unsloth的简介、安装和使用方法、案例应用之详细攻略 目录 unsloth的简介 0、特点和功能: 特点 功能 1、免费微调 2、Unsloth.ai新闻 3、链接和资源 4、主要特征 5、性能基准测试 unsloth的安装和使用方法 1、安装说明 Conda安…

牛客热题:链表的奇偶重排

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:链表的奇偶重排题目链接方法一&…

在家中访问一个网站的思考

在家中访问一个网站的思考 1、家庭网络简介2、家庭WLAN DHCP2.1、家庭路由器PPPOE拨号2.2、DHCP(动态主机配置协议)2.3、接入家庭网的主机IP地址2.4、家庭总线型以太网2.5、Mac地址2.6、ARP协议2.7、IP协议 & UDP/TCP协议2.8、NAT(Netwo…

带你快速掌握Spring Task

Spring Task ⭐Spring Task 是Spirng框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑 📌一款定时任务框架 应用场景 信用卡信息银行贷款信息火车票信息 只要是需要定时处理的场景都可以使用Spring Task 只要有定时,就会有…

论文润色就用意得辑:让你的学术之作更上一层楼

在学术的海洋里,每一篇论文都是一艘承载智慧与探索的小船。然而,好的内容也需要好的包装,才能更好地展现其价值。在这个追求精益求精的时代,意得辑以其专业的论文润色服务,成为了众多学者们的得力助手。 意得辑&#…

亚马逊自养号测评系统搭建技术要点解析

亚马逊自养号测评系统搭建技术要求主要涵盖了网络环境、IP管理、设备配置、浏览器防关联、支付卡选择与管理以及账号管理等多个方面。测评是否稳定长久这些条件都是缺一不可的,以下是一些具体的技术要求: 1. 网络环境:使用国外服务器在云端搭…

论文润色就用意得辑,打造学术精品新篇章

在学术的世界里,一篇优秀的论文如同璀璨的星辰,吸引着同行们的目光。然而,好的论文并非一蹴而就,它需要经过反复打磨、润色,才能焕发出夺目的光彩。在这个过程中,意得辑以其专业的服务、精湛的技巧&#xf…

geojson文件规格

geojson文件示例, {"type": "FeatureCollection","features": [{"type": "Feature","geometry": {"type": "Point","coordinates": [102.0, 0.5]},"properties&q…

Exness外汇大陆投资者开户详细流程!

Exness是一家全球领先的外汇和差价合约交易平台,因其高效稳定的服务和多样化的交易工具,受到广大投资者的青睐。然而,由于中国大陆用户无法直接访问Exness官网,想要开户的大陆投资者需要通过特定方式才能完成注册。本文将详细介绍…

windows10打印机共享完美解决方案

提到文件共享大家并不陌生,相关的还有打印机共享,这个多见于单位、复印部,在一个区域网里多台电脑共用一台打印机,打印资料非常方便,就包括在家里,我们现在一般都会有多台电脑或设备,通过家庭网络联接,如果共享一台打印机的话也是件便捷的事。 但是随着操作系统的更新…

哪个品牌的开放式耳机好用?五款畅销拔尖爆款力荐!

在耳机市场上,开放式耳机正逐渐成为一股新的风潮。它们以其独特的设计和卓越的音质吸引着越来越多的耳机爱好者。相较于传统的蓝牙耳机,开放式耳机不仅在音质上更胜一筹,更在佩戴舒适度上取得了显著突破。传统的蓝牙耳机,由于多采…

Spring Security Oauth2 JWT 添加额外信息

目录 一、问题描述 二、实现步骤 1、自定义TokenEnhancer 2、配置授权服务器 3、自定义UserDetails的User类 三、参考文档 一、问题描述 Oauth2里默认生成的JWT信息并没有用户信息,在认证授权后一般会返回这一部分信息,我对此进行了改造。 Oauth…

2024年数维杯数学建模A题思路

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…