Lua基础语法(下)

news/2026/1/23 21:10:20/文章来源:https://www.cnblogs.com/luatos/p/19524035

九、函数

9.1 初识函数

函数是指一段在一起的、可以做某一件事儿的程序,也叫做子程序。

在前面的内容中,我们已经接触过了函数的调用,这个函数就是前面用到了很多次的print(...)。

调用函数只需要按下面的格式即可:

函数名(参数1,参数2,参数3,......)

为何要使用函数?因为很多事情都是重复性操作,我们使用函数,可以快速完成这些操作

下面我们举一个最简单的函数例子,这个函数没有传入参数、没有返回值

它实现了一个简单的功能,就是输出Hello world!:
image

这个函数名为hello,我们可以按下面的方法进行调用(执行):
image

这行代码会输出Hello world!。

同时,在Lua中,函数也是一种变量类型,也就是说,hello实际上也是一个变量,里面存储的是一个函数,我们可以用下面的代码来理解:
image
因为函数只是个变量,你甚至在一开始可以这样声明hello函数:
image

下面你需要做一件简单的事情:

新建一个函数变量biu,使其执行后会打印biubiubiu这个字符串,

新建一个函数变量pong,使其与biu指向的函数相同
image

9.2 local变量

之前我们创建的变量,都是全局变量,这种变量在代码运行周期从头到尾,都不会被销毁,而且随处都可调用。

但是当我们代码量增加,很多时候大量新建全局变量会导致内存激增,我们需要一种可以临时使用、并且可以自动销毁释放内存资源的变量,要怎么解决呢?

我们可以使用local标志来新建临时变量,使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。

参考下面的代码:
image

上面的代码中,n就是一个局部变量,它只在这个funcion中有效,并且函数运行完后会自动回收这部分的内存。

我们应该尽可能的使用局部变量,以方便lua虚拟机自动回收内存空间,同时减少资源占用提高运行速度。

下面请阅读以下代码,思考一下,正确的输出结果是什么:
image

9.3 函数参数

在前几章的使用中,我们知道函数是可以传入参数的,如print(123)

那么,我们如何编写可以传入参数的函数呢?可以按下面的模板来写
image

这里传入的参数,等价于在函数内部新建了一个local的变量,修改这些数据不会影响外部的数据(除了后面还没有讲到的table等类型)

举个例子,比如下面的函数,可以实现打印出两个传入值的和:

image
这段代码其实等价于:
image
下面问题来了,请设计一个函数p,可以按下面的调用方式来打印出物体的密度:
image

9.4 函数返回值

在前面的代码中,我们实现了一个函数,输入变量a、b,函数会自动输出两个数值的和。

但是一般来说,我们的需求远远不止这些,我们可能需要一个如下功能的函数:

执行函数,输入两个值,获取这两个值的和

如果还是按上面几节的内容,我们只会输出这个值,并不能把这个值传递给其他的变量进行后续使用,如何解决这个需求呢?

我们可以使用函数的返回值来实现这个需求,结合上面的需求,我们可以用下面的代码实现:

image

这里的return表示返回一个值,并且立刻结束这个函数的运行

同时,和输入值可以有多个一样,返回值也可以有多个
image
下面问题来了,请设计一个函数p,可以按下面的调用方式来返回出物体的密度,返回值为number类型:
image

9.5 判断三角形合法性2(自测题)

你需要使用前面几章的知识,来完成下面的题目

已知三个number类型的变量,分别代表三根木棒的长度

请判断,使用这三根木棒,是否可以组成一个三角形(两短边之和大于第三边)

请新建一个函数triangle,并可以用如下形式调用(如果可以组成,就返回true):
image

9.6 返回多个值(自测题)

你需要使用前面几章的知识,来完成下面的题目

已知2个number类型的变量,分别代表一个长方体的长和宽

请计算这个长方形的周长和面积

请新建一个函数rectangle,并可以用如下形式调用:
image

十、table

10.1 认识数组

数组,使用一个变量名,存储一系列的值

很多语言中都有数组这个概念,在Lua中,我们可以使用table(表)来实现这个功能

在Lua中,table是一个一系列元素的集合,使用大括号进行表示,其中的元素之间以逗号分隔,类似下面的代码:
image
我们可以直接使用元素的下标,来访问、或者对该元素进行赋值操作。

