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

Dart语法上

一、Dart介绍及环境

1.1 Dart介绍:

  • Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用 和物联网等领域的开发。
  • Dart诞生于2011年,号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视。 要学Flutter的话我们必须首先得会Dart。
  • 官网:https://dart.dev/

1.2 Dart环境搭建:

  • 要在我们本地开发Dart程序的话首先需要安装Dart Sdk
  • 官方文档:Get the Dart SDK | Dart
    • windows(推荐): Dart for Windows
    • mac:如果mac电脑没有安装brew这个工具首先第一步需要安装它: https://brew.sh/
brew tap dart-lang/dart        
brew install dart

1.3 Dart 开发工具:

  • Dart的开发工具有很多: IntelliJ IDEA 、 WebStorm、 Atom、Vscode等
  • 这里我们主要给大家讲解的是如果在VSCode中配置Dart。

1、找到vscode插件安装dart

2、找到vscode插件安装code runner ; Code Runner 可以运行我们的文件

1.4 Hello Dart

  • 使用VSCode,新建文件夹及Dart文件,运行输出(快捷键: Control+Option+N)
main() {print("Hello World");
}

二、Dart常量、变量、命名规则

2.1 Dart 变量:

  • dart是一个强大的脚本类语言,可以不预先定义变量类型 ,自动会类型推倒
  • dart中定义变量可以通过var关键字可以通过类型来申明变量

如:

    var str    = 'this is var';String str = 'this is var';int str    = 123;
  • 注意: var 后就不要写类型 ,写了类型不要var 两者都写 var a int = 5; 报错

2.2 Dart 常量: final 和 const修饰符

  • const值不变 一开始就得赋值
  • final 可以开始不赋值 只能赋一次 ; 而final不仅有const的编译时常量的特性,最重要的它是运行时常量,并且final是惰性初始化,即在运行时第一次使用前才初始化
  • 永远不改量的量,请使用final或const修饰它,而不是使用var或其他变量类型。
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere

2.3 Dart的命名规则:

1.变量名称必须由数字、字母、下划线和美元符($)组成。

2.注意:标识符开头不能是数字

3.标识符不能是保留字和关键字。

4.变量的名字是区分大小写的如: age和Age是不同的变量。在实际的运用中,也建议,不要用一个单词大小写区分两个变量。

5、标识符(变量名称)一定要见名思意 :变量名称建议用名词,方法名称建议用动词

三、Dart数据类型

3.1 Dart中支持以下数据类型:

  • 常用数据类型:
    • Numbers(数值): int、double
    • Strings(字符串): String
    • Booleans(布尔): bool
    • List(数组): 在Dart中,数组是列表对象,所以大多数人只是称它们为列表
//1、第一种定义List的方式var l1=["张三",20,true];print(l1);  //[张三, 20, true]print(l1.length);  //3print(l1[0]); //张三print(l1[1]); //20//2、第二种定义List的方式 指定类型var l2=<String>["张三","李四"];print(l2);var l3 = <int>[12, 30];print(l3);//3、第三种定义List的方式  增加数据 ,通过[]创建的集合它的容量可以变化var l4 = [];print(l4);print(l4.length);l4.add("张三");l4.add("李四");l4.add(20);print(l4);print(l4.length);var l5 = ["张三", 20, true];l5.add("李四");l5.add("zhaosi");print(l5);// 4、第四种定义List的方式//  var l6=new List();  //在新版本的dart里面没法使用这个方法了var l6=List.filled(2, "");  //创建一个固定长度的集合print(l6);print(l6[0]);l6[0]="张三";   //修改集合的内容l6[1]="李四";print(l6);  //[张三, 李四]l6.add("王五");  //错误写法  通过List.filled创建的集合长度是固定  没法增加数据//通过List.filled创建的集合长度是固定var l7 =List.filled(2, "");print(l7.length);l7.length=0;  //修改集合的长度   报错var l8=<String>["张三","李四"];print(l8.length);  //2l8.length=0;  //可以改变的print(l8);  //[]var l9=List<String>.filled(2, "");l9[0]="string";// l8[0]=222;print(l9);
      • 1、字面量定义List
      • 2、指定类型定义List
      • 3、通过[]创建的集合它的容量可以可以变化,增加数据
      • 4、创建一个固定长度的集合 List.filled(2, "")
    • Maps(字典): 通常来说,Map 是一个键值对相关的对象。 键和值可以是任何类型的对象。每个键只出现一次,而一个值则可以出现多次
