首页 > 其他分享 >TypeScript:函数

TypeScript:函数

时间:2024-09-12 23:24:15浏览次数:14  
标签:function TypeScript return 函数 number let card

一、简介

函数是JavaScript应用程序的基础。 它帮助你实现抽象层,模拟类,信息隐藏和模块。 在TypeScript里,虽然已经支持类,命名空间和模块,但函数仍然是主要的定义 行为的地方。 TypeScript为JavaScript函数添加了额外的功能,让我们可以更容易地使用。

和JavaScript一样,TypeScript函数可以创建有名字的函数和匿名函数。 你可以随意选择适合应用程序的方式,不论是定义一系列API函数还是只使用一次的函数。

通过下面的例子可以迅速回想起这两种JavaScript中的函数:

// Named function
function add(x, y) {
    return x + y;
}

// Anonymous function
let myAdd = function(x, y) { return x + y; };

在JavaScript里,函数可以使用函数体外部的变量。 当函数这么做时,我们说它‘捕获’了这些变量。 至于为什么可以这样做以及其中的利弊超出了本文的范围,但是深刻理解这个机制对学习JavaScript和TypeScript会很有帮助。

let z = 100;

function addToZ(x, y) {
    return x + y + z;
}

二、函数类型

2.1 为函数定义类型

让我们为上面那个函数添加类型:

function add2(x: number, y: number): number {
    return x + y;
}

let myAdd2 = function(x: number, y: number): number { return x + y; };
console.log("add2 = ", add2(1, 2))

效果图
在这里插入图片描述

我们可以给每个参数添加类型之后再为函数本身添加返回值类型。 TypeScript能够根据返回语句自动推断出返回值类型,因此我们通常省略它。

2.2 书写完整函数类型

现在我们已经为函数指定了类型,下面让我们写出函数的完整类型。

let myAdd3: (x: number, y: number) => number =
    function(x: number, y: number): number { return x + y; };

函数类型包含两部分:参数类型和返回值类型。 当写出完整函数类型的时候,这两部分都是需要的。 我们以参数列表的形式写出参数类型,为每个参数指定一个名字和类型。 这个名字只是为了增加可读性。 我们也可以这么写:

let myAdd4: (baseValue: number, increment: number) => number =
    function (x: number, y: number): number { return x + y; };

只要参数类型是匹配的,那么就认为它是有效的函数类型,而不在乎参数名是否正确。

第二部分是返回值类型。 对于返回值,我们在函数和返回值类型之前使用( =>)符号,使之清晰明了。 如之前提到的,返回值类型是函数类型的必要部分,如果函数没有返回任何值,你也必须指定返回值类型为 void而不能留空。

函数的类型只是由参数类型和返回值组成的。 函数中使用的捕获变量不会体现在类型里。 实际上,这些变量是函数的隐藏状态并不是组成API的一部分。

2.3 推断类型

尝试这个例子的时候,你会发现如果你在赋值语句的一边指定了类型但是另一边没有类型的话,TypeScript编译器会自动识别出类型:

// myAdd has the full function type
let myAdd5 = function (x: number, y: number): number { return x + y; };

// The parameters `x` and `y` have the type number
let myAdd6: (baseValue: number, increment: number) => number =
    function (x, y) { return x + y; };

这叫做“按上下文归类”,是类型推论的一种。 它帮助我们更好地为程序指定类型。

三、可选参数和默认参数

TypeScript里的每个函数参数都是必须的。 这不是指不能传递 null或undefined作为参数,而是说编译器检查用户是否为每个参数都传入了值。 编译器还会假设只有这些参数会被传递进函数。 简短地说,传递给一个函数的参数个数必须与函数期望的参数个数一致。

function buildName(firstName: string, lastName: string) {
    return firstName + " " + lastName;
}

let result1 = buildName("Bob");                  // error, too few parameters
let result2 = buildName("Bob", "Adams", "Sr.");  // error, too many parameters
let result3 = buildName("Bob", "Adams");         // ah, just right

