Python----Python高级(函数基础,形参和实参,参数传递,全局变量和局部变量,匿名函数,递归函数,eval()函数,LEGB规则)
一、函数基础
1.1、函数的用法和底层分析
函数是可重用的程序代码块。
函数的作用,不仅可以实现代码的复用,更能实现代码的一致性。一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现。
在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封装,并增加了函数调用、传递参数、返回计算结果等内容。
1.2、函数简介
1.2.1函数的基本概念
一个程序由一个一个的任务组成;函数就是代表一个任务或者一个功能(function)。
函数是代码复用的通用机制
1.2.2、函数的分类

内置函数
我们前面使用的
str()、list()、len()等这些都是内置函数,我们可以拿来直接使用。标准库函数
我们可以通过
import语句导入库,然后使用其中定义的函数第三方库函数
Python社区也提供了很多高质量的库。下载安装这些库后,也是通过
import语句导入,然后可以使用这些第三方库的函数用户自定义函数
用户自己定义的函数,显然也是开发中适应用户自身需求定义的函数。今天我们学习的就是如何自定义函数。
1.2.3、 函数的定义和调用
实现某个功能的一段完整的代码code. 使用函数名称进行封装.以便 通过函数名调用,实现一次编写,多次调用的目的.
python语言中:封装函数尽量做到: 高内聚 低耦合 (只完成自己的 功能, 函数执行成功与失败,与别的内容无关)
自定义函数语法:
def 函数名(形式参数列表):
code # 函数体
return value
def add(a,b,c):# 执行三个数相加,并返回和sum=a+b+cprint(f'{a} {b} {c}三个数相加的和为:{sum}')return sum
add(10,20,30)