void main(){//第一种定义 Maps的方式var person={"name":"张三","age":20,"work":["程序员","送外卖"]};print(person);print(person["name"]);print(person["age"]);print(person["work"]);//第二种定义 Maps的方式var p=new Map();p["name"]="李四";p["age"]=22;p["work"]=["程序员","送外卖"];print(p);print(p["age"]);
}
      • 1、字面量定义Maps
      • 2、创建空的Map(),Key Value形式增加数据
  • 项目中用不到的数据类型 (用不到):
    • Runes
      • Rune是UTF-32编码的字符串。它可以通过文字转换成符号表情或者代表特定的文字。
 main() {var clapping = '\u{1f44f}';print(clapping);print(clapping.codeUnits);print(clapping.runes.toList());Runes input = new Runes('\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');print(new String.fromCharCodes(input));}
    • Symbols
      • Symbol对象表示在Dart程序中声明的运算符或标识符。您可能永远不需要使用符号,但它们对于按名称引用标识符的API非常有用,因为缩小会更改标识符名称而不会更改标识符符号。要获取标识符的符号,请使用符号文字,它只是#后跟标识符:
  • 在 Dart 中符号用 # 开头来表示,入门阶段不需要了解这东西,可能永远也用不上。

3.2 Dart类型判断

Dart中用 is 关键词来判断类型

void main(){var str='1234';if(str is String){print('是string类型');}else if(str is int){print('int');}else{print('其他类型');}
}

四、Dart运算符、条件判断、类型转换

4.1 Dart运算符:

  • 算术运算符
    • +    -    *    /     ~/ (取整)     %(取余)
  • 关系运算符
    • ==    !=   >    <    >=   
  • 逻辑运算符
    • !  &&   ||
  • 赋值运算符
    • 基础赋值运算符   =   ??=
int b = 6;
b??=23;  表示如果b为空的话把 23赋值给b
    • 复合赋值运算符   +=  -=  *=   /=   %=  ~/=
  // ~/= 取整等于var num = 16;num ~/= 5;print(num);
  • 条件表达式 
    • if  else;  switch case 
  • 三目运算符
    • ??运算符:

4.2 类型转换

  • 1、Number与String类型之间的转换    
    • Number类型转换成String类型 toString()
    • String类型转成Number类型 int.parse()
      String str='123';var myNum1=int.parse(str);print(myNum1); //123print(myNum1 is int);//trueString str2='123.1';var myNum2=double.parse(str2);print(myNum2); //123.1print(myNum2 is double); // true
    • 可以采用try ...catch,防止发生问题
    // try  ... catchString price='';try{var myNum=double.parse(price);print(myNum);}catch(err){print(0);} 
  • 2、其他类型转换成Booleans类型
    • isEmpty:判断字符串是否为空
    • == 0: 判断是否为0
    • == null: 判空
    • isNaN: 判断非数字值

五、Dart循环语句、for循环、do-while循环、break和continue

5.1 ++、--

  • 在赋值运算里面,如果++ -- 写在前面;这时候先运算再赋值,如果++ --写在后面:先赋值后运行运算
    var a1=10;var b1=a1++;print(a1);  //11print(b1);  //10var a2=10;var b2=++a2;print(a2);  //11print(b2);  //11

5.2 for 循环

  • 定义一个二维数组 打印里面的内容
List list=[{"cate":'国内',"news":[{"title":"国内新闻1"},{"title":"国内新闻2"},{"title":"国内新闻3"}]},{"cate":'国际',"news":[{"title":"国际新闻1"},{"title":"国际新闻2"},{"title":"国际新闻3"}]}];
  • for循环使用
        for(var i=0;i<list.length;i++){print(list[i]["cate"]);print('-------------');for(var j=0;j<list[i]["news"].length;j++){print(list[i]["news"][j]["title"]);}}

5.3 while循环/ do-while循环

    while(表达式/循环条件){      }     do{语句/循环体}while(表达式/循环条件);

注意: 1、最后的分号不要忘记

2、循环条件中使用的变量需要经过初始化

3、循环体中,应有结束循环的条件,否则会造成死循环。

    var j=10;   do{print('执行代码');}while(j<2);

5.4 break和continue

  • break语句功能:

1、在switch语句中使流程跳出switch结构。