JavaScript里,每个参数都是可选的,可传可不传。 没传参的时候,它的值就是undefined。 在TypeScript里我们可以在参数名旁使用 ?实现可选参数的功能。 比如,我们想让last name是可选的:

function buildName2(firstName: string, lastName?: string) {
    if (lastName)
        return firstName + " " + lastName;
    else
        return firstName;
}

let result12 = buildName2("Bob");  // works correctly now
// let result22 = buildName2("Bob", "Adams", "Sr.");  // error, too many parameters
let result32 = buildName2("Bob", "Adams");  // ah, just right

在这里插入图片描述
可选参数必须跟在必须参数后面。 如果上例我们想让first name是可选的,那么就必须调整它们的位置,把first name放在后面。

在TypeScript里,我们也可以为参数提供一个默认值当用户没有传递这个参数或传递的值是undefined时。 它们叫做有默认初始化值的参数。 让我们修改上例,把last name的默认值设置为"Smith"。

function buildName3(firstName: string, lastName = "Smith") {
    return firstName + " " + lastName;
}

let result13 = buildName3("Bob");                  // works correctly now, returns "Bob Smith"
let result23 = buildName3("Bob", undefined);       // still works, also returns "Bob Smith"
// let result33 = buildName3("Bob", "Adams", "Sr.");  // error, too many parameters
let result43 = buildName3("Bob", "Adams");         // ah, just right

在所有必须参数后面的带默认初始化的参数都是可选的,与可选参数一样,在调用函数的时候可以省略。 也就是说可选参数与末尾的默认参数共享参数类型。

function buildName(firstName: string, lastName?: string) {
    // ...
}

function buildName(firstName: string, lastName = "Smith") {
    // ...
}

共享同样的类型(firstName: string, lastName?: string) => string。 默认参数的默认值消失了,只保留了它是一个可选参数的信息。

与普通可选参数不同的是,带默认值的参数不需要放在必须参数的后面。 如果带默认值的参数出现在必须参数前面,用户必须明确的传入 undefined值来获得默认值。 例如,我们重写最后一个例子,让 firstName是带默认值的参数:

function buildName4(firstName = "Will", lastName: string) {
    return firstName + " " + lastName;
}

// let result14 = buildName4("Bob");                  // error, too few parameters
// let result24 = buildName4("Bob", "Adams", "Sr.");  // error, too many parameters
let result34 = buildName4("Bob", "Adams");         // okay and returns "Bob Adams"
let result44 = buildName4(undefined, "Adams");     // okay and returns "Will Adams"

四、剩余参数

必要参数,默认参数和可选参数有个共同点:它们表示某一个参数。 有时,你想同时操作多个参数,或者你并不知道会有多少参数传递进来。 在JavaScript里,你可以使用 arguments来访问所有传入的参数。

在TypeScript里,你可以把所有参数收集到一个变量里:

function buildName5(firstName: string, ...restOfName: string[]) {
    return firstName + " " + restOfName.join(" ");
  }
  
  let employeeName = buildName5("Joseph", "Samuel", "Lucas", "MacKinzie");
  console.log("employeeName = ",employeeName)

在这里插入图片描述
剩余参数会被当做个数不限的可选参数。 可以一个都没有,同样也可以有任意个。 编译器创建参数数组,名字是你在省略号( …)后面给定的名字,你可以在函数体内使用这个数组。

这个省略号也会在带有剩余参数的函数类型定义上使用到:

function buildName(firstName: string, ...restOfName: string[]) {
  return firstName + " " + restOfName.join(" ");
}

let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;
4.1 this

学习如何在JavaScript里正确使用this就好比一场成年礼。 由于TypeScript是JavaScript的超集,TypeScript程序员也需要弄清 this工作机制并且当有bug的时候能够找出错误所在。 幸运的是,TypeScript能通知你错误地使用了 this的地方。 如果你想了解JavaScript里的 this是如何工作的,那么首先阅读Yehuda Katz写的Understanding JavaScript Function Invocation and “this”。 Yehuda的文章详细的阐述了 this的内部工作原理,因此我们这里只做简单介绍。

4.2 this和箭头函数