在上面的table变量t中,第一个元素的下标是1,第二个是2,以此类推。

我们可以用变量名+中括号,中括号里加上下标,来访问或更改这个元素,如下面的例子:
image
以上就是table最简单的一个例子了,就是当作数组来用(注意,一般语言中的数组基本都为不可变长度,这里的table为可变长度)

下面你需要完成:

新建一个table,名为cards,存入1-10十个数字

将第3个元素与第7个元素交换

将第9个元素与第2个元素交换

增加第11个变量,值为23
image

10.2 简单table

上一节里,我们将table来表示数组,实际上,table中可以包括任意类型的数据

比如我们可以在table中放置number和string数据,类似下面的代码:

image

我们甚至能在里面放function变量

image

这些table访问每个元素的方式仍然是直接用下标,并且也能用下标来进行修改

下面你需要完成:

新建一个table,名为funcList,并实现以下功能

调用funcList1,返回a和b的乘积

调用funcList2,返回a减b的差

调用funcList3,返回a的相反数(-a)
image

10.3 table下标

在前两节,我们的table都只是一些简单的List(列表),每个元素的下标都是自动从1排列的

实际上,Lua中,下标可以直接在声明时进行指定,像下面这样:
image

下面你需要:

  • 新建一个变量t,并按下面的格式声明

  • 下标为1的元素,值为123(number)

  • 下标为13的元素,值为"abc"(string)

  • 下标为666的元素,值为"666"(string)

image

10.4 下标进阶

在上一节,我们学习了如何自定义下标,其实在Lua中,下标也可以是字符串,如下面的例子
image

可见,在使用string作为下标时,table的灵活性提升了一个数量级。

string作为下标时,也可以动态赋值:
image

下面你需要完成:

  • 新建table变量t

  • 下标为apple的元素,值为123(number)

  • 下标为banana的元素,值为"abc"(string)

  • 下标为1@1的元素,值为"666"(string)
    image

10.5 table小测验

下面的代码,将会打印什么?
image

10.6 table小测验2

下面的代码,将会打印什么?
image

10.7 Lua全局变量与table

在前面我们知道了,在table中,可以直接用table名[下标]或table名.string下标来访问元素

实际上,在Lua中,所有的全局变量全部被存放在了一个大table中,这个table名为:_G

我们可以用下面的例子来示范:
image
现在,你明白为什么说万物基于table了吧?

你需要完成下面的任务:

已知有一个全局变量,名为@#$

请新建一个变量result

将@#$变量里的值赋值给result
image

10.8 table小测试3

请新建一个名为t的table,满足以下要求

t[10]可获得number类型数据100

t.num可获得number类型数据12

t.abc[3]可获得string类型数据abcd

t.a.b.c可获得number类型数据789

image

10.9 table.concat

table.concat (table [, sep [, i [, j ] ] ])

将元素是string或者number类型的table,每个元素连接起来变成字符串并返回。

可选参数sep,表示连接间隔符,默认为空。

i和j表示元素起始和结束的下标。

下面是例子:

image

请完成下面的任务:

  • 已知table变量t,

  • 将t中的结果全部连起来

  • 间隔符使用,

  • 并使用print打印出来

image

10.10 table删减

table.insert (table, [pos ,] value)

在(数组型)表 table 的 pos 索引位置插入 value,其它元素向后移动到空的地方。pos 的默认值是表的长度加一,即默认是插在表的最后。

table.remove (table [, pos])

在表 table 中删除索引为 pos(pos 只能是 number 型)的元素,并返回这个被删除的元素,它后面所有元素的索引值都会减一。pos 的默认值是表的长度,即默认是删除表的最后一个元素。

下面是例子:
image

请完成下面的任务:

已知table变量t,

去除t中的第一个元素

然后这时,在t的第三个元素前,加上一个number变量,值为810
image

十一、循环

11.1 while循环

在实际功能实现中,经常会遇到需要循环运行的代码,比如从1到100填充table数据,我们可以直接用循环语句来实现

我们首先来学习while这个循环语法,整体的格式如下:
image
下面举一个例子,我们计算从1加到100的结果:
image

上面的代码,就是当num≤100时,result不断地加num,并且num每次循环后自己加1

理解了上面的代码,我们来完成下面一个简单的任务吧:

已知两个number类型的变量min和max

请计算从min与max之间,所有3的倍数的和

打印出结果
image

