JavaScript函数基础(通俗易懂篇)

10.函数

10.1 函数的基础知识

为什么会有函数?

在写代码的时候,有一些常用的代码需要书写很多次,如果直接复制粘贴的话,会造成大量的代码冗余;

函数可以封装一段重复的javascript代码,它只需要声明一次,就可以多次调用;

冗余代码:

  • 冗余:多余的重复或啰嗦内容

  • 缺点:

    • 代码重复,可阅读性差

    • 不易维护,如果代码逻辑变了,所有地方的代码都要跟着改,效率太低了

函数使用分为两步:声明函数 和 调用函数

10.2函数的使用

10.2.1 声明函数

函数声明的语法:

var 是用来声明变量的, 函数是用function来声明的,一个函数一般是用来做一件事情的。

function 函数名 (){//函数体
}
//例如:
function sayHi(){console.log("Hi~~")
}

注意:

  • function 声明函数的关键字,必须小写

  • 函数是做某件事情,函数名一般是动词,如:sayHi

  • 函数不调用自己不执行

10.2.2 调用函数

调用函数的语法:

函数名();

函数体只有在调用的时候才会执行,调用需要()进行调用。可以调用多次

示例代码:

// 声明函数
function sayHi (){// 函数体console.log("Hi!!");
}
// 调用这个函数
sayHi();  // console.log("Hi!!");
​
// 注意
console.log(sayHi);  // 打印的是整个函数 
// sayHi:指的就是这个函数
// ():指的是调用
// sayHi():这个函数的调用结果

注意:

  • 调用函数的时候千万不要忘记加小括号

  • 函数不调用自己不执行

10.2.3 声明函数的两种方式

1、函数声明(命名函数):

// 声明一个函数并且命名了
function 函数名(){函数体;
}
函数名();  // 调用函数
​
/********示例代码***********/
function fn(){console.log("啊哈哈");
}
fn();

2、函数表达式(匿名函数):

// 必须先声明才能调用
var 函数名 = function(){函数体;
}
函数名(); // 调用函数
​
/********示例代码***********/
var fn = function(){console.log("啊哈哈");
}
fn();

这两种函数的区别:

  • 命名函数可以先调用,再声明,因为预解析

  • 函数表达式必须先声明,再调用(在DOM中注册事件的时候用的非常的多)

匿名函数:

没有名字的函数,叫做匿名函数。匿名函数没有办法直接用,需要赋值给变量或者自调用

自调用函数也叫自执行函数,声明和调用一起

  • 可以防止变量全局污染

  • 匿名函数自调用示例代码:

(function(num1,num2){console.log(num1);        // 1console.log(num2);        // 2var name = "张三"var age = 18;function sayHello() {console.log(age);     // 18console.log(name);    // "张三"}sayHello();
})(1,2)

10.3 函数的封装

  • 函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口

  • 简单理解:封装类似于将电脑配件整合组装到机箱中(类似快递打包)

uploading.4e448015.gif正在上传…重新上传取消

10.4 函数的参数

形参和实参

在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些参数被称为形参,而在调用该函数时,同样也需要传递相应的参数,这些参数被称为实参

形式参数: 在声明一个函数的时候,为了函数的功能更加灵活,有些值是固定不了的,对于这些固定不了的值。我们可以给函数设置参数。这个参数没有具体的值,仅仅起到一个占位置的作用,我们通常称之为形式参数,也叫形参。

实际参数: 如果函数在声明时,设置了行参,那么在函数调用的时候就需要传入对应的参数,我们把传入的参数叫做实际参数,也叫实参。

参数说明
形参形式上的参数函数,定义的时候传递的参数当时并不知道是什么
实参实际上的参数,函数调用的时候传递的参数实参是传递给形参的

参数的作用:在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去。

语法:

//带参数的函数声明
function 函数名(形参1, 形参2, 形参...){//函数体
}
​
//带参数的函数调用
函数名(实参1, 实参2, 实参3);
// 1.函数可以重复相同的代码function cook() {console.log('酸辣土豆丝');}cook();cook();
// 2.我们可以利用函数的参数实现函数重复不同的代码function 函数名(形参1,形参2...){           //在声明函数的小括号里面是形参(形式上的参数)}函数名(实参1,实参2...);                    //在函数调用的小括号里面是实参(实际的参数)
// 3.形参和实参的执行过程function cook(aru) {                    //形参是接受实参的aru =‘酸辣土豆丝·形参类似于一个变量
​console.log(aru);}cook('酸辣土豆丝');cook('大肘子');
//4.函数的参数可以有,也可以没有个数不限

案例:

// 1.利用函数求任意两个数的和function getSum(num1,num2) {console.log(num1 + num2);}getSum(1,3);                //结果:4getSum(3,8);                // 11
​
// 2.利用函数求任意两个数之间的和function getsums(start, end) {var sum = e;for ( var i = start; i <= end; i++)(sum += i;}console.log(sum);}getSums(1,100);             // 5050getsums(1,10);              // 55
// 3.注意点
//(1)多个参数之间用逗号隔开
//(2)形参可以看做是不用声明的变量

10.4.1函数形参实参个数不匹配问题:

参数个数说明
实参个 = 形参个数输出正确结果
实参个数 > 形参个数只取到形参的个数(多余参数不执行)
实参个数 < 形参个数多的形参定义为undefined,结果为NaN

特点:

  • 在函数调用的时候,需要传递对应的参数,把实参的值赋值给形参。

  • 实参如果多于形参的个数:多传的参数就丢弃了

  • 实参如果少于形参的个数:没有传的参数,值就是undefined。(容易出问题)

//函数形参实参个数匹配
function getSum(num1,num2) {
console.log(num1 + num2);
}
// 1.如果实参的个数和形参的个数一致,则正常输出结果
getsum(1,2);
// 2.如果实参的个数多于形参的个数     会取到形参的个数(多余参数不执行)
getsum(1,2,3);
// 3.如果实参的个数小于形参的个数     多于的形参定义为undefined   最终的结果就是NaN
//形参可以看做是不用声明的变量num2是一个变量但是没有接受值﹑结果就是undefined
getSum(1);                          // NaN
//建议我们尽量让实参的个数和形参相匹配

10.4.2 小结

  • 函数可以带参数也可以不带参数

  • 声明函数的时候,函数名括号里面的是形参,形参的默认值为undefined调用函数的时候,函数名括号里面的是实参

  • 多个参数中间用逗号分隔

  • 形参的个数可以和实参个数不匹配,但是结果不可预计,我们尽量要匹配

10.5 函数的返回值

10.5.1 return介绍

当函数执行完的时候,我们期望函数给我一些反馈(比如计算的结果),这个时候可以让函数返回一些东西。也就是返回值。函数通过return返回一个返回值

// 1.函数是做某件事或者实现某种功能 function cook( aru) {console.log(aru);   //在函数内部写输出函数其实是不合理的}cook('大肘子');
​
//标准写法:function cook( aru) {return aru;}console.log( cook('大肘子'));
​
// 2.函数的返回值格式function函数名(){return需要返回的结果;}函数名();
//(1)我们函数只是实现某种功能,最终的结果需要返回给函数的调用者"函数名()"通过 return实现的
//(2)只要函数遇到return 就把后面的结果返回给函数的调用者﹐函数名() = return后面的结果
​
//3.代码验证function getResult(){return 666;}getResult();                    // 相当于 getResult() = 666console.log(getResult());// 4.求任意两个数的和function getSum( num1,num2) {return num1 + num2;}console.log(getSum(1,,2));  // 3

返回值语法:

//声明一个带返回值的函数
function 函数名(形参1, 形参2, 形参...){//函数体return 返回值;
}
//可以通过变量来接收这个返回值
var 变量 = 函数名(实参1, 实参2, 实参3);
console.log(变量);    // 输出这个变量值

函数的调用结果就是返回值,因此我们可以直接对函数调用结果进行操作。