2、在循环语句中使流程跳出当前循环,遇到break 循环终止,后面代码也不会执行

    • 强调:

1、如果在循环中已经执行了break语句,就不会执行循环体中位于break后的语句。

2、在多层循环中,一个break语句只能向外跳出一层

    • break可以用在switch case中 也可以用在 for 循环和 while循环中
  var sex="男";switch (sex) {case "男":print('男');break;case "女":print('男');break;default:}
  • continue语句的功能:
    • 【注】只能在循环语句中使用,使本次循环结束,即跳过循环体重下面尚未执行的语句,接着进行下次的是否执行循环的判断。
    • continue可以用在for循环以及 while循环中,但是不建议用在while循环中,一不小心容易死循环
    for(var i=1;i<=10;i++){if(i==4){continue;  /*跳过当前循环体 然后循环还会继续执行*/}print(i);}
  • 六、Dart中List、Set、Map、forEach/map/where/any/every

6.1 List里面常用的属性和方法:

  • 常用属性:

length 长度

reversed 翻转

isEmpty 是否为空

isNotEmpty 是否不为空

  • 常用方法:

add 增加

addAll 拼接数组

indexOf 查找 传入具体值

remove 删除 传入具体值

removeAt 删除 传入索引值

fillRange(start,end,[fillValue]) 修改 ,从start索引开始,到end索引结束,填充[fillValue]中的值, 不包含end索引.

insert(index,value); 指定位置插入

insertAll(index,list) 指定位置插入List

toList() 其他类型转换成List

join(String) List通过括号中的String拼接成字符串

split(String) 字符串通过(String)拆分成List

forEach 循环遍历的简写

map 根据条件对原始数据进行修改并返回

where 根据给定限定条件进行过滤

any 只要集合里面有满足条件的就返回true

every 每一个都满足条件返回true,否则返回false

//fillRange的使用List myList=['香蕉','苹果','西瓜'];myList.fillRange(1, 2,'aaa');  //修改print(myList);//[香蕉, aaa, 西瓜]myList.fillRange(1, 3,'aaa');  print(myList);//[香蕉, aaa, aaa]//insert的使用myList.insert(1,'aaa');      //插入  一个print(myList);//[香蕉, aaa, aaa, aaa]myList.insertAll(1, ['aaa','bbb']);  //插入 多个print(myList);//[香蕉, aaa, bbb, aaa, aaa, aaa]
  • 根据众多语法的相通性. 这里forEach、map、where、any、every的理解相对容易,只不过是换了个名字.
//1. forEach遍历
List myList=['香蕉','苹果','西瓜'];
myList.forEach((value){print("$value");});//2.map 根据条件对List进行修改
List myListMap=[1,3,4];      
var mapList=myListMap.map((value){return value*2;
});
print(mapList.toList()); //[2, 6, 8]
//3.where: 根据给定限定条件,过滤
List whereList=[1,3,4,5,7,8,9];
var newList=whereList.where((value){return value>5;
});
print(newList.toList());//[7, 8, 9]
//4.any: 只要集合里面有满足条件的就返回true
List anyList=[1,3,4,5,7,8,9];
var anyValue=anyList.any((value){   //只要集合里面有满足条件的就返回truereturn value>5;
});
print(anyValue);
//5.every: 每一个都满足条件返回true  否则返回false
List myList=[1,3,4,5,7,8,9];
var everyValue=myList.every((value){   //每一个都满足条件返回true  否则返回falsereturn value>5;
});
print(everyValue);

6.2 Set

  • 用它最主要的功能就是去除数组重复内容
  • Set是没有顺序且不能重复的集合,所以不能通过索引去获取值
 var s1=new Set();s1.add('香蕉');s1.add('苹果');s1.add('苹果');print(s1);   //{香蕉, 苹果}print(s1.toList()); //[香蕉, 苹果]List myList=['香蕉','苹果','西瓜','香蕉','苹果','香蕉','苹果'];var s2=new Set();s2.addAll(myList);print(s2);            //{香蕉, 苹果, 西瓜}print(s2.toList());   //[香蕉, 苹果, 西瓜]s2.forEach((value)=>print(value)));

6.3 Map

  • 字典结构在forEach时,遍历key-value
Map person={"name":"张三","age":20
};
person.forEach((key,value){            print("$key---$value");
});
/*
name---张三
age---20
*/

七、函数的定义、可选参数、默认参数、命名参数

7.1 内置方法/函数

    • 例如: print();