11.2 for循环

for循环在某些程度上,和while循环很相似,但是for循环可以更加简洁地表达中间累积的量

我们首先来学习for这个循环语法,整体的格式如下:
image

其中,步长可以省略,默认为1

临时变量名可以直接在代码区域使用(但不可更改),每次循环会自动加步长值,并且在到达结束值后停止循环

下面举一个例子,我们计算从1加到100的结果:
image

上面的代码,就是当i≤100时,result不断地加i,并且i每次循环后增加1

理解了上面的代码,我们来完成下面一个简单的任务吧:

  • 已知两个number类型的变量min和max

  • 请计算从min与max之间,所有7的倍数的和

  • 打印出结果
    image

11.3 中断循环

前面我们学习了循环语句,有些时候循环运行到一半,我们不想再继续运行了,怎么办呢?

我们可以在一个循环体中使用break,来立即结束本次循环,继续运行下面的代码

比如像下面这样,计算1-100相加途中,小于100的最大的和:

image

可以看见,当发现和大于100后,代码立即把result的值还原到了加上当前数字之前的状态,并且调用break语句,立即退出了本次循环

在while中,我们也可以使用break:
image

我们在这里直接使用了死循环(因为while的继续运行判断依据始终为true),整体逻辑也和之前for的代码一致,当发现和大于100后,代码立即把result的值还原到了加上当前数字之前的状态,并且调用break语句,立即退出了本次循环

现在你需要完成一项任务:

  • 请求出小于变量max的13的倍数的最大值(max大于0)

  • 并将结果打印出来

  • 本题理论上不用循环就能实现,但是为了练习一下技巧,请用for循环来实现

image

11.4 循环测试题1(自测题)

前面我们学习了循环语句,我们需要完成下面的任务

我们知道,print函数可以打印一行完整的输出

那么,已知变量a,请打印出下面的结果:

(a为大于0的整数,且需要输出a行数据,数据从1开始,每行与上一行的差为2)
image
做题区域:
image

11.5 循环测试题2(自测题)

我们需要完成下面的任务

那么,已知变量a,请打印出下面的结果:

(a为大于0的整数,且需要输出a行数据,第一行为一个,后面每行多一个)
image
做题区域:
image

11.6 循环测试题3(自测题)

我们需要完成下面的任务

那么,已知变量a,请打印出下面的结果:

(a为大于0的整数,且需要输出a行数据,按图示规律输出)

image

做题区域:
image

11.7 循环测试题4(自测题)

有一只猴子,第一天摘了若干个桃子 ,当即吃了一半,但还觉得不过瘾 ,就又多吃了一个。

第2天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。

以后每天早上都吃了前一天剩下的一半加天数个(例如,第5天吃了前一天剩下的一半加5个)。

到第n天早上再想吃的时候,就只剩下一个桃子了。

那么,已知变量a为最后一天的天数,请打印出第一天的桃子数。

如:a为5时,输出114

做题区域:

image

十二、详解string库

12.1 string.sub

接下来几节会讲解string库的各种接口
image
返回字符串 s 中,从索引 i 到索引 j 之间的子字符串。

i 可以为负数,表示倒数第几个字符。

当 j 缺省时,默认为 -1,也就是字符串 s 的最后位置。

当索引 i 在字符串 s 的位置在索引 j 的后面时,将返回一个空字符串。

下面是例子:
image
值得注意的是,我们可以使用冒号来简化语法,像下面这样:
image

请完成下面的任务:

已知字符串变量s,请分别打印出(每种一行):

s从第4个字符开始,到最后的值

s从第1个字符开始,到倒数第3个字符的值

s从倒数第5个字符开始,到倒数第2个字符的值
image

12.2 string.rep

string.rep(s, n)

返回字符串 s 的 n 次拷贝。

示例代码:

image
请完成下面的任务:

打印一行数据,数据内容为810个114514

image

12.3 string.len

string.len(s)

接收一个字符串,返回它的长度。

示例代码:
image

请完成下面的任务:

新建一个变量s,使数据内容为810个114514

并打印出字符串s的长度
image

12.4 大小写转换

string.lower(s)

接收一个字符串 s,返回一个把所有大写字母变成小写字母的字符串。

string.upper(s)

接收一个字符串 s,返回一个把所有小写字母变成大写字母的字符串。

示例代码:
image

