-
模糊值函数积分的结构元表示及其性质
2020-05-28 06:29:36给出了限定运算的拓广定义并研究了其性质,利用模糊结构元理论,定义了模糊数值函数的积分,得到了模糊值函数的积分的解析表达式.研究结果表明:模糊数函数的积分具有限定可加性,不具有一般意义上的可加性,这是模糊积分... -
内联函数的意义和使用
2017-05-14 16:01:241. 内联函数 ...为这么一个小的操作定义一个函数的好处有: ① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多 ② 如果需要做任何修改,修改函数要比找出并修改每一处1. 内联函数
在C++中我们通常定义以下函数来求两个整数的最大值:
复制代码 代码如下:
int max(int a, int b)
{
return a > b ? a : b;
}为这么一个小的操作定义一个函数的好处有:
① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多
② 如果需要做任何修改,修改函数要比找出并修改每一处等价表达式容易得多
③ 使用函数可以确保统一的行为,每个测试都保证以相同的方式实现
④ 函数可以重用,不必为其他应用程序重写代码
虽然有这么多好处,但是写成函数有一个潜在的缺点:调用函数比求解等价表达式要慢得多。在大多数的机器上,调用函数都要做很多工作:调用前要先保存寄存器,并在返回时恢复,复制实参,程序还必须转向一个新位置执行
C++中支持内联函数,其目的是为了提高函数的执行效率,用关键字 inline 放在函数定义(注意是定义而非声明,下文继续讲到)的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开,假设我们将 max 定义为内联函数:
复制代码 代码如下:
inline int max(int a, int b)
{
return a > b ? a : b;
}则调用: cout<<max(a, b)<<endl;
在编译时展开为: cout<<(a > b ? a : b)<<endl;从而消除了把 max写成函数的额外执行开销
2. 内联函数和宏
无论是《Effective C++》中的 “Prefer consts,enums,and inlines to #defines” 条款,还是《高质量程序设计指南——C++/C语言》中的“用函数内联取代宏”,宏在C++中基本是被废了,在书《高质量程序设计指南——C++/C语言》中这样解释到:
3. 将内联函数放入头文件
关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用。
如下风格的函数 Foo 不能成为内联函数:
复制代码 代码如下:
inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{
...
}而如下风格的函数 Foo 则成为内联函数:
复制代码 代码如下:
void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{
...
}所以说,C++ inline函数是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了 inline 关键字,但我认为 inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。
定义在类声明之中的成员函数将自动地成为内联函数,例如:
复制代码 代码如下:
class A
{
public:
void Foo(int x, int y) { ... } // 自动地成为内联函数
}但是编译器是否将它真正内联则要看 Foo函数如何定义
内联函数应该在头文件中定义,这一点不同于其他函数。编译器在调用点内联展开函数的代码时,必须能够找到 inline 函数的定义才能将调用函数替换为函数代码,而对于在头文件中仅有函数声明是不够的。
当然内联函数定义也可以放在源文件中,但此时只有定义的那个源文件可以用它,而且必须为每个源文件拷贝一份定义(即每个源文件里的定义必须是完全相同的),当然即使是放在头文件中,也是对每个定义做一份拷贝,只不过是编译器替你完成这种拷贝罢了。但相比于放在源文件中,放在头文件中既能够确保调用函数是定义是相同的,又能够保证在调用点能够找到函数定义从而完成内联(替换)。
但是你会很奇怪,重复定义那么多次,不会产生链接错误?
我们来看一个例子:
A.h :
复制代码 代码如下:
class A
{
public:
A(int a, int b) : a(a),b(b){}
int max();private:
int a;
int b;
};A.cpp :
复制代码 代码如下:
#include "A.h"inline int A::max()
{
return a > b ? a : b;
}Main.cpp :
复制代码 代码如下:
#include <iostream>
#include "A.h"
using namespace std;inline int A::max()
{
return a > b ? a : b;
}int main()
{
A a(3, 5);
cout<<a.max()<<endl;
return 0;
}一切正常编译,输出结果:5
倘若你在Main.cpp中没有定义max内联函数,那么会出现链接错误:error LNK2001: unresolved external symbol "public: int __thiscall A::max(void)" (?max@A@@QAEHXZ)main.obj
找不到函数的定义,所以内联函数可以在程序中定义不止一次,只要 inline 函数的定义在某个源文件中只出现一次,而且在所有源文件中,其定义必须是完全相同的就可以。在头文件中加入或修改 inline 函数时,使用了该头文件的所有源文件都必须重新编译。
4. 慎用内联
内联虽有它的好处,但是也要慎用,以下摘自《高质量程序设计指南——C++/C语言》:
而在Google C++编码规范中则规定得更加明确和详细:
内联函数:
Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数.
定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.
优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.
缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。
结论: 一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!
另一个实用的经验准则: 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行).
有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 通常, 递归函数不应该声明成内联函数.(递归调用堆栈的展开并不像循环那么简单, 比如递归层数在编译时可能是未知的, 大多数编译器都不支持内联递归函数). 虚函数内联的主要原因则是想把它的函数体放在类定义内, 为了图个方便, 抑或是当作文档描述其行为, 比如精短的存取函数.-inl.h文件:
Tip: 复杂的内联函数的定义, 应放在后缀名为 -inl.h 的头文件中.
内联函数的定义必须放在头文件中, 编译器才能在调用点内联展开定义. 然而, 实现代码理论上应该放在 .cc 文件中, 我们不希望 .h 文件中有太多实现代码, 除非在可读性和性能上有明显优势.如果内联函数的定义比较短小, 逻辑比较简单, 实现代码放在 .h 文件里没有任何问题. 比如, 存取函数的实现理所当然都应该放在类定义内. 出于编写者和调用者的方便, 较复杂的内联函数也可以放到 .h 文件中, 如果你觉得这样会使头文件显得笨重, 也可以把它萃取到单独的 -inl.h 中. 这样把实现和类定义分离开来, 当需要时包含对应的 -inl.h 即可。
- 顶
- 2
-
mysql 函数依赖关系_边学边思考数据库中函数依赖与多值依赖的辨析
2021-01-21 04:07:50我们先复习下什么是函数:函数是发生在集合之间的一种对应关系(我喜欢用图理解) 数据库中讨论得比较多是非平凡函数依赖,而平凡意义不大) 因为成绩不是(学号,课程)的子集。 部分函数依赖:(学号,姓名)→ 性别 因为...我们先复习下什么是函数:函数是发生在集合之间的一种对应关系(我喜欢用图理解) 数据库中讨论得比较多是非平凡函数依赖,而平凡意义不大) 因为成绩不是(学号,课程)的子集。 部分函数依赖:(学号,姓名)→ 性别 因为(学号,姓名)→ 性别 且 学号 →
我们先复习下什么是函数:函数是发生在集合之间的一种对应关系(我喜欢用图理解)
数据库中讨论得比较多是非平凡函数依赖,而平凡意义不大)
因为成绩不是(学号,课程)的子集。
部分函数依赖:(学号,姓名)→ 性别
因为(学号,姓名)→ 性别 且 学号 → 性别
完全函数依赖:(学号,课程号)→ 成绩
因为(学号,课程号)→ 成绩,学号 —\→ 成绩,课程号 —\→ 成绩。
传递函数依赖: 学号 → 系主任
因为学号 → 系名,系名 → 系主任 且 系名 —\→ 学号。
而多值依赖呢?给出定义
多值依赖的定义:
设R(U)是一个属性集合U上的一个关系模式,X, Y, 和Z是U的子集,并且Z=U-X-Y,多值依赖X->->Y成立当且仅当对R的任一个关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关。
若X->->Y,而Z=空集,则称X->->Y为平凡的多值依赖。否则,称X->->Y为非平凡的多值依赖。
依然用函数的映射关系来理解,引入f(x,y),假设f(x,y)=+-(x^),若z=f(x,y),则一个x值可以得出两个互为相反数的z。在这个二元函数关系中,y的取值事实上是不影响结果的。类比到关系模式上,即x为X集的属性值,y为Y集的属性值,z为Z集的属性值。
看看一个例子
(课程C) ——(教师T)—(参考书B)
数据库概率 —顾国生老师——数学分析
数据库概率 —顾国生老师——高等代数
数据库概率 —顾国生老师——微分方程
上述例子U{C,T,B},其中课程C和教师T唯一确定一组B,却与T无关,经由C决定,然而T并不是空集,所以是非平凡的多值依赖。
事实上,当T为空的时候,如果C中的每一个值c对应B中的一个确定的值,则变为函数依赖,所以函数依赖是多值依赖的一种特殊情况。
总计下:
1. 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
2. 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。(例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立)
3. 函数依赖通常以集合抽闲出来讨论。
4. 数据库设计者根据需求对函数关系进行制定。例如认为“姓名→年龄”在特定表中可行。
5. 数据库设计者根据现实规定做强制要求。例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定
的函数依赖,若发现有同名人存在, 则拒绝装入该元组。
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
-
python如何调用c函数实现真正意义的多线程_python如何使用多线程执行多个函数?...
2021-01-29 18:57:52”于是,小编就给大家整理最细致,也是最简单的实现方法,方便大家理解学习,一起来看下吧~直接上代码,多线程同时执行多个函数代码如下:importtimeimportosimportthreadingdefopen_calc():withopen('test.txt','r'...之前小编给大家介绍了用python去返回了一个值,立马就有小伙伴跟小编留言说道“能都执行多个内容?”于是,小编就给大家整理最细致,也是最简单的实现方法,方便大家理解学习,一起来看下吧~
直接上代码,多线程同时执行多个函数代码如下:import time
import os
import threading
def open_calc():
with open('test.txt', 'r') as f:
for line in f.readlines():
while 'hello' in line:
os.system("calc.exe")
# 如果字符串已经出现并已经执行命令,则终止程序,否则会一直执行命令
return
# 等for循环判断完没有标识后再休眠重新调用该函数
print('没有找到启动标识:hello,等5秒再检测')
time.sleep(5)
# 再次调用函数
open_calc()
def open_mstsc():
with open('test.txt', 'r') as f:
for line in f.readlines():
while 'abc' in line:
os.system("mstsc.exe")
# 如果字符串已经出现并已经执行命令,则终止程序,否则会一直执行命令
return
# 等for循环判断完没有标识后再休眠重新调用该函数
print('没有找到启动标识:abc,等6秒再检测')
time.sleep(6)
# 再次调用函数
open_mstsc()
if __name__ == '__main__':
# 使用threading模块,threading.Thread()创建线程,其中target参数值为需要调用的方法,同样将其他多个线程放在一个列表中,遍历这个列表就能同时执行里面的函数了
threads = [threading.Thread(target=open_calc),
threading.Thread(target=open_mstsc)]
for t in threads:
# 启动线程
t.start()
知识拓展——多线程
l使用threading模块里面的Thread类创建出实例对象,然后通过start()方法真正的去产生一个新的线程。
l解释器中来执行代码的叫做主线程。
l通过start()方法创建出来的叫做子线程。
l主线程会等待子线程全部结束之后才会结束。
l当调用Thread的时候,不会创建线程,当调用Thread创建出来的实例对象的start()方法的时候才会创建线程以及让这个线程开始运行。
查看当前线程:
利用threading里面的enumerate()函数就能返回一个列表,当前的线程作为单个元素存放在列表之中。
以上就是实现的全部内容了哦~大家在做项目时候,可以直接调用呢~如果还想知道更多的python知识,可以到云海天教程网进行查询。
-
函数传出参数,用指针作为函数的传出参数实现多值返回
2010-11-06 23:30:00指针作为参数的实际意义中,最重要定的是可以实现多个“返回值”通过指针作为函数的传出参数可以实现函数的多值返回例如求阶乘的例子:#includeint Factorial(int input1) //计算传入参数input的阶乘{ int result ...指针作为参数的实际意义中,最重要定的是可以实现多个“返回值”
通过指针作为函数的传出参数可以实现函数的多值返回
例如
求阶乘的例子:
#include<stdio.h>
int Factorial(int input1) //计算传入参数input的阶乘
{
int result = 1;
int j;
if(input1 < 0)
{
printf("错误输入/n");
return -1;
}
if(0 == input1)
return result;
else
for(j = 1;j <= input1;j++)
{
result = result * j;
}
return result;
}int FactorialSum(int input2) //计算0!+1!+2!+...n!
{
int i;
int sum = 0;
if(input2 < 0)
return -1;
else
for(i = 0; i <= input2;i++)
{
sum += Factorial(i);
}
return sum;
}int Factorial2(int input3,int *sum) //使用传出参数,实现多值返回
{
int result;
int j;
*sum = 0;
result = Factorial(input3);
for(j = 0;j <= input3;j++)
{
*sum += Factorial(j);
}
return result;
}int main()
{
int input; //要输入的数据
int result; //单个数阶乘的结果
int sum; //从0!到n!的和的结果printf("Please input the number: ");
scanf("%d",&input);
result = Factorial(input);
printf("The Factorial of %d is %d/n",input,result);
sum = FactorialSum(input);
printf("The Facorial Sum from 0 to %d is: %d/n",input,sum);
result = Factorial2(input,&sum);
printf("The Facorial Sum from 0 to %d is: %d/n",input,sum);getchar();
getchar();
return 0;
}
-
函数柯里化的意义_函数柯里化是什么?
2021-01-03 17:00:49点击上方蓝色字体轻松关注前言在计算机科学中,柯里化(Currying),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。为什么会有函数... -
函数柯里化的意义_JavaScript函数柯里化详解
2020-12-21 06:32:23什么是柯里化柯里化是这样的一个转换过程,把接受多个参数的函数变换成接受一个单一参数(译注:最初函数的第一个参数)的函数,如果其他的参数是必要的,返回接受余下的参数且返回结果的新函数。柯理化函数思想:一个... -
php获取js函数返回的值_PHP多进程解析
2020-12-06 06:37:10我们都知道PHP是单进程执行的,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli模式下处理大量数据或运行后台DEMON守护进程时,多进程的优势不用多说... -
项目中常用的数组函数及对应的意义
2018-04-01 15:19:27平时在开发项目中常会用到很多数组函数,现在凭着印象将其写下来,尽管在网上可以很方便的找到。array_keys():返回数组中所有key。array_values():返回数组中所有值。array_count_values():统计数组中所有值出现的... -
关于单链表函数操作中return head的意义
2017-03-09 21:44:17关于单链表,有插入、删除、排序等很多操作,函数结束时,经常会用return head;来返回已经发生了改点的结点的值~~ return head; /*返回创建链表的头指针 */ ---头指针就是指向链表的首地址,返回首地址就... -
【Python专题】去重和选择唯一值的函数drop_duplicates、unique
2020-08-01 21:16:03去重有很多种方法,这里只是列举博主用过的几种。 一、函数.drop_duplicates DataFrame.drop_duplicates(subset=None, keep='first', inplace=False) 这个函数是对DataFrame格式的数据,去除特定列下面的重复行... -
C# 7中函数多值返回_转自InfoQ
2017-06-13 20:39:00和十年前第一版出版时一样,书中给出的原则在当前依然有指导意义。 API设计是最重要的。设计不好的API会在极大地增加软件缺陷,同时降低可重用性。 时刻牢记“良性循环”(Pit of Success)这一哲理:让正确的事情... -
gridlayout上部出现很多空白区域_使用Vookup函数总是出现错误值?盘点那些你一定踩过的坑...
2020-12-10 04:46:12但是为什么有时明明用检查窗口可以查询到的数据,vlookup函数却实现错误值?这篇文章就和朋友们一起盘点那些你一定踩过的坑。一.VLOOKUP简介:1.语法:VLOOKUP(查找值,查找区域,返回查找区域第N列,查找模式)2.各参数... -
python函数返回多个值并行训练_Python函数如何返回多个值并调用函数接收多个值,值及,多值,的,问题...
2021-01-29 11:43:361.python函数如何返回多个值Python函数的返回语句return严格意义上来说只能返回一个值,可以是任何类型,因此,可以通过返回一个“tuple”(定值表)类型值来间接达到返回多个值的目的。示例代码如下:def res ( x, y ... -
函数声明和函数的分文件编写
2021-02-07 18:03:20//提前告诉编译器函数的存在可以用函数的声明 //定义一个比较函数,比较两个整型函数,返回较大值 //eg函数声明: int max(int a, int b); /*函数主体可以放到main函数后面写, 但是提前告诉编译器这个函数是... -
分段函数是不是一定初等函数_查漏补缺问题64:一个含多参数分段函数的连续性与可导性讨论...
2020-12-25 00:42:50一个含多参数分段函数的连续性与可导性讨论题目: 设, 定义函数(1) 讨论当满足什么条件时,函数在0点连续。(2) 讨论当满足什么条件时,函数在0点可导。(3) 讨论当满足什么条件时,函数的导数在0点连续。注记: 本题... -
python中的fd函数_python-函数
2020-12-15 11:00:59初始函数意义:增强代码可读性降低代码冗余度函数的定义def 函数名(参数,参数):函数体return 返回值调用变量 = 函数名(实参,实参)变量就是函数的返回值返回值不写return # 默认返回None只写return # 表示函数结束... -
多参数构造函数
2011-03-23 13:06:14这这样的构造函数给调用者带来了很多的不便,会引起调用者分不清各个参数的意义,代码也不容易读。 另外一种方法是使用JavaBean。既是在构造函数中只给出必要的初始化参数,可选参数以setter的方式来设置,例如: ... -
python中匿名函数lamada函数的使用说明
2019-09-24 11:25:22lambda函数可以 接受多个任意参数,并且返回单个表达式的值。 它的意义在于即插即用类型,不必定义名字,方便。它需要的返回值就是冒号后面的表达式。们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着... -
论文研究-Copula函数在多因子模型系数估计中的应用.pdf
2019-09-20 18:00:50论文研究-Copula函数在多因子模型系数估计中的应用.pdf, 主要研究用多因子模型刻画金融资产收益率时, 因子载荷系数的合理估计问题.以因子系数的金融意义为出发点,并结合... -
指针作为函数的返回值、函数指针、类似多态
2021-01-29 17:38:01指针作为函数的返回值时,不要返回局部变量的地址,因为函数返回,局部变量空间被释放,值不确定。 函数指针: 定义 : 类型(*指针名)(要指向函数的所拥有的形参类型…) int (*func)(int,int); 需要注意的是:... -
单向散列函数的性质
2018-09-22 16:46:42首先,单向散列函数的输入必须能够是任意长度的消息。其次,无论输入多长的消息,单向散列函数必须都能够生成长度很短的散列值,如果消息越长生成的散列值越长的话就不好用了。从使用方便的角度,散列值的长度最好是... -
Sass Maps的函数
2016-08-29 17:09:00前面介绍了使用 map 来管理变量,但要在 Sass 中获取变量,或者对 map 做更多有意义的操作,我们必须借助于 map 的函数功能。在 Sass 中 map 自身带了七个函数: map-get($map,$key):根据给定的 key 值,返回 ... -
函数的形参和实参
2020-11-18 11:45:58调用的时候传递实参,函数的形参和实参是一 一对应的 fn(3,5); //3 5 多出来的实参无实际意义 也不会报错 fn(3,5,8); //3 5 如果没有传递某个参数,形参的值是undefined fn(3); //3 undefined ... -
sql中的常用函数
2015-05-07 15:24:05decode函数的逻辑意义其实类同于if判断语句。它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶... -
python内置函数判断一个值在一个范围里面_python高手养成记05:最详细的python函数教程...
2021-02-03 14:26:16上一篇:python高手养成记04:python的所有数据类型,一篇足矣题序上一篇文章中,小编介绍了python最经常用到的6种...这如果这样子搞,多没意义啊,本篇内容,小编就带各位同学来了解一下python中,有哪些美妙的函... -
python fd函数_python-函数
2021-01-15 01:25:38初始函数意义:增强代码可读性降低代码冗余度函数的定义def 函数名(参数,参数):函数体return 返回值调用变量 = 函数名(实参,实参)变量就是函数的返回值返回值不写return # 默认返回None只写return # 表示函数结束... -
C程序的组成单位——函数
2020-03-23 12:20:22函数概述 在解决大问题时,我们通常会把一个大问题分解成多个小问题,...传统意义上的函数: ①一个x值对应一个y值 ②输入一个x值给函数 ③函数利用这个x进行计算 ④把算的的结果赋值给y 而C语言中的函数可以这样... -
C语言的内联函数
2018-05-23 21:37:511.字符数组和字符串指针 (1)字符数组实际上是一系列字符的集合,也就是字符串(String)。...在很多编译器下,局部数据的初始值都是随机的、无意义的,而不是我们通常认为的“零”值。这一点非常... -
PHP数组的排序函数
2014-08-08 13:52:00在PHP中提供了很多函数可以对数组进行排序,这些函数提供了多种排序的方法。例如,可以通过元素的值或键及自定义排序等。 ①简单的数组排序函数简单的数组排序,是对一个数组元素的值进行排序,PHP的sort()函数和...
-
PHP超全局变量
-
CentOS 7 下修改主机名
-
JAVA 异常
-
元素周期表-three.js实战详解
-
MySQL你该了解的那些事【服务端篇】
-
从 Notbook 到 JupyterLab, 再配上代码帮手 Kite
-
XSS检测点处理
-
具有超窄带宽的稳定锁模纳秒无Chi脉冲产生
-
docker基本使用教程, 以及docker部署flask框架示例
-
【学习札记NO.00004】Linux Kernel Pwn学习笔记 I:一切开始之前
-
美团外卖Android平台化架构演进实践
-
异常色散光纤激光器中的线性耗散孤子
-
Python 处理 JSON 必要时我选择 ujson 和 orjson
-
MySQL Router 实现高可用、负载均衡、读写分离
-
C++代码规范和Doxygen根据注释自动生成手册
-
阿里集团八年容器化演进之路
-
Golang零基础-->高级编程
-
自动化测试Python3+Selenium3+Unittest
-
FastDFS 分布式文件系统部署
-
2021-02-25