7.2 自定义方法:

    • 自定义方法的基本格式:
      返回类型  方法名称(参数1,参数2,...){方法体return 返回值;}
  • 自定义一些方法
void printInfo() {print('一个自定义方法');
}
int getNumber(){var myNumber = 123;return myNumber;
}
String printUserInfo(){return 'this is string';
}
List getList(){return ['121','123','125'];
}
    • 调用自定义方法
printInfo();
var n = getNumber();
print(n);
print(printUserInfo());
print(getList());

7.3 方法的作用域

  • 在方法A内部可以再定义方法B,但是B方法只能在方法A作用域内使用
void aMethod(){aaa(){print(getList());print('aaa');    }aaa();
}
//调用方法
aMethod();

7.4 调用方法传参

7.4.1、定义一个方法 求1到这个数的所有数的和

int sumNum(int num){var sum = 0;for(var i = 1;i <= n;i++){sum += i;    }return sum;
}
var n1 = sumNum(5);
print(n1);
var n2 = sumNum(100);
print(n2);

7.4.2 定义一个方法然后打印用户信息

String printUserInfo(String username, int age){//行参return "姓名: $username --- 年龄: $age";
}
print(printUserInfo("张三",20));//实参

7.4.3 定义一个带可选参数的方法

  • 最新的dart定义可选参数需要指定类型默认值
  • [int age] 表示age为可选参数
String printUserInfo(String username, [int age = 0]){//行参if (age != 0){return "姓名:$username --- 年龄: $age";    }return "姓名:$username --- 年龄保密";
}
print(printUserInfo("李四",28));
print(printUserInfo("王五"));

7.4.4 定义一个带默认参数的方法

  • 在可选参数列表中,对参数进行初始化赋值.
String printUserInfo(String username,[String sex="男",int age=0]){//行参if (age != 0){return "姓名:$username --- 性别:$sex --- 年龄:$age";    }return "姓名:$username --- 性别: $sex --- 年龄保密";
}
print(printUserInfo("张三"));
print(printUserInfo("莉丝","女"));
print(printUserInfo("莉丝","女", 26));

7.4.5 定义一个命名参数的方法

  • 最新的dart定义命名参数需要指定类型默认值
String printUserInfo(String username,{int age = 0,String sex = '男'}){//行参if (age != 0){return "姓名:$username --- 性别: $sex --- 年龄: $age";    }return "姓名:$username --- 性别: $sex --- 年龄保密";
}
print(printUserInfo("钩陈",age: 20, sex: '未知'));

7.4.6 实现一个把方法当作参数的方法

  • 调用fn2这个方法,把fn1这个方法当作参数传入.
var func=() {print("我是一个匿名方法");
};
func();
//fn1方法
fn1(){print("function one");
}
//fn2方法
fn2(func){func();
}
//调用fn2这个方法,把fn1这个方法当作参数传入.
fn2(fn1);
    • 调用结果
我是一个匿名方法
fn1

八、箭头函数、匿名方法、闭包

8.1 箭头函数

  • 箭头函数是一种缩写形式

案例1:

  List list=['苹果','香蕉','西瓜'];list.forEach((value){print(value);});list.forEach((value)=>print(value));
  • 注意和方法的区别: 箭头函数内只能写一条语句,并且语句后面没有分号(;)
list.forEach((value)=>{print(value)
});

案例2: 修改下面List里面的数据,让数组中大于2的值乘以2

List list1 = [4,1,2,3,4];
var mapList1 = list1.map((value){if (value > 2){return value * 2;   } return value;
});
print(mapList1.toList()); //[8, 1, 2, 6, 8]
var mapList2=list1.map((value)=> value > 2 ? value*2:value);
print(mapList2.toList());//[8, 1, 2, 6, 8]

案例3:

  • 1、定义一个方法isEvenNumber来判断一个数是否是偶数.
//1、定义一个方法isEvenNumber来判断一个数是否是偶数
bool isEvenNumber(int n){if (n % 2 == 0) {return true;    }return false;
}
  • 2、定义一个方法打印1-n以内的所有偶数.
printNum(int n){for (var i = 1; i <= n; i++){if (isEvenNumber(i)) {print(i);        }    }
}
printNum(10);

8.2 匿名函数&自执行方法&方法的递归

  • 首先定义一个获取整型数的方法
int getNum(int n){return n;
}
print(getNum(12));