请完成下面的任务:

已知一个变量s,打印出全是大写字母的s字符串
image

12.5 string.format

string.format(formatstring, ...)

按照格式化参数formatstring,返回后面...内容的格式化版本。

编写格式化字符串的规则与标准 c 语言中 printf 函数的规则基本相同:

它由常规文本和指示组成,这些指示控制了每个参数应放到格式化结果的什么位置,及如何放入它们。

一个指示由字符%加上一个字母组成,这些字母指定了如何格式化参数,例如d用于十进制数、x用于十六进制数、o用于八进制数、f用于浮点数、s用于字符串等。

示例代码:

image
请完成下面的任务:

已知一个变量n,为number类型整数

打印出n:连上n值的字符串
image

12.6 string的本质

这一节我们来讲解字符串的本质

字符串,是用来存储一串字符的,但是它的本质就是一串数字。如何用一串数字来代表一串字符呢?

在计算机中,每一个符号都对应着一个数字,但是在讲解这个知识之前,我们了解一下补充知识:
image
接下来,你需要了解,每一个符号都对应着一个数字,比如:

0对应着0x30、1对应着0x31 a对应着0x61、b对应着0x62 A对应着0x41、B对应着0x42

上面的编码规则,我们称之为ascii码,具体想了解可以打开下面的网址查看:

http://ascii.911cha.com/

当然,1字节最大为0xff,即256,只能存下一部分符号,大部分的中文按某些编码,一个中文占用2或3个字节

计算机如何解析这些数据,我们不需要了解,当你知道了上面的知识后,你应该可以理解下面的描述:
image
同时,lua的字符串中可以保存任何数值,即使是0x00这种不代表任何含义的数,也可以保存
image

比如下面的描述:
image

下面你需要思考一个问题:一串字符串数据如下,它的实际内容是什么(指人能看见的字符串内容,如abcd)?

0x62,0x61,0x6e,0x61,0x6e,0x61

12.7 string.char

string.char (...)

接收 0 个或更多的整数(整数范围:0~255),返回这些整数所对应的 ASCII 码字符组成的字符串。当参数为空时,默认是一个 0。

如果上一章节有认真学习过了的话,这段话应该是很好理解的。实质上就是把计算机认识的一串数字,变成字符串变量,并且字符串内的数据就是要存的那串数据。

示例代码:

image

请完成下面的任务:

已知一个字符串的每个字符在数组t中按顺序排列

请根据t的值,打印出字符串内容(一行数据)

注:这个字符串存储的不一定是可见的字符
image

12.8 string.byte

string.byte(s [, i [, j ] ])

返回字符 s[i]、s[i + 1]、s[i + 2]、······、s[j] 所对应的 ASCII 码。i 的默认值为 1,即第一个字节,j 的默认值为 i 。

这个函数功能刚好和前面的string.char相反,是提取字符串中实际的数值。

示例代码:

image

请完成下面的任务:

已知字符串s

请把s中代表的数据,全部相加,并打印出来
image

12.9 string.find

string.find(s, p [, init [, plain] ])

这个函数会在字符串s中,寻找匹配p字符串的数据。如果成功找到,那么会返回p字符串在s字符串中出现的开始位置和结束位置;如果没找到,那么就返回nil。

第三个参数init默认为1,表示从第几个字符开始匹配,当init为负数时,表示从s字符串的倒数第-init个字符处开始匹配。

第四个参数plain默认为false,当其为true时,只会把p看成一个字符串对待。

可能你会奇怪,第四个参数有什么存在的必要吗?p不是本来就应该是个字符串吗? 实际上,lua中的匹配默认意义是正则匹配,同时,这里的正则与其它语言也有些许不同。

由于篇幅有限,本节和下面的几节涉及匹配内容时,均不会考虑正则的使用方法,Lua正则教程将会在最后几节单独详细地列出来。

第四个参数为true时,便不会使用正则功能。

示例代码:
image
请完成下面的任务:

  • 已知字符串s,里面有很多相同的字符串

  • 请找出字符串s中,所有字符串awsl的位置

  • 使用print打印结果,结果一行一个

  • 如字符串12awslawslaw,输出3和7
    image

12.10 string.gsub

string.gsub(s, p, r [, n])

将目标字符串s中所有的子串p替换成字符串r。

可选参数n,表示限制替换次数。