示例代码1:

// 计算 n1- n2之间所有数的乘积
function getProduct(n1, n2) {var product = 1;for (var i = n1; i <= n2; i++) {product *= i;}return product; // 返回计算的值
}
var pro = getProduct(1, 5); // 用变量pro接收一下返回的值
console.log(pro);   // 120

示例代码2:

//利用函数求数组[5,2,99,100,66,88]中的最大数值。function getArrMax( arr) {      // arr接受一个数组var max = arr[e];for (var i =1; i <= arr.length; i++){if (arr[i]>max) {max = arr[i];}}return max;}
var re = getArrMax([5,2,99,100,66,88]);
console.log(re);

10.5.2 return 注意事项

  1. return终止函数

//函数返回值注意事项
// 1. return终止函数Ifunction getsum(num1,num2) {return num1 + num2;     // return后面的代码不会被执行alert('我是不会被执行的哦!')}console.log(getSum(1,2));
  1. return只能返回一个值

// 2. return只能返回一个值function fn(num1, num2) {return num1,num2;//返回的结果是最后一个值}console.log(fn(1,2));
  1. return可以用数组的方法返回多个值

// 3.我们求任意两个数的加减乘数结果function getResult(num1,num2){return [num1 + num2, num1 - num2,num1 * num2, num1 / num2];}var re = getResult(1,2);    //返回的是一个数组console.log(re);
  1. 函数没有return返回undefined

    函数都是有返回值的

    1. 如果有return则返回return后面的值

    2. 如果没有return则返回undefined

    function fun1() ireturn 666;}console.log(fun1());    //返回666
---------------------------------------------------------function fun2() {}console.log(fun2());    //函数返回的结果是undefined

10.5.3 break ,continue ,return的区别

  • break:结束当前的循环体(如for、while )

  • continue :跳出本次循环,继续执行下次循环(如for、while )

  • return : 不仅可以退出循环,还能够返回return语句中的值,同时还可以结束当前的函数体内的代码(即退出当前函数)

10.6 函数三要素

函数三要素包括:

  • 函数名

  • 参数

  • 返回值

10.7 文档注释

关于文档注释,javascript中还有一种注释叫做文档注释,经常用在函数声明处,用来解释这个函数的作用。

文档注释: /** 这是文档注释 */

以后写的函数的声明,都应该加上文档注释,方便阅读

示例代码:

/*** 求圆的面积* @param r {number} 圆的半径* @returns {number} 圆的面积*/
function getArea (r) {return Math.PI * r * r;
}

10.8 arguments的使用

当我们不确定有多少个参数传递的时候,可以用arguments来获取。在JavaScript中,arguments实际上它是当前函数的一个内置对象。所有函数都内置了一个

arguments对象,arguments对象中存储了传递的所有实参

arguments展示形式是一个伪数组,因此可以进行遍历。伪数组具有以下特点:

  • 具有length属性

  • 按索引方式储存数据

  • 不具有数组的push , pop等方法

注:只有函数才有arguments对象,而且是每个函数都内置好了这个arguments

// arguments的使用function fn() {console.log(arguments);             //里面存储了所有传递过来的实参    arguments = [1,2,3]console.log(arguments.length);}fn(1,2,3);

运算结果:

uploading.4e448015.gif正在上传…重新上传取消

获取数组里面某一个元素的方法:

function fn() {console.log(arguments[2]);    // arguments[索引号]}fn(1, 2, 3, 4, 5);

运算结果:

uploading.4e448015.gif正在上传…重新上传取消

按照数组的方式遍历arguments:

 function fn() {for (var i = 0; i < arguments.length; i++) {console.log(arguments[i]);}}fn(1, 2, 3);fn(1, 2, 3, 4, 5);

运算结果:

uploading.4e448015.gif正在上传…重新上传取消

10.9 函数综合练习

1. 利用函数求任意个数的最大值

    function getMax() {var max = arguments[0];for (var i = 1; i < arguments.length; i++) {if (arguments[i] > max) {max = arguments[i];}}return max;}console.log(getMax(1, 2, 3));console.log(getMax(1, 2, 3, 4, 5));console.log(getMax(21, 2, 71, 666, 5, 100));

运算结果:

uploading.4e448015.gif正在上传…重新上传取消

2. 利用函数封装方式,翻转任意一个数组

    //利用函数翻转任意数组 reverse翻转function reverse(arr) {var newArr = [];for (var i = arr.length - 1; i >= 0; i--) {newArr[newArr.length] = arr[i];}return newArr;}var arr1 = reverse([9, 7, 5, 3, 1]);console.log(arr1);var arr2 = reverse(['red', 'green', 'blue', 'yellow']);console.log(arr2);
​

运算结果:

uploading.4e448015.gif正在上传…重新上传取消

3. 利用函数封装方式,对数组排序 -- 冒泡排序

    //利用函数冒泡排序sort排序function sort(arr) {for (var i = 0; i < arr.length - 1; i++) {for (var j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {var temp = arr[i];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}return arr;}var arr1 = sort([1, 5, 2, 9]);console.log(arr1);var arr2 = sort([12, 7, 66, 999]);console.log(arr2);

运算结果:

uploading.4e448015.gif正在上传…重新上传取消

4. 求任意数的阶乘(从1到n的积)

function getProduct (n){var product = 1; for(var i = 1; i <= n; i++){product *= i; }return product;
}
console.log(getProduct(5));  // 120
console.log(getProduct(3));  // 6   

5. 求任意数组中的最大值与最小值

function getMaxAndMin(arr) {var max = arr[0];var min = arr[0];for (var i = 0; i < arr.length; i++) {if (max < arr[i]) {max = arr[i];}if (min > arr[i]) {min = arr[i];}}return [max, min]; // 返回一个数组
}
console.log(getMaxAndMin([11, 45, 59, 12, 8, 36, 14, 25]));  // [59 8]

10.10函数的作用域

在函数中,只有全局作用域函数作用域,因为在ifwhilefor等语句中定义的变量都是全局变量。

全局变量:最外层声明的变量就是全局变量,全局变量在任何地方都能访问的到。

局部变量:函数中声明的变量,就是局部变量,局部变量只有在当前函数体内能够访问。

隐式全局变量: 没有使用var定义的变量也是全局变量。

作用域: 变量可以发挥作用的区域

全局作用域:script标签内,函数外定义的作用域就是全局作用域。在全局作用域中定义的变量都是全局变量。

函数作用域:函数中的区域叫做函数作用域,在函数作用域中定义的变量就是局部变量,只能在当前函数内访问。

10.11 预解析

js解析器执行js代码的时候,分为两个过程:预解析过程代码执行过程

预解析过程:

  • 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。

  • 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。

  • 先提升var,再提升function

预解析例题:

第一题:

console.log(a);    // 打印a这个函数整体
var a = 1;
function a(){
console.log("呵呵");
}
console.log(a);    // 1
​
// 预解析后为
/**
var a;
function a(){console.log("呵呵");
}
console.log(a);    // 打印a这个函数整体
a = 1;
console.log(a);    // 1
*/

第二题:

var num = 10;
fn1();
function fn1() {//在函数调用的时候,这个函数也会做预解析操作。console.log(num);   // undefinedvar num = 20;console.log(num);   // 20
}
console.log(num);       // 10
​
​
// 预解析后为
/**
var num ;
function fn1() {var num;console.log(num);   // undefinednum = 20;console.log(num);   // 20
}
num = 10;
fn1();
console.log(num);       // 10
*/

第三题:

var a = 18;
var b = 30;
fn();
function fn() {var b = 9;console.log(a); // undefinedconsole.log(b); // 9var a = 20;
}
​
​
// 预解析后为
/**
var a;
var b;
function fn() {var b;b = 9;var a;console.log(a);     // 自己作用域里有的就不要出去找console.log(b);     // 9a = 20;
}
a = 18;
b = 30;
fn();
*/

第四题:

fn();
var b = 10;
console.log(c); // 9
console.log(b); // 10
console.log(a); // 报错
​
function fn() {var a = 9;b = 9;c = 9;console.log(a); // 9console.log(b); // 9 console.log(c); // 9
}
​
​
// 预解析之后
/**
var b;
function fn() {var a;a = 9;b = 9;c = 9;console.log(a); // 9console.log(b); // 9console.log(c); // 9
}
fn();
b = 10;
console.log(c); // 9
console.log(b); // 10
console.log(a); // 报错
*/

第五题:

function fn() { console.log(num1);  // undefinedconsole.log(num2);  // undefinedconsole.log(num3);  // 30var num1 = 10;var num2 = 20;num3 = 40;console.log(num1);  // 10console.log(num2);  // 20console.log(num3);  // 40
}
var num1 = 20;
var num3 = 30;
fn();
console.log(num1);      // 20
console.log(num3);      // 40
console.log(num2);      // 报错
​
​
// 预解析之后
/**
var num1;
var num3;
​
function fn() {var num1;var num2;console.log(num1); // undefinedconsole.log(num2); // undefinedconsole.log(num3); // 30num1 = 10;num2 = 20;num3 = 40;console.log(num1); // 10console.log(num2); // 20console.log(num3); // 40
}
num1 = 20;
num3 = 30;
fn();
console.log(num1); // 20
console.log(num3); // 40
console.log(num2); // 报错
*/

10.12 递归函数

函数直接或者间接调用自己,必须要留出口,不然就调死了

示例代码:

// 用递归求1-100的和
/* 之前封装过一个getSum的函数比如getSum(100),就是求的1-100的和现在我们可以这样理解:1-100的和我们可以看做是 100 + getSum(99)getSum(99) 可以看成 99 + getSum(98)。。。依次这样推下去,但是要注意,到getSum(1)的时候,要留出口,否则会一直死循环下去*/
function getSum(n) {if (n == 1) {       // 一定要留出口return 1;}return n + getSum(n - 1);
}
console.log(getSum(100));

10.13 回调函数

回调函数:把函数当成参数来使用,那么这个函数就叫回调函数。函数也是一种数据类型

示例代码:

/*
思考,之前封装了一个bubbleSort排序的函数,但是只能排元素是数字的数组
现在想要判断字符串的长度,或者对象的属性的时候就很麻烦,就需要重新写一个函数
比如字符串长度,就需要是arr[j].length - arr[i+1].length
*/
function bubbleSort(arr, fn) {for (var i = 0; i < arr.length; i++) {var flag = true;for (var j = 0; j < arr.length - 1 - i; j++) {// 传一个函数进来,并且将arr[j], arr[j + 1]作为两个参数传进去if (fn(arr[j], arr[j + 1]) > 0) {flag = false;var temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}if (flag) {break;}}
}
// 纯数字数组
var arr = [4, 3, 1, 6, 22, 21, 41, 4];
// 调用的时候,我们需要将fn函数的两个参数也传进去
// 这种把一个函数作为参数传进另一个函数的方式就叫回调函数
bubbleSort(arr, function(a, b) { // a b 就相当于 arr[j] 和 arr[j+1]return a - b;// 如果是 return b - a 就相当于,上面的 arr[j+1] - arr[j]>0 那么就是从大到小排序 
});
console.log(arr);
​
// 封装后的排序函数也可以直接根据字符串的长度进行排序了
var arrStr = ["aaa", "bb", "cccc", "d"];
bubbleSort(arrStr, function(a, b) {// 因为传进去的是一个函数,arr[j] 和 arr[j+1]是以两个参数的形式传进去的// 当数组元素是字符串的时候,就可以进行.length操作了return a.length - b.length;
});
console.log(arrStr);

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

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

相关文章

精品WordPress主题/响应式个人博客主题Kratos

Kratos 是一款专注于用户阅读体验的响应式 WordPress 主题&#xff0c;整体布局简洁大方&#xff0c;针对资源加载进行了优化。 Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净&#xff0c;简单且响应迅速的博客主题&#xff0c;Vtrois创建和维护&#xff0c; 主…

LeetCode 刷题基础 -- 模板原型Ⅰ

模板原型 - 基础篇 学习网站一、进制转换二、二分查找① 查找指定元素② 查找第一个大于等于 x 值的序列下标③ 查找第一个大于 x 值的序列下标④ 单峰序列 三、双指针① 两数之和② 序列合并③ 集合求交④ 集合求并 四、其他高效技巧与算法① 区间和② 01 对③ 左小数 五、数学…

BLE MESH学习1-基于沁恒CH582学习

BLE MESH学习1-基于沁恒CH582学习 一、BLE mesh说明 mesh组网可以实现相比点对点模式更远的距离、更灵活的网络形式、更可靠的连接和更多的设备加入。BLE mesh在IoT中的传感器和控制具有重要意义。我的目的也是IoT领域&#xff0c;实现自己的传感器读取、开关控制等类似米家智…

知识改变命运 数据结构【java对象的比较】

0&#xff1a;前言 在基本数据类型中&#xff0c;我们可以直接使用号比较是否相等&#xff0c;还记的学堆哪里时候&#xff0c;插入一个数据&#xff0c;就会与其他数据进行比较&#xff0c;当时我们传入的是Integer类型&#xff0c;在Integer类里面已经实现了compare。 如果…

西门子S7-1200博途软件项目的下载

S7-1200的CPU本体上集成了PROFINET通信口&#xff0c;通过这个通信口可以实现CPU与编程设备的通信。 此外&#xff0c;S7-1200 可以通过连接CM1243-5扩展模块&#xff0c;然后电脑通过PC ADAPTER USB A2电缆、或者电脑上的CP卡&#xff08;例如CP5612&#xff09;通过PROFIBUS…

手写mybatis之SQL执行器的定义和实现

前言 所有系统的设计和实现&#xff0c;核心都在于如何解耦&#xff0c;如果解耦不清晰最后直接导致的就是再继续迭代功能时&#xff0c;会让整个系统的实现越来越臃肿&#xff0c;稳定性越来越差。而关于解耦的实践在各类框架的源码中都有非常不错的设计实现&#xff0c;所以阅…

陪伴系统,会成为女性向游戏的下一个争夺点吗?

乙游提供给女性玩家的只有恋爱感吗&#xff1f; 一般来说&#xff0c;对于乙女游戏的概括常常以为玩家提供“恋爱陪伴感”为主&#xff0c;恋爱很好理解&#xff0c;通过与多位男主角的剧情互动来模拟在真实恋爱中的情感交互&#xff0c;当下乙游都将重点放在了营造恋爱感上。…

55页可编辑PPT | 制造企业数字化转型顶层规划案例

基于集团的战略和运营特点&#xff0c;数字化转型应如何考虑&#xff1f; 在集团的战略和运营特点基础上进行数字化转型&#xff0c;需要实现业务多元化&#xff0c;整合资源和流程&#xff0c;推动国际化拓展&#xff0c;实施差异化战略&#xff0c;并通过数据驱动决策&#…

Vue工程化结构环境安装及搭建教程 : 之nvm

vue需要的环境&#xff1a; node.js : Node.js和Vue.js通常会一起使用。Node.js作为后端服务器&#xff0c;处理服务器端的逻辑和数据访问&#xff0c;而Vue.js则负责前端用户界面的构建和交互。通过Ajax通信&#xff0c;Vue.js应用程序向Node.js服务器发送请求&#xff0c;并…

【Ubuntu】git

文章目录 1.配置SSH key2. 基础知识操作命令1分支branch 如果对git命令使用不熟悉&#xff0c;推荐一个非常棒的git在线练习工具 Learn Git Branching。 https://m.runoob.com/git/git-basic-operations.html 1.配置SSH key ssh-keygen -t rsa -C "YOUR EMAIL"完成…

PDF无法导出中文

font/SIMSUN.TTC with Identity-H is not recognized. 查看BaseFont源码发现".ttc," 改为"SIMSUN.TTC,a"提示数字转换异常 改为"SIMSUN.TTC,11"提示数字索引必须介于0和1之间 改为0或1结果正常 BaseFont baseFont BaseFont.createFont("/U…

迎接国庆旅游热潮,火山引擎数据飞轮助力景区数智化升级

随着人们生活水平的提高和旅游消费观念的转变&#xff0c;国庆假期成为人们出行旅游的黄金时段。同程旅行发布的报告显示&#xff0c;北京、杭州、重庆、上海、南京、成都等城市仍是 “十一” 假期国内热门的目的地&#xff0c;而一些新兴的宝藏旅游目的地如新疆阿勒泰、云南迪…

四.python核心语法

目录 1.序列 1.1. 索引 1.2. 切片 1.3. 总结 2.加法和乘法 2.1. 加法 2.2. 乘法 3.常用函数 3.1.sum()函数 3.2.max()函数和min()函数 3.3.len()函数 4. list 列表 [ ] 基本操作 4.1. 列表的定义 4.2. 列表的创建&#xff08;list()函数&#xff09; 4.3. 列表的…

RabbitMQ概述

什么是MQ MQ (message queue)消息队列 MQ从字⾯意思上看,本质是个队列,FIFO先⼊先出&#xff0c;只不过队列中存放的内容是消息(message).消息可以⾮常简单,⽐如只包含⽂本字符串,JSON等,也可以很复杂,⽐如内嵌对象 RabbitMQ是MQ的一种实现,是Rabbit 企业下的⼀个消息队列产…

Python 如何使用 scikit-learn 进行模型训练

如何使用 scikit-learn 进行模型训练 一、简介 在现代的数据科学和机器学习领域&#xff0c;Python 已经成为最流行的编程语言之一。而其中最流行的机器学习库之一就是 scikit-learn。scikit-learn 提供了许多方便的工具和函数来实现常见的机器学习任务&#xff0c;包括数据预…

数据分析:宏基因组群落TOPOSCORE拓扑结构打分

文章目录 介绍数据TOPOSCORE算法SCORE计算TOPOSCORE实操tp_helper.R导入数据生存分析Fisher精确检验聚类分析SIG定义Toposcoring 分数计算Akkermansia muciniphila的考虑TOPOSCORE的验证总结系统信息介绍 研究背景:肠道微生物群对癌症患者对免疫检查点抑制剂(ICIs)的临床反…

笔记整理—linux进程部分(9)互斥锁

互斥锁也叫互斥量&#xff0c;可以看作一种特殊的信号量。信号量可以>0&#xff0c;大家可以排队使用信号量&#xff0c;互斥锁只有0、1&#xff0c;主要实现关键段保护&#xff0c;只能在某一时间给某一任务去调用这段资源&#xff0c;这段内容用之前上锁&#xff0c;用完时…

【stm32】寄存器(stm32技术手册下载链接)

1、资料下载 RM0008_STM32F101xx,STM32F102xx,STM32F103xx,STM32F105xx和STM32F107xx单片机参考手册 | STMCU中文官网 2、代码 设置PB7 //设置PB7 #define SDA_IN() {GPIOB->CRL&0X0FFFFFFF;GPIOB->CRL|(u32)8<<28;} #define SDA_OUT() {GPIOB->…

STM32编码器接口

一、概述 1、Encoder Interface 编码器接口概念 编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度每个高级定时器和通用…

基于VUE+uniapp小程序的物业管理系统社区小区物业报修收费投诉管理系统

&#xff01;&#xff01;&#xff01;页面底部,文章结尾,加我好友,获取计算机毕设开发资料 目录 一、引言 二、相关技术介绍 三、系统需求分析 四、系统设计 五、关键技术实现 六、测试与优化 七、总结与展望 一、引言 当前物业管理存在诸多问题&#xff0c;如报修响应…