我们使用def来定义函数,然后就是一个空格和函数名称;
Python执行def时,会创建一个函数对象,并绑定到函数名变量上。
参数列表
圆括号内是形式参数列表,有多个参数则使用逗号隔开
定义时的形式参数不需要声明类型,也不需要指定函数返回值类型
调用时的实际参数必须与形参列表一一对应
return返回值
如果函数体中包含return语句,则结束函数执行并返回值;
如果函数体中不包含return语句,则返回None值。
调用函数之前,必须要先定义函数,即先调用def创建函数对象
内置函数对象会自动创建
标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句
二、形参和实参
形参和实参的要点:
- 圆括号内是形式参数列表,有多个参数则使用逗号隔开
- 定义时的形式参数不需要声明类型,也不需要指定函数返回值类型
- 调用时的实际参数必须与形参列表一一对应
def add(a, b): # a 和 b 是形参 return a + b result = add(5, 3) # 5 和 3 是实参
print(result) # 输出结果是 8
2.1、形参
定义:形参是函数定义时声明的变量,它们用来接收调用函数时传入的值。形参在函数内部使用,作用域是函数内部。
特点:
形参在函数定义时定义,通常是在函数头部括号内。
形参可以被视为占位符,用于代表将来的实际输入数据。
2.2、实参
定义:实参是调用函数时传入的实际值或变量。实参可以是字面量、变量、表达式、以及其他函数的返回值等。
特点:
实参是在函数调用时提供的,实际传递给函数的值。
实参的类型和数量需要和形参匹配。
三、函数的参数传递
3.1、位置参数
位置参数是最基本的参数传递方式,函数调用时参数的传递顺序必须与函数定义时的参数顺序一致
# 定义一个函数
def function(name, age, sex): # 需要传递三个参数print(f"姓名: {name}, 年龄:{age}, 性别: {sex}")# 调用这个函数
function("懒洋洋", 5, "Man")#姓名: 懒洋洋, 年龄:5, 性别: Man
3.2、关键字参数
关键字参数允许在调用函数时使用参数名来传递参数,这样可以不必考虑参数的顺序
# 定义一个函数 info: 做一个自我介绍
def info(name, age, score):print(f"my name is {name}, age: {age}, score: {score}")# 使用关键字去调用info 函数
info(age=18, score=100, name="小白")#my name is 小白, age: 18, score: 100
info("小白",score=90, age=6) # my name is 小白, age: 6, score: 90
3.3、缺省参数
缺省参数允许在定义函数时为某些参数提供默认值。如果在调用函数时没有提供这些参数的值,则使用默认值
# 定义一个函数 info: 做一个自我介绍
def info(name="某某某", age=18, score=100):print(f"my name is {name}, age: {age}, score: {score}")# 调用info函数
info() # info函数在调用的时候没有给出参数,则name,age, score使用的是默认值
info("小白") # 小白给出的是位置参数name的内容, age,score使用的是默认值
info(age=5, score=20) # age, score是关键字参数, name是没有给出值得.# name使用的是默认值参数info("小黑", age=10) # name是位置参数,age是关键字参数,score:默认值
info(age=18,"小白",score=20) # error :一旦使用了关键字参数,后面的内容就能再是# 位置参数了。
3.4、不定长参数
不定长参数允许在调用函数时传递任意数量的位置参数和关键字参数。这种参数在函数定义时使用
*args和**kwargs
3.4.1、*args
不定长位置参数使用
*args接收多个位置参数,参数以元组的形式传递
def info(name, age, *hobby): # hobby参数前面有一个*表示的是不定长参数。print(f"name:{name}, age: {age}")print(f"hobby : {hobby}")# hobby这个参数是一个元组print(f"{type(hobby)}")# 调用函数info # 小白 与 5 是位置参数,会给到name,age
# "足球", "篮球", "保龄球" 属于不定长参数,打包成元组,给到 hobby这个变量
info("小白", 5, "足球", "篮球", "保龄球")
# name:小白, age: 5
# hobby : ('足球', '篮球', '保龄球')
# <class 'tuple'>
print("*"*20)
info("小黑",10, "唱", "跳", "舞", "吃", "喝")
# name:小黑, age: 10
# hobby : ('唱', '跳', '舞', '吃', '喝')
# <class 'tuple'>
3.4.2、 **kwargs
不定长关键字参数使用
**kwargs接收多个关键字参数,参数以字典的形式传递
def info(name, age, **parent): # parent:不定长参数: 前面有**,会将键值对的# 形式的参数打包成字典print(f"name: {name}, age: {age}")print(f"parent: {parent}")print(f"parent: {type(parent)}")# 调用info函数
info("小白", 5, mother="母亲", father="父亲")
# name: 小白, age: 5
# parent: {'mother': '母亲', 'father': '父亲'}
# parent: <class 'dict'>
3.4.3、组合
def info(name, age, *hobby, **parent):print(f"name:{name}, age: {age}, hobby: {hobby}, parent:{parent}")print(f'{type(hobby)}')print(f'{type(parent)}')# 调用info函数
info("小白", 5, "唱","跳", "篮球", mother="母亲", father="父亲")
'''
name:小白, age: 5, hobby: ('唱', '跳', '篮球'), parent:{'mother': '母亲', 'father': '父亲'}
<class 'tuple'>
<class 'dict'>
'''# error,在* 与 **混用的时候,一旦使用了**传递键值对儿的时候,就不能再传递单个的参数了。
# info("小黑", 5, "唱", mother="母亲", father="父亲", "跳", "篮球")
四、函数的返回值
return返回值要点:如果函数体中包含
return语句,则结束函数执行并返回值如果函数体中不包含
return语句,则返回None值要返回多个值,使用列表、元组、字典、集合将多个值“存起来”即可
返回多个值,会将返回值的值打包成 一个元组。
定义一个函数,返回100 ~ 999之间的所有的水仙花数字。 水仙数数字有 4个:
def flower():# 定义一个列表,记录水仙花数字ls = []# 编写功能,找到这四个水仙花数字for number in range(100, 1000):g = number % 10s = (number // 10) % 10b = number // 100# 判断是不是水仙花数字if number == g**3 + s**3 + b**3:ls.append(number)# 出了循环以后,ls里面的内容就是4个水仙花数字a, b, c, d = ls[0], ls[1], ls[2], ls[3]return a, b, c, d# 接收函数的返回值 value1, value2, value3, value4 = flower() print(f"{value1}, {value2}, {value3}, {value4}")#153, 370, 371, 407result = flower() print(f"result : {result}")#result : (153, 370, 371, 407)
五、全局变量和局部变量
5.1、全局变量
在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块结束。
全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
global关键字作用: 声明使用的变量属于全局变量
global一般在函数的内部使用。
a = 100 #全局变量
def f1():global a #如果要在函数内改变全局变量的值,增加global关键字声明print(a) #打印全局变量a的值 a = 300 f1()#100
f1()#300
print(a)#300
5.2、局部变量
在函数体中(包含形式参数)声明的变量。
局部变量的引用比全局变量快,优先考虑使用
如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量
a=100
def f1():a = 3 #同名的局部变量print(a)f1()#3
print(a) #a仍然是100,没有变化
5.3、局部变量和全局变量效率测试
局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其是在循环的时候。
在特别强调效率的地方或者循环次数较多的地方,可以通过将全局变量转为局部变量提高运行速度。
import time
a = 1000
def test01():start = time.time()global afor i in range(100000000):a += 1end = time.time()print("耗时{0}".format((end-start)))
def test02():c = 1000start = time.time()for i in range(100000000):c += 1end = time.time()print("耗时{0}".format((end-start)))
test01()#耗时6.526300430297852
test02()#耗时5.019754648208618
print(globals())
5.4、nonlocal和global关键字