返回值有两个,第一个是被替换后的字符串,第二个是替换了多少次。

特别提示:这个函数的目标字符串s,也是支持正则的

下面是例子:

image

同样的,我们也可以使用冒号来简化语法,像下面这样:

image

请完成下面的任务:

已知字符串变量s,请分别打印出(每种一行):

把字符串s中,前5个a,替换为b

把字符串s中,前3个c,替换为xxx

把结果打印出来,一行数据

image

正则匹配相关内容等待更新

十三、跨文件调用

在编写代码时,随着逻辑逐渐复杂,我们的代码量也会变大。虽然有函数可以把一部分代码逻辑封装起来,但是所有代码都放到一个文件里,显然也不是个好办法。

所以我们需要将一些代码放到不同文件中,通过文件来区分这些代码的功能。

比如我们有下面这个函数:
image

我们新建一个文件叫tools.lua,把这个函数放进去,现在,整个文件如下面这样:

tools.lua
image
现在,我们封装的这个函数就能在其他文件里被调用了,具体代码如下:
image

当调用了require接口后,Lua虚拟机会自动加载你调用的文件,执行文件的内容,然后返回你文件里return的结果。

为了更好地理解这段话,我们可以看下面两个文件,其中run.lua是被运行的那个入口文件

test.lua

image

run.lua
image

同时,每个文件最多只会被require一次,如果有多个require,只有第一次会执行

待添加
table -> sort排序

string -> 正则、gsub、find、match

迭代器 for xx in xx 、string.gmatch

元表

coroutine

↓各种接口↓
math库

os库

io库

位运算 (>> <<)

杂项接口

debug库

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

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

相关文章

结课设计.

1.配置本地光盘镜像为yum源2.测试网络连通性3.安装php4.安装nginx5.安装数据库6.数据库配置创建luntan数据库修改密码7.设置论坛安装文件并赋予权限修改第42行的路径8.查询ip9.安装论坛软件

学长亲荐2026 MBA论文写作TOP10 AI论文网站

学长亲荐2026 MBA论文写作TOP10 AI论文网站 2026年MBA论文写作工具测评&#xff1a;精准筛选&#xff0c;高效助力 随着人工智能技术的持续发展&#xff0c;越来越多的MBA学生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的平台&#xff0c;如何选择真…

科研AI模型复现难到崩溃?5个关键注意事项,一次复现成功!

点赞、关注、收藏。不迷路 做AI科研的兄弟姐妹们&#xff0c;谁没被模型复现折磨过&#xff1f; 照着顶刊论文逐行敲代码&#xff0c;却死活跑不出相同结果&#xff1b;作者给的参数模糊不清&#xff0c;调了几十组还是差好几个百分点精度&#xff1b;环境配置踩坑无数&#x…

跨学科搞不定?AI+材料科学案例拆解,实验效率翻10倍!

点赞、关注、收藏。不迷路 做材料科学科研的兄弟姐妹们&#xff0c;是不是被跨学科搞怕了&#xff1f; 明明知道AI能提速材料研发&#xff0c;却卡在“材料知识AI技术”衔接不上&#xff1a;不懂Python代码&#xff0c;想做性能预测无从下手&#xff1b;材料筛选全靠“试错法”…

Postgres常见命令

Postgres常见命令启动、关闭、重启PG_HOME=/backup01/.../dbtune/postgres-13.6 PG_DATA=$PG_HOME/data PG_BIN=$PG_HOME/bin PG_PORT=5432# start.sh $PG_BIN/pg_ctl -D "$PG_DATA" -o "-p $PG_PORT&q…

6.1.1.1 大材料方法论与实践指南-Spark/Flink 任务开发规范

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

训练时一套,线上跑一套?离线训练与在线服务数据一致性这坑,我替你踩过了

训练时一套&#xff0c;线上跑一套&#xff1f; 离线训练与在线服务数据一致性这坑&#xff0c;我替你踩过了 做大数据、搞推荐、玩风控、折腾机器学习的朋友&#xff0c;大概率都遇到过一个极其隐蔽、但杀伤力极强的问题&#xff1a;模型离线评估好得一塌糊涂&#xff0c;一上…

08 判断语句

布尔对象布尔对象只有两种取值:True和False布尔表达式

文件或者文件夹存在但是删除提示项目文件不存在解决方法