JavaScript里,this的值在函数被调用的时候才会指定。 这是个既强大又灵活的特点,但是你需要花点时间弄清楚函数调用的上下文是什么。 但众所周知,这不是一件很简单的事,尤其是在返回一个函数或将函数当做参数传递的时候。

下面看一个例子:

let deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        return function() {
            let pickedCard = Math.floor(Math.random() * 52);
            let pickedSuit = Math.floor(pickedCard / 13);

            return {suit: this.suits[pickedSuit], card: pickedCard % 13};
        }
    }
}

let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();

alert("card: " + pickedCard.card + " of " + pickedCard.suit);

可以看到createCardPicker是个函数,并且它又返回了一个函数。 如果我们尝试运行这个程序,会发现它并没有弹出对话框而是报错了。 因为 createCardPicker返回的函数里的this被设置成了window而不是deck对象。 因为我们只是独立的调用了 cardPicker()。 顶级的非方法式调用会将 this视为window。 (注意:在严格模式下, this为undefined而不是window)。

为了解决这个问题,我们可以在函数被返回时就绑好正确的this。 这样的话,无论之后怎么使用它,都会引用绑定的‘deck’对象。 我们需要改变函数表达式来使用ECMAScript 6箭头语法。 箭头函数能保存函数创建时的 this值,而不是调用时的值:

let deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        // NOTE: the line below is now an arrow function, allowing us to capture 'this' right here
        return () => {
            let pickedCard = Math.floor(Math.random() * 52);
            let pickedSuit = Math.floor(pickedCard / 13);

            return {suit: this.suits[pickedSuit], card: pickedCard % 13};
        }
    }
}

let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();

alert("card: " + pickedCard.card + " of " + pickedCard.suit);

更好事情是,TypeScript会警告你犯了一个错误,如果你给编译器设置了–noImplicitThis标记。 它会指出 this.suits[pickedSuit]里的this的类型为any。

4.3 this参数

不幸的是,this.suits[pickedSuit]的类型依旧为any。 这是因为 this来自对象字面量里的函数表达式。 修改的方法是,提供一个显式的 this参数。 this参数是个假的参数,它出现在参数列表的最前面:

function f(this: void) {
    // make sure `this` is unusable in this standalone function
}

让我们往例子里添加一些接口,Card 和 Deck,让类型重用能够变得清晰简单些:

interface Card {
    suit: string;
    card: number;
}
interface Deck {
    suits: string[];
    cards: number[];
    createCardPicker(this: Deck): () => Card;
}
let deck2: Deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    // NOTE: The function now explicitly specifies that its callee must be of type Deck
    createCardPicker: function(this: Deck) {
        return () => {
            let pickedCard = Math.floor(Math.random() * 52);
            let pickedSuit = Math.floor(pickedCard / 13);

            return {suit: this.suits[pickedSuit], card: pickedCard % 13};
        }
    }
}

let cardPicke2 = deck2.createCardPicker();
let pickedCard2 = cardPicke2();

alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);
现在TypeScript知道createCardPicker期望在某个Deck对象上调用。 也就是说 this是Deck类型的,而非any,因此--noImplicitThis不会报错了。
4.4 this参数在回调函数里

你可以也看到过在回调函数里的this报错,当你将一个函数传递到某个库函数里稍后会被调用时。 因为当回调被调用的时候,它们会被当成一个普通函数调用, this将为undefined。 稍做改动,你就可以通过 this参数来避免错误。 首先,库函数的作者要指定 this的类型:

interface UIElement {
    addClickListener(onclick: (this: void, e: Event) => void): void;
}

this: void means that addClickListener expects onclick to be a function that does not require a this type. Second, annotate your calling code with this:

class Handler {
    info: string;
    onClickBad(this: Handler, e: Event) {
        // oops, used this here. using this callback would crash at runtime
        this.info = e.message;
    }
}
let h = new Handler();
uiElement.addClickListener(h.onClickBad); // error!

指定了this类型后,你显式声明onClickBad必须在Handler的实例上调用。 然后TypeScript会检测到 addClickListener要求函数带有this: void。 改变 this类型来修复这个错误:

class Handler {
    info: string;
    onClickGood(this: void, e: Event) {
        // can't use this here because it's of type void!
        console.log('clicked!');
    }
}
let h = new Handler();
uiElement.addClickListener(h.onClickGood);

因为onClickGood指定了this类型为void,因此传递addClickListener是合法的。 当然了,这也意味着不能使用 this.info. 如果你两者都想要,你不得不使用箭头函数了:

class Handler {
    info: string;
    onClickGood = (e: Event) => { this.info = e.message }
}

这是可行的因为箭头函数不会捕获this,所以你总是可以把它们传给期望this: void的函数。 缺点是每个 Handler对象都会创建一个箭头函数。 另一方面,方法只会被创建一次,添加到 Handler的原型链上。 它们在不同 Handler对象间是共享的。

五、重载

JavaScript本身是个动态语言。 JavaScript里函数根据传入不同的参数而返回不同类型的数据是很常见的。

let suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x:any): any {
    // Check to see if we're working with an object/array
    // if so, they gave us the deck and we'll pick the card
    if (typeof x == "object") {
        let pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    // Otherwise just let them pick the card
    else if (typeof x == "number") {
        let pickedSuit = Math.floor(x / 13);
        return { suit: suits[pickedSuit], card: x % 13 };
    }
}

let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

let pickedCard3 = pickCard(15);
alert("card: " + pickedCard3.card + " of " + pickedCard3.suit);

pickCard方法根据传入参数的不同会返回两种不同的类型。 如果传入的是代表纸牌的对象,函数作用是从中抓一张牌。 如果用户想抓牌,我们告诉他抓到了什么牌。 但是这怎么在类型系统里表示呢。

方法是为同一个函数提供多个函数类型定义来进行函数重载。 编译器会根据这个列表去处理函数的调用。 下面我们来重载 pickCard函数。

let suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
    // Check to see if we're working with an object/array
    // if so, they gave us the deck and we'll pick the card
    if (typeof x == "object") {
        let pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    // Otherwise just let them pick the card
    else if (typeof x == "number") {
        let pickedSuit = Math.floor(x / 13);
        return { suit: suits[pickedSuit], card: x % 13 };
    }
}

let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

let pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);

这样改变后,重载的pickCard函数在调用的时候会进行正确的类型检查。

为了让编译器能够选择正确的检查类型,它与JavaScript里的处理流程相似。 它查找重载列表,尝试使用第一个重载定义。 如果匹配的话就使用这个。 因此,在定义重载的时候,一定要把最精确的定义放在最前面。

注意,function pickCard(x): any并不是重载列表的一部分,因此这里只有两个重载:一个是接收对象另一个接收数字。 以其它参数调用 pickCard会产生错误。

六、05base.ts代码

// 函数 https://www.tslang.cn/docs/handbook/functions.html

// Named function
function add(x: number, y: number) {
    return x + y;
}

// Anonymous function
let myAdd = function (x: number, y: number) { return x + y; };


// 为函数定义类型
function add2(x: number, y: number): number {
    return x + y;
}

let myAdd2 = function (x: number, y: number): number { return x + y; };
console.log("add2 = ", add2(1, 2))

// 书写完整函数类型
let myAdd3: (x: number, y: number) => number =
    function (x: number, y: number): number { return x + y; };

let myAdd4: (baseValue: number, increment: number) => number =
    function (x: number, y: number): number { return x + y; };

// 推断类型
// myAdd has the full function type
let myAdd5 = function (x: number, y: number): number { return x + y; };

// The parameters `x` and `y` have the type number
let myAdd6: (baseValue: number, increment: number) => number =
    function (x, y) { return x + y; };

// 可选参数和默认参数
function buildName(firstName: string, lastName: string) {
    return firstName + " " + lastName;
}

// let result1 = buildName("Bob");                  // error, too few parameters
// let result2 = buildName("Bob", "Adams", "Sr.");  // error, too many parameters
let result3 = buildName("Bob", "Adams");         // ah, just right