nonlocal 用来在内部函数中,声明外层的局部变量。
global 函数内声明全局变量,然后才使用全局变量
#测试nonlocal、global关键字的用法
a = 100
def outer():b = 10def inner():nonlocal b #声明外部函数的局部变量print("inner b:",b)#inner b: 10b = 20global a #声明全局变量a = 1000inner()print("outer b:",b)#outer b: 20
outer()
print("a:",a)#a: 1000
六、lambda表达式和匿名函数
lambda表达式可以用来声明匿名函数。lambda函数是一种简单的、在同一行中定义函数的方法。lambda函数实际生成了一个函数对象。
lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数的返回值。
lambda表达式的基本语法如下:lambda arg1,arg2,arg3... : <表达式>
arg1arg2arg3为函数的参数。<表达式>相当于函数体。运算结果是:表达式的运算结果。
七、嵌套函数
嵌套函数:在函数内部定义的函数!
def outer():print('outer')def inner():print('inner')inner()outer()
inner()就是定义在outer()函数内部的函数。inner()的定义和调用都在outer()函数内部
应用场景:
封装 - 数据隐藏
外部无法访问“嵌套函数”。
贯彻 DRY(Don’t Repeat Yourself) 原则
嵌套函数,可以让我们在函数内部避免重复代码。
闭包
八、递归函数
递归(recursion)是一种常见的算法思路,在很多算法中都会用到。比如:深度优先搜索(DFS:Depth First Search)等。
递归的基本思想就是“自己调用自己”
递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。每个递归函数必须包含两个部分:
终止条件
表示递归什么时候结束。一般用于返回值,不再调用自己。
递归步骤
把第n步的值和第n-1步相关联。
⚠️递归函数由于会创建大量的函数对象、过量的消耗内存和运算能力。在处理大量数据时,谨慎使用。
使用递归函数计算一个数字的阶乘:
n=5 def jiec(n):if n==1:return 1return n*jiec(n-1) print(jiec(5))#120
九、eval()函数
功能:将字符串
str当成有效的表达式来求值并返回计算结果。语法:eval(expression, globals=None, locals=None)
参数:
source:一个Python表达式或函数compile()返回的代码对象
globals:可选。必须是dictionary
locals:可选。任意映射对象
result = eval("2 + 3")
print(result) # 输出: 5x = 10
result = eval("x * 2")
print(result) # 输出: 20result = eval("max(5, 10, 15) + min(1, 2, 3)")
print(result) # 输出: 16x = 1
def my_func(): y = 2 # 使用eval执行局部变量 return eval("x + y", globals(), locals()) print(my_func()) # 输出: 3
⚠️⚠️⚠️
eval函数会将字符串当做语句来执行,因此会被注入安全隐患。比如:字符串中含有删除文件的语句。那就麻烦大了。因此,使用时候,要慎重!!!
安全性:使用
eval()可能存在安全风险,因为它会执行字符串中的任何 Python 代码。如果字符串来自不可信的来源(如用户输入),这可能导致代码注入风险。因此,在处理不安全的输入时,尽量避免使用eval()。性能:
eval()的执行效率相对较低,因为它会运行解析和执行,极有可能在性能敏感的场合造成瓶颈。替代方案:对于简单的数学表达式,可以使用
ast.literal_eval(),它安全地求值字面量表达式,如字典、列表、元组等,不会执行其他代码。
import ast str_expr = "[1, 2, 3, 4]"
result = ast.literal_eval(str_expr) # 安全地转换字符串为列表
print(result) # 输出: [1, 2, 3, 4]
十、LEGB规则