方法一&#xff1a;F5刷新一下文件夹&#xff0c;可能是缓存问题方法二&#xff1a;方法一不行说明不是文件夹缓存问题&#xff0c;可以试试下面脚本方法强制删除第一步、复制以下文字到记事本DEL /F /A /Q \\?\%1RD /S /Q \\?\%1第二步、将记事本文件另存为.bat文件第三步、…

AI Agent之一:不可能三角

从一篇文章聊起 Anthropic的论文building-effective-agents&#xff0c;是2024年10月发布的一篇解析Workflow和AI Agent关系的论文&#xff0c;详细解读可参考如何构建智能体。 从这篇论文能看出&#xff0c;2024年Workflow仍是主流&#xff0c;AI Agent尚未普及&#xff0c;…

控油防脱洗发水怎么选?2026十大良心国货洗发水Top榜,成分功效全解析

在头皮护理日益精细化的当下,控油蓬松洗发水成为刚需品类,但多数消费者在选购时容易陷入“只看宣传不看成分”的误区。事实上,一款优质的控油蓬松洗发水,需兼顾“控油机理合理性、成分安全性、功效持久性”三大核心…

《实时渲染》第2章-图形渲染管线-2.4光栅化

光栅化是将投影后的三角形图元转换为屏幕像素的过程,包含三角形设置和三角形遍历两个子阶段,用于确定像素覆盖并生成带插值属性的片元。实时渲染 2. 图形渲染管线 2.4 光栅化 顶点及其关联的着色数据(全部来自几何处…

奇正沐古:B2B锂电行业权威靠谱的品牌营销战略咨询公司

摘要:2022 年起,奇正沐古与嘉盛环境达成品牌营销战略咨询合作,针对嘉盛环境面临的锂电周期风险、低价竞争等困境,奇正沐古量身打造全链路解决方案,围绕 “123 集团战略” 顶层设计,明确全球转轮除湿领导品牌定位…

深入解析:Fastlane 结合 开心上架(Appuploader)命令行版本实现跨平台上传发布 iOS App 免 Mac 自动化上架实战全解析

深入解析:Fastlane 结合 开心上架(Appuploader)命令行版本实现跨平台上传发布 iOS App 免 Mac 自动化上架实战全解析2026-01-23 21:03 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; …

2026珠海儿童青少年专业配镜与近视防控指南

在珠海,为孩子选择专业的配镜与近视防控服务机构,是每位家长关心的大事。专业的服务不仅意味着清晰的视力,更关乎孩子长期的视觉健康发育与有效的近视管理。那么,在珠海,哪里能为儿童青少年提供专业且防控效果好的…

3大技术路线对决!2026标杆款控油防脱洗发水测评,植萃专利款领跑

控油防脱洗发水的功效差异,本质是技术路线的选择不同——植萃专利路线侧重温和长效,生物科技路线主打精准起效,经典配方路线追求稳定适配。本次测评聚焦三大主流技术路线,筛选6款热门产品,深度解析不同技术的优劣…

在淘宝天猫,一大批商家正通过服务获得增长

【潮汐商业评论/文】 “店铺经营5年仅1单仅退款纠纷&#xff0c;还是平台兜底承担了损失。”福来岛创始人Rose姐在复盘2025年经营数据时&#xff0c;语气感慨。 这个2020年才入驻天猫的初创珠宝品牌&#xff0c;在同行纷纷感慨“电商内卷、利润见底”的当下&#xff0c;凭一己…

FTP 图片上传 AOI图片

注意:图片压缩,15MB,压缩到600kb。保存格式调一下。只保存NG图片,不保存OK图片。 方案1: ftp server: http://filezilla-project.org/ ftp client: FluentFtp(C#) http://github.com/dorisoy/FluentFTP 方案2: h…

《人月神话》阅读笔记第二篇

人月神话的谬误与工作量估算 “人月神话”是布鲁克斯在书中提出的核心谬误,即认为软件开发的工作量可以通过“人数时间”来精准估算,增加人手就能按比例缩短项目周期。这一观点看似符合直觉,却与软件开发的实际规律…

tcp server windows xp 杭州项目

心跳包 为Windows XP量身定制:.NET Framework 3.5 XP专用版 windows xp专用版本的.net framework3.5 在windows xp上面测试截图: 系统对接,接口编写规范 tcp server怎么通用化? 服务端和客服端的json解析怎么标…