8.2.1 匿名函数

  • 形如 (){}; 的函数
var printNumber = () {print(12345);  
};
printNumber();

8.2.2 自执行方法

((int n){print(n*2);print("这是自执行方法");
})(123);

8.2.3 方法的递归

var suma = 1;
fua(int n){suma *= n;if (n == 1) {return;    }fna(n - 1);
}
fna(5);
print(suma);//1*2*3*4*5 = 120

案例4: 通过方法的递归,求1-100的和

var sum = 0;
fn(int n){sum += n;if (n == 0) {return;    }fn(n-1);
}
fn(100);
print(sum);//5050

8.3 闭包

8.3.1 闭包的由来

  • 1、全局变量特点: 全局变量常驻内存、全局变量污染全局.
  • 2、局部变量的特点: 不常驻内存会被垃圾机制回收、不会污染全局.
  • 想实现的功能:

1.常驻内存

2.不污染全局

  • 因此产生了闭包,闭包可以解决这个问题.....
    • 闭包: 函数嵌套函数, 内部函数会调用外部函数的变量或参数, 变量或参数不会被系统回收(不会释放内存)
    • 闭包的写法:函数嵌套函数,并return 里面的函数,这样就形成了闭包。

8.3.2 全局变量

var a = 123;
void main(){print(a);func(){a++;print(a);    }func();//124func();//125func();//126
}

8.3.3 局部变量

printInfo(){var myNum = 234;myNum++;print(myNum);
}
printInfo();//235
printInfo();//235
printInfo();//235

8.3.4 闭包

funcClosure(){var a = 345;//不会污染全局,常驻内存return (){a++;print(a);    };
}
var para = funcClosure();
para();//346
para();//347
para();//348

相关文章:

Dart语法上

一、Dart介绍及环境 1.1 Dart介绍&#xff1a; Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用 和物联网等领域的开发。Dart诞生于2011年&#xff0c;号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视。 要学…...

SignOff Criteria——POCV(Parametric OCV) introduction

文章目录 1. O v e r v i e w Overview Overview2. P O C V A n a l y s i s POCV\ Analysis POCV Analysis3. P O C V F l o w POCV\ Flow POCV Flow4. P O C V R e p o r t POCV\ Report POCV Report 1. O v e r v i e w Overview Overview P r o c e s s v a r i a t i…...

Android 内存分析(java/native heap内存、虚拟内存、处理器内存 )

1.jvm 堆内存(dalvik 堆内存) 不同手机中app进程的 jvm 堆内存是不同的&#xff0c;因厂商在出厂设备时会自定义设置其峰值。比如,在Android Studio 创建模拟器时&#xff0c;会设置jvm heap 默认384m , 如下图所示&#xff1a; 当app 进程中java 层 new 对象(加起来总和)占用…...

产品思维与工程师思维

目录标题 什么是产品思维用户痛点体验价值 产品思维与工程师思维有什么区别&#xff1f;产品需要什么能力洞察需求的能力逻辑思维能力成本意识 场景化思维和用户体验数据分析和售后服务数据分析服务大多数用户原则 什么是产品思维 产品思维就是考虑产品的方方面面&#xff0c;…...

Android---启动速度优化

App 启动流程 1. 点击桌面 App 图标&#xff0c;Launcher 进程采用 Binder IPC 向 system_server 进程发起 startActivity 请求 &#xff1b; 2. system_server 进程接收到请求后&#xff0c;向 zygote 进程发送创建进程的请求&#xff1b; 3. zygote 进程 fork 出新的子进程…...

使用 Mercury 直接从 Jupyter 构建 Web 程序

动动发财的小手&#xff0c;点个赞吧&#xff01; 有效的沟通在所有数据驱动的项目中都至关重要。数据专业人员通常需要将他们的发现和见解传达给利益相关者&#xff0c;包括业务领导、技术团队和其他数据科学家。 虽然传达数据见解的传统方法&#xff08;如 PowerPoint 演示文…...

Python基础(二)

目录 一、类型转换 1、为什么需要数据类型转换 2、数据类型转化的函数 3、str()函数类型转换使用 4、int()函数类型转换使用 4.1int()不能将str类型数据转换成int 4.2int()将bool类型转换成int 4.3int()将float转换成int 5、Float()函数类型转换使用 5.1Float()函数不…...

第41讲:Python循环语句中的break-else语法结构