function buildName2(firstName: string, lastName?: string) {
    if (lastName)
        return firstName + " " + lastName;
    else
        return firstName;
}

let result12 = buildName2("Bob");  // works correctly now
// let result22 = buildName2("Bob", "Adams", "Sr.");  // error, too many parameters
let result32 = buildName2("Bob", "Adams");  // ah, just right

console.log("result12 = ",result12)
console.log("result32 = ",result32)


function buildName3(firstName: string, lastName = "Smith") {
    return firstName + " " + lastName;
}

let result13 = buildName3("Bob");                  // works correctly now, returns "Bob Smith"
let result23 = buildName3("Bob", undefined);       // still works, also returns "Bob Smith"
// let result33 = buildName3("Bob", "Adams", "Sr.");  // error, too many parameters
let result43 = buildName3("Bob", "Adams");         // ah, just right


function buildName4(firstName = "Will", lastName: string) {
    return firstName + " " + lastName;
}

// let result14 = buildName4("Bob");                  // error, too few parameters
// let result24 = buildName4("Bob", "Adams", "Sr.");  // error, too many parameters
let result34 = buildName4("Bob", "Adams");         // okay and returns "Bob Adams"
let result44 = buildName4(undefined, "Adams");     // okay and returns "Will Adams"


// 剩余参数
function buildName5(firstName: string, ...restOfName: string[]) {
    return firstName + " " + restOfName.join(" ");
  }
  
  let employeeName = buildName5("Joseph", "Samuel", "Lucas", "MacKinzie");
  console.log("employeeName = ",employeeName)

//   this和箭头函数
// let deck = {
//     suits: ["hearts", "spades", "clubs", "diamonds"],
//     cards: Array(52),
//     createCardPicker: function() {
//         return function() {
//             let pickedCard = Math.floor(Math.random() * 52);
//             let pickedSuit = Math.floor(pickedCard / 13);

//             return {suit: this.suits[pickedSuit], card: pickedCard % 13};
//         }
//     }
// }

// let cardPicker = deck.createCardPicker();
// let pickedCard = cardPicker();

// alert("card: " + pickedCard.card + " of " + pickedCard.suit);

// 改正后的
let deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        // NOTE: the line below is now an arrow function, allowing us to capture 'this' right here
        return () => {
            let pickedCard = Math.floor(Math.random() * 52);
            let pickedSuit = Math.floor(pickedCard / 13);

            return {suit: this.suits[pickedSuit], card: pickedCard % 13};
        }
    }
}

let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();

alert("card: " + pickedCard.card + " of " + pickedCard.suit);

// this参数
function f(this: void) {
    // make sure `this` is unusable in this standalone function
}
interface Card {
    suit: string;
    card: number;
}
interface Deck {
    suits: string[];
    cards: number[];
    createCardPicker(this: Deck): () => Card;
}
let deck2: Deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    // NOTE: The function now explicitly specifies that its callee must be of type Deck
    createCardPicker: function(this: Deck) {
        return () => {
            let pickedCard = Math.floor(Math.random() * 52);
            let pickedSuit = Math.floor(pickedCard / 13);

            return {suit: this.suits[pickedSuit], card: pickedCard % 13};
        }
    }
}

let cardPicke2 = deck2.createCardPicker();
let pickedCard2 = cardPicke2();

alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);



// this参数在回调函数里
// interface UIElement2 {
//     addClickListener(onclick: (this: void, e: Event) => void): void;
// }
// class Handler {
//     info: string = "";
//     onClickBad(this: Handler, e: Event) {
//         // oops, used this here. using this callback would crash at runtime
//         this.info = e.message;
//     }
// }
// let h = new Handler();
// uiElement2.addClickListener(h.onClickBad); // error!

// 重载

let suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x:any): any {
    // Check to see if we're working with an object/array
    // if so, they gave us the deck and we'll pick the card
    if (typeof x == "object") {
        let pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    // Otherwise just let them pick the card
    else if (typeof x == "number") {
        let pickedSuit = Math.floor(x / 13);
        return { suit: suits[pickedSuit], card: x % 13 };
    }
}

let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

let pickedCard3 = pickCard(15);
alert("card: " + pickedCard3.card + " of " + pickedCard3.suit);

七、LearnTypeScript 源码

点击查看LearnTypeScript 源码

标签:function,TypeScript,return,函数,number,let,card
From: https://blog.csdn.net/ChinaDragon10/article/details/142186397

相关文章

  • 【高中数学/函数/零点】函数f(x)=e^x*|lnx|-2的零点个数为?
    【问题】函数f(x)=e^x*|lnx|-2的零点个数为?【出处】《高考数学极致解题大招》P182-1中原教研工作室编著【解答】e^x*|lnx|-2=0即|lnx|=2/e^x草绘两者图像可知交点为两个,故零点为两个。【函数图像】 用Canvas绘制实际图像如下:由上图可见,函数y=e^x*|lnx|-2确实只与x轴有两个交点,且......
  • 【TS】TypeScript配置详解【三】
    简介TypeScript代码最终都会被编译成JavaScript代码来运行。这个编译的过程需要使用TypeScript编译器,我们可以为该编译器配置一些编译选项。在TypeScript项目的根目录下执行“tsc-init”命令,快速创建一个tsconfig.json文件。该文件用于配置TypeScript编译项目时编......
  • ##嵌入式学习之Linux系统编程##--标准I/O函数
    day01主要内容:linux系统下一切皆文件标准IO---标准库文件IO---系统调用制作库---静态库、动态库基本概念:标准I/O:文件:一组相关数据的有序集合。文件名:这个数据集合的名称。文件类型:lsp-bcd系统调用用户空间进程访问内核的接口把用户从底层的硬件编程......
  • 【Python使用】嘿马python基础入门全体系教程第9篇:高阶函数,函数应用:学生管理系统【附
    本教程的知识点为:计算机组成计算机是由什么组成的?1.硬件系统:2.软件系统:目标运算符的分类1.算数运算符2.赋值运算符3.复合赋值运算符判断语句和循环语句if嵌套1.if嵌套的格式2.if嵌套的应用if嵌套执行流程容器:字符串、列表、元组、字典字符串介绍一.认识字......
  • 【TS】TypeScript高级详解【二】
    TypeScript类的使用进行ES5开发的时候,需要使用函数和原型链实现类和继承。ES6引入了class关键字,我们可以更加方便地定义和使用类。作为JavaScript的超集,TypeScript同样支持使用class关键字,并且可以对类的属性和方法等进行静态类型检测。类的定义具体的类定义方式如下:......
  • 【TS】TypeScript基础详解【一】
    Javascript类型缺陷类型引发的问题在编程开发中,有一个共识:错误越早发现,就越容易解决。例如:能在代码编写时发现错误,就不要等到代码编译时才发现(这也是IDE的优势之一)。能在代码编译时发现错误,就不要在代码运行时才发现(类型检测可以帮助我们在这方面做得很好)。能在开发......
  • MySQL常用函数
    一、聚合函数1、max():计算指定列的最大值2、min():计算指定列的最小值3、count():计算指定列不为null的数据的数量4、sum():计算指定列的数值的和如果计算的列的类型不是数值类型,计算结果为05、avg():计算指定列的数值的平均值如果计算的列的类型不是数值类型,计算的结果......
  • JAVA基础之5-函数式接口的实现
    之所以单独把这个列出来,是因为本人被一个源码给震撼了。所以,本人目的是看看这个震撼实现,并模仿,最后把常规的实现也贴上,让读者可以看到相对完整的实现注:本文代码基于JDK17 一、让人震撼的代码Collectors.toList()publicstatic<T>Collector<T,?,List<T>>toList()......
  • Python 内置函数汇总(使用示例)
    abs(number)求解整数,浮点数绝对值,返回复数模大小aiter()异步的方式遍历可迭代对象的异步迭代器importasynciocount=0asyncdefexample():asyncdefasync_generator():globalcountwhileTrue:count+=1......
  • 第七章习题3-写一个判断素数的函数,在主函数中输入一个整数,输出是否为素数的信息
     ......