Local指的就是函数或者类的方法内部
Enclosed指的是嵌套函数(一个函数包裹另一个函数,闭包)
Global指的是模块中的全局变量
Built in指的是Python为自己保留的特殊名称
如果某个
name映射在局部local命名空间中没有找到,接下来就会在闭包作用域enclosed进行搜索,如果闭包作用域也没有找到,Python就会到全局global命名空间中进行查找,最后会在内建built-in命名空间搜索 (如果一个名称在所有命名空间中都没有找到,就会产生一个NameError)
#测试LEGB
s = "global"
def outer():s = "outer"def inner():s = "inner"print(s)inner()
outer()#inner
十一、学生管理系统(基于函数)
# 完成学生管理系统# 1.创建一个班级信息: 班级使用列表这个容器进行表示
class_info = []# 2. 定义一个python菜单函数
def print_menu():print("****************************")print("** 1. 增加学生 2. 删除学生 **")print("** 3. 修改学生 4. 查询学生 **")print("** 5. 显示所有学生信息 **")print("** 6. 退出学生管理系统 **")print("****************************")# 定义一个增加学生信息的函数
def add_student():"""student 使用字典数据类型进行描述;{"name": name,"age" : age,"score" : score}"""# 声明使用的是全局变量global class_info# 从键盘中输入学生的信息name = input("please input student name : >> ")age = int(input("please input student age : >> "))score = int(input("please input student score : >>"))# 需要对学生的信息进行验证# 对名字进行重名认证,如果重复名字了,就不让在添加信息# class_info = [{"name":name, "age":age, "score":score}, {},{}]# 使用for循环进行遍历for info in class_info:# 如果class_info里面有数据,则info是学生的个人信息if info["name"] == name:print("您输入的学生已经存在,添加学生失败")return -1# 对年龄判断if 0 > age > 100:print("您输入的年龄有误,添加学生失败")return -2# 对成绩的判断if 0 > score > 100:print("您输入的成绩有误,添加学生失败")return -3# 通过输入的信息组建成一个字典student = {"name": name, "age": age, "score": score}# 将学生信息加入到列表当中class_info.append(student)print(f"添加学生{name}信息成功")return 0# 删除学生
def remove_student():""" 删除学生信息 """# 1.global声明全局变量 class_infoglobal class_info# 2.根据学生姓名删除学生信息name = input("please input remove student name : >>")# 3.根据学生的姓名找到需要删除的学生for student in class_info:if student["name"] == name:# 通过姓名找到了需要删除的学生""" python 语言中列表可以根据值删除 remove """ret = input(f"您确定要删除{name}的信息吗?如果确认请输入yes or y")if ret == "yes" or ret == "y":class_info.remove(student)print("删除成功")return 0else:print("您的输入有误")return -1# for 循环结束, 代表了没有找到需要删除的学生print("您输入的学生不存在")return -2# 修改学生信息函数
def modify_student():""" 修改学生信息 """# 声明使用全局变量global class_info# 通过学生的学号对学生的信息进行修改: 列表将其下标当做学号number = int(input("please input student number >>"))# 判断学号是否正确if len(class_info) <= number < 0:print("您输入的学号有误")return -1# 根据学号修改相应的信息class_info[number]["name"] = input("请输入修改之后的学生姓名: ")class_info[number]["age"] = int(input("请输入修改之后的学生年龄 :"))class_info[number]["score"] = int(input("请输入修改之后的学生成绩 :"))print("修改学生成功")return 0# 定义一个查找学生的函数
def find_student():# 声明使用的变量是全局变量global class_info# 通过姓名查找学生的信息name = input("please input student name : >>")for info in class_info:if info["name"] == name:print(f"姓名: {info['name']}, age: {info['age']}, score:{info['score']}")return 0print("您输入的学生不存在")return -1# 显示所有的学生信息
def show_student():# 声明使用的是全局变量global class_infofor info in class_info:print(f"姓名: {info['name']}, age: {info['age']}, score:{info['score']}")def main():""" 学生管理系统主程序 """# 死循环管理学生系统while True:# 打印学生管理系统菜单print_menu()# 给出提示信息,让用户选择自己的操作choose = int(input("please input your choose"))match choose:case 1:add_student()case 2:remove_student()case 3:modify_student()case 4:find_student()case 5:show_student()case 6:print("bye~")breakcase _:print("您的输入有误,请重新输入")pass# 调用main函数执行程序
main()
十二、思维导图