文章目录 1.在循环正常结束后执行动作的思路2.通过控制布尔值变量的方式在循环正常结束后执行某些操作2.1.while循环语句2.2.for-in循环语句3.通过else从句来执行某些操作1.在循环正常结束后执行动作的思路 在执行while循环语句或者for循环语句时,如果循环是正常结束的,非执…...

双系统-真机安装ubuntu

服务器系统最好选择legacy启动mbr硬盘,数据盘可以使用gpt格式,超过2t的只能用gpt。 华为2288v3用uefi找不到启动硬盘,或者是找到硬盘后无法引导,迁移系统得到有efi引导文件的硬盘也不行,选择用legacy吧。 ubuntu默认uefi启动,若使用legacy,则需要easybcd处理一下引导。 …...

Android实现向facebook回复消息代码

以下是一个示例代码&#xff0c;它基于Facebook SDK版本5.0&#xff0c;具体实现如下&#xff1a; 1. 集成Facebook SDK库 下载Facebook SDK并将其加入到Android Gradle构建文件中&#xff0c;像这样&#xff1a; groovy dependencies { implementation com.facebook.an…...

IDEA小技巧-Git的回滚强推代码找回

标题IDEA小技巧-Git的回滚&&强推&&代码找回 本地未Commit 新增文件 delete 变更文件 rollback 第一种方式 第二种方式 切换默认变更列表 Commit未push undo commit 仅适用于最后一次的提交进行回滚 drop commit 回滚 revert commit revert commi…...

即时通讯为什么不采用UDP的连接方式呢

即时通讯为什么不采用UDP的连接方式呢 博主今天从网络上找了几个比较关注的热点的内容进行讲解 1.首先介绍一下UDP连接的缺点 不可靠&#xff1a;UDP是一种无连接的传输协议&#xff0c;它不提供数据包的可靠传输保证。这意味着当使用UDP进行通信时&#xff0c;数据包可能会丢…...

二叉树(纲领篇)

文档阅读 文档阅读 二叉树解题的思维模式分两类&#xff1a; 1、是否可以通过遍历一遍二叉树得到答案&#xff1f;如果可以&#xff0c;用一个 traverse 函数配合外部变量来实现&#xff0c;这叫「遍历」的思维模式。 2、是否可以定义一个递归函数&#xff0c;通过子问题&a…...

day41—选择题

文章目录 1.某主机的IP 地址为 180.80.77.55&#xff0c;子网掩码为 255.255.252.0。若该主机向其所在子网发送广播分组&#xff0c;则目的地址可以是&#xff08;D&#xff09;2.ARP 协议的功能是&#xff08;A&#xff09;3.以太网的MAC 协议提供的是&#xff08;A&#xff0…...

Vue3 watch 监听对象数组中对象的特定属性

在 Vue 3 中&#xff0c;可以使用 watch 函数来监听对象数组中对象的特定属性。可以通过在回调函数中遍历数组来检查对象的特定属性是否发生变化&#xff0c;并在变化发生时执行相应的操作。 一、监听对象的特定属性 例如&#xff0c;假设有一个名为 items 的对象数组&#x…...

请求策略库alova小记

官方文档地址&#xff1a;https://alova.js.org/zh-CN/get-started/overview 定义 alova是一个简单编码即可实现特定场景的高效请求的请求策略工具。 场景痛点 现在一般的请求场景&#xff0c;一般分为两个部分&#xff1a; 请求部分。一般用axios等库触发http请求&#xf…...

[C++]string的使用

目录 string的使用&#xff1a;&#xff1a; 1.string类介绍 2.string常用接口说明 string相关习题训练&#xff1a;&#xff1a; 1.仅仅反转字母 2.找字符串中第一个只出现一次的字符 3.字符串里面最后一个单词的长度 4.验证一个字符串是否是回文 5.字符串相加 6.翻转字符串…...

Kali Linux 操作系统安装详细步骤——基于 VMware 虚拟机

1. Kali 操作系统简介 Kali Linux 是一个基于 Debian 的 Linux 发行版&#xff0c;旨在进行高级渗透测试和安全审计。Kali Linux 包含数百种工具&#xff0c;适用于各种信息安全任务&#xff0c;如渗透测试&#xff0c;安全研究&#xff0c;计算机取证和逆向工程。Kali Linux 由…...

R语言APSIM模型应用及批量模拟实践技术