相关文章:
Python----Python高级(函数基础,形参和实参,参数传递,全局变量和局部变量,匿名函数,递归函数,eval()函数,LEGB规则)
一、函数基础 1.1、函数的用法和底层分析 函数是可重用的程序代码块。 函数的作用,不仅可以实现代码的复用,更能实现代码的一致性。一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现。 在编写函数时…...
spring解决循环依赖的通俗理解
目录标题 1、什么是循环依赖2、解决循环依赖的原理3、Spring通过三级缓存解决循环依赖4、为什么要使用三级缓存而不是二级缓存?5、三级缓存中存放的是lambda表达式而不是一个半成品对象 1、什么是循环依赖 众所周知,Spring的容器中管理整个体系的bean对…...
用 Python 从零开始创建神经网络(十九):真实数据集
真实数据集 引言数据准备数据加载数据预处理数据洗牌批次(Batches)训练(Training)到目前为止的全部代码: 引言 在实践中,深度学习通常涉及庞大的数据集(通常以TB甚至更多为单位)&am…...
介绍PyTorch张量
介绍PyTorch张量 介绍PyTorch张量 PyTorch张量是我们在PyTorch中编程神经网络时将使用的数据结构。 在编程神经网络时,数据预处理通常是整个过程的第一步,数据预处理的一个目标是将原始输入数据转换为张量形式。 torch.Tensor类的实例 PyTorch张量…...
Vision Transformer (ViT)原理
Vision Transformer (ViT)原理 flyfish Transformer缺乏卷积神经网络(CNNs)的归纳偏差(inductive biases),比如平移不变性和局部受限的感受野。不变性意味着即使实体entity(即对象)的外观或位…...
移动云自研云原生数据库入围国采!
近日,中央国家机关2024年度事务型数据库软件框架协议联合征集采购项目产品名单正式公布,移动云自主研发的云原生数据库产品顺利入围。这一成就不仅彰显了移动云在数据库领域深耕多年造就的领先技术优势,更标志着国家权威评审机构对移动云在数…...
Unity中对象池的使用(用一个简单粗暴的例子)
问题描述:Unity在创建和销毁对象的时候是很消耗性能的,所以我们在销毁一个对象的时候,可以不用Destroy,而是将这个物体隐藏后放到回收池里面,当再次需要的时候如果回收池里面有之前回收的对象,就直接拿来用…...
linux命令行连接Postgresql常用命令
1.linux系统命令行连接数据库命令 psql -h hostname -p port -U username -d databasename -h 主机名或IP地址 -p 端口 -U 用户名 -d 连接的数据库 2.查询数据库表命令 select version() #查看版本号 \dg #查看用户 \l #查询数据库 \c mydb #切换…...
每日一题-单链表排序
为了对给定的单链表按升序排序,我们可以考虑以下解决方法: 思路 归并排序(Merge Sort):由于归并排序的时间复杂度为 O ( n log n ) O(n \log n) O(nlogn),并且归并排序不需要额外的空间(空…...
webpack04服务器配置
webpack配置 entryoutput filenamepathpublicPath 。。 打包引入的基本路径,,,比如引入一个bundle.js,。引用之后的路径就是 publicPathfilename -devServer:static : 静态文件的位置。。。hostportopencompress : 静态资源是否用gzip压缩hi…...
JDK下载安装配置
一.JDK安装配置。 1.安装注意路径,其他直接下一步。 2.配置。 下接第4步. 或者 代码复制: JAVA_HOME D:\Program Files\Java\jdk1.8.0_91 %JAVA_HOME%\bin 或者直接配置 D:\Program Files\Java\jdk1.8.0_91\bin 3.验证(CMD)。 java javac java -version javac -version 二.下…...
30_Redis哨兵模式
在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性…...
NLP三大特征抽取器:CNN、RNN与Transformer全面解析
引言 自然语言处理(NLP)领域的快速发展离不开深度学习技术的推动。随着应用需求的不断增加,如何高效地从文本中抽取特征成为NLP研究中的核心问题。深度学习中三大主要特征抽取器——卷积神经网络(Convolutional Neural Network, …...
《使用 YOLOV8 和 KerasCV 进行高效目标检测》
《使用 YOLOV8 和 KerasCV 进行高效目标检测》 作者:Gitesh Chawda创建日期:2023/06/26最后修改时间:2023/06/26描述:使用 KerasCV 训练自定义 YOLOV8 对象检测模型。 (i) 此示例使用 Keras 2 在 Colab 中…...
从MySQL迁移到PostgreSQL的完整指南
1.引言 在现代数据库管理中,选择合适的数据库系统对业务的成功至关重要。随着企业数据量的增长和对性能要求的提高,许多公司开始考虑从MySQL迁移到PostgreSQL。这一迁移的主要原因包括以下几个方面: 1.1 性能和扩展性 PostgreSQL以其高性能…...
服务器一次性部署One API + ChatGPT-Next-Web
服务器一次性部署One API ChatGPT-Next-Web One API ChatGPT-Next-Web 介绍One APIChatGPT-Next-Web docker-compose 部署One API ChatGPT-Next-WebOpen API docker-compose 配置ChatGPT-Next-Web docker-compose 配置docker-compose 启动容器 后续配置 同步发布在个人笔记服…...
51单片机 和 STM32 的烧录方式和通信协议的区别
51单片机 和 STM32 的烧录方式和通信协议的区别 1. 为什么51单片机需要额外的软件(如ISP)? (1)51单片机的烧录方式 ISP(In-System Programming): 51单片机通常通过 串口(…...
(STM32笔记)十二、DMA的基础知识与用法 第二部分
我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。 DMA的基础知识与用法 二、DMA传输设置1、数据来源与数据去向外设到存储器存储器到外设存储器到存储器 2、每次传输大小3、传…...
【优选算法篇】:模拟算法的力量--解决复杂问题的新视角
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:优选算法篇–CSDN博客 文章目录 一.模拟算法二.例题1.替换所有的问号2.提莫攻击3.外观数列4…...
探秘 JMeter (Interleave Controller)交错控制器:解锁性能测试的隐藏密码
嘿,小伙伴们!今天咱们要把 JMeter 里超厉害的 Interleave Controller(交错控制器)研究个透,让你从新手直接进阶成高手,轻松拿捏各种性能测试难题! 一、Interleave Controller 深度剖析 所属家族…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
C/Python/Go示例 | Socket Programing与RPC
Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流,会涉及到许多有意思的话题,诸如怎么确保对方能收到信息,怎么应对数据丢失、被污染或者顺序混乱,怎么提高…...
篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...