查看原文>>>基于R语言APSIM模型高级应用及批量模拟实践技术 目录 专题一、APSIM模型应用与R语言数据清洗 专题二、APSIM气象文件准备与R语言融合应用 专题三、APSIM模型的物候发育和光合生产模块 专题四、APSIM物质分配与产量模拟 专题五、APSIM土壤水平衡模块 …...

破解马赛克有多「容易」?

刷短视频时&#xff0c;估计大家都看过下面这类视频&#xff0c;各家营销号争相曝光「一分钟解码苹果笔刷背后内容」的秘密。换汤不换药&#xff0c;自媒体们戏称其为「破解马赛克」&#xff0c;殊不知让多少不明真相的用户建立起了错误的认知&#xff0c;也让苹果笔刷第 10086…...

【.NET基础加强第八课--委托】

.NET基础加强第八课--委托 委托&#xff08;Delegate&#xff09;委托操作顺序实例多播委托—委托链实例实例委托传值 委托&#xff08;Delegate&#xff09; 委托&#xff08;Delegate&#xff09; 是存有对某个方法的引用的一种引用类型变量 委托操作顺序 1,定义一个委托类…...

jetcache:阿里这款多级缓存框架一定要掌握

0. 引言 之前我们讲解了本地缓存ehcache组件&#xff0c;在实际应用中&#xff0c;并不是单一的使用本地缓存或者redis&#xff0c;更多是组合使用来满足不同的业务场景&#xff0c;于是如何优雅的组合本地缓存和远程缓存就成了我们要研究的问题&#xff0c;而这一点&#xff…...

干货 | 如何做一个简单的访谈研究?

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 心理学中研究中&#xff0c;大家常用的研究方法大多是实验法、问卷调查法等&#xff0c;这些均是定量研究。 其实&#xff0c;作为质性研究中常用的访谈法&#xff0c;可对个体的内心想法进…...

4年外包出来,5次面试全挂....

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…...

基于遗传算法优化的核极限学习机(KELM)分类算法-附代码

基于遗传算法优化的核极限学习机(KELM)分类算法 文章目录 基于遗传算法优化的核极限学习机(KELM)分类算法1.KELM理论基础2.分类问题3.基于遗传算法优化的KELM4.测试结果5.Matlab代码 摘要&#xff1a;本文利用遗传算法对核极限学习机(KELM)进行优化&#xff0c;并用于分类 1.KE…...

评判需求优先级5大规则和方法(纯干货):

在划分用户需求时&#xff0c;需秉承需求任务紧跟核心业务指标&#xff0c;按照一定的规则和方法进行优先级的划分。 常见评判需求优先级规则有&#xff1a;四象限法则、KANO模型、二八原则、产品生命周期法、ROI评估法。 一、四象限法则 四象限法则是以【重要】和【紧急】程度…...

c++ 11标准模板(STL) std::vector (七)

定义于头文件 <vector> template< class T, class Allocator std::allocator<T> > class vector;(1)namespace pmr { template <class T> using vector std::vector<T, std::pmr::polymorphic_allocator<T>>; }(2)(C17…...

Contest3137 - 2022-2023-2 ACM集训队每月程序设计竞赛(1)五月月赛

A 1! 5! 46 169 有一种数字&#xff0c;我们称它为 纯真数。 它等于自身每一个数位的阶乘之和。请你求出不超过n的所有 纯真数。(注&#xff1a;纯真数不含有前导0&#xff09;数据范围1e18 纯真数只有四个&#xff0c;注意0!1 1,2,145,40585 int n;cin>>n;int res[]{…...

如何使用 YOLOv8 神经网络检测图像中的物体

对象检测是一项计算机视觉任务,涉及识别和定位图像或视频中的对象。它是许多应用的重要组成部分,例如自动驾驶汽车、机器人和视频监控。 多年来,已经开发了许多方法和算法来查找图像中的对象及其位置。执行这些任务的最佳质量来自使用卷积神经网络。 YOLO 是这项任务最流行的…...

Python每日一练:小艺读书醉酒的狱卒非降序数组(详解快排)

文章目录 前言一、小艺读书二、醉酒的狱卒三、非降序数组总结 前言 今天这个非降序数组&#xff0c;阅读解理小学水平&#xff0c;说起来都是泪啊。我折腾了一天都没搞定&#xff0c;从冒泡写到快速排序。换了几种都还不行&#xff0c;我又给快排加上插入排序。结果还是不能全…...