首页 > 其他分享 >17、函数

17、函数

时间:2023-05-11 22:23:09浏览次数:28  
标签:函数 17 int fmt num func Println

1.是什么?

函数就是执行特定任务的代码块

2.函数的意义

  • 避免重复的代码
  • 增强程序的扩展性

3.函数的使用步骤

  • step1 : 函数的定义,也叫声明
  • step2 : 函数的调用,就是执行函数中的代码

4.函数的语法

func funcName (paramName1 type1,paramName2 type2,......)(output1 type1,output2 type2){
// 这里是处理逻辑的代码
// 返回多个值
return val1,val2.....
}

func : 定义函数的关键字
funcName : 函数的名称
() : 函数的标志
参数列表 : 形式参数用于接收外部传入的实际参数
返回值列表 : 函数执行后返回给调用出的结果
注意:可以有多个返回值

5.函数注意事项

  • 函数必须先定义,在调用;如果不定义:undefined:funcName
  • 定义了的函数就去使用它不然没意义
  • 函数名不能重复
  • main() 是一个特殊的函数,作为程序的入口,由系统自动调用,而其他函数则是通过程序员手动通过函数名调用

6.函数简单使用

/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/5/2  14:55
 * @tags 喜欢就去努力的争取
 */
package main

import "fmt"

func main() {

	sum := 0
	for i := 1; i <= 10; i++ {
		sum += i
	}
	fmt.Println(sum)

	// 调用函数的方式实现
	res := getSum(100)
	fmt.Printf("1-100的累加和为:%d \n", res)
}

func getSum(num int) (res int) {
	sum := 0
	for i := 1; i <= num; i++ {
		sum += i
	}
	return sum
}

7.函数的参数

  • 形式参数:函数定义时,用于接收外部传入的数据,叫做形式参数,也叫形参
  • 实际参数:调用函数时,传给形参的实际数据,叫做实际参数,也叫是实参

函数的调用:

  • 函数名必须匹配
  • 实参与形参必须一一对应:顺序,个数,类型

8.可变参数

一个函数中的参数类型确定,但是参数的个数不确定,就可以使用可变参数

func add2(nums ...int) {
	sum := 0
	for _, v := range nums {
		sum += v
	}
	fmt.Printf("%T\n", nums)
	fmt.Printf("%d\n", sum)
}

注意事项:

  • 如果一个函数的参数是可变参数,同事含有其他参数时,可变参数必须放在最后
  • 一个函数只能有一个可变参数

9.参数的传递

数据类型:

  • 按照数据类型:
    • 基本数据类型:
      int float string bool
    • 复合数据类型
      array slice map struct interface ...
  • 按照数据的存储特点来分:
    • 值类型的数据:操作的是数值本身
      int float64 bool string array
    • 引用类型的数据:操作的是数据的地址
      slice map chan

参数传递:

  • 值传递:传递的是数据的副本。修改数据,对于原始的数据没有影响。
    基本类型,值类型数据,array,struct

  • 引用传递:传递的是数据的地址。会出现多个变量指向同一块内存
    应用类型的数据,slice,map,chan

/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/5/4  21:05
 * @tags 喜欢就去努力的争取
 */
package main

import "fmt"

func main() {
	// 演示数据是值传递
	arr1 := [3]int{1, 2, 3}
	fmt.Println("array调用函数前:", arr1)
	fun1(arr1)
	fmt.Println("array调用函数后:", arr1)

	// 演示切片是引用传递
	slice1 := []string{"zs", "ls", "ww"}
	fmt.Println("slice调用函数前:", slice1)
	fun2(slice1)
	fmt.Println("slice调用函数后:", slice1)

	// 演示map是引用传递
	map1 := make(map[int]string)
	map1[0] = "JavaScript"
	map1[1] = "Java"
	map1[2] = "Go"
	fmt.Println("map调用函数前:", map1)
	fun3(map1)
	fmt.Println("map调用函数后:", map1)

}

func fun1(arr [3]int) {
	fmt.Println("修改前的数组:", arr)
	arr[0] = 100
	fmt.Println("修改后的数组:", arr)
}

func fun2(sl []string) {
	fmt.Println("修改前的切片:", sl)
	sl[0] = "ly"
	fmt.Println("修改后的切片:", sl)
}

func fun3(m1 map[int]string) {
	fmt.Println("修改前的map", m1)
	m1[0] = "Python"
	fmt.Println("修改前的map", m1)
}

10.函数的返回值

一个函数被调用后,返回给调用出的执行结果,叫做函数的返回值。调用处需要用变量接收返回值

/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/5/4  22:05
 * @tags 喜欢就去努力的争取
 */
package main

import "fmt"

func main() {
	/**
		调用函数,获取返回值
		值得注意的是,go语言中支持多返回...
	*/
	sum, i := getSum2()
	fmt.Println(sum, i)

	sum2, i2 := getSum3(100)
	fmt.Println(sum2, i2)
}

func getSum2() (int, int) {
	sum := 0
	i := 1
	for ; i <= 10; i++ {
		sum += i
	}
	return sum, i
}

func getSum3(num int) (sum, i int) {
	for ; i <= num; i++ {
		sum += i
	}
	return sum, i
}

(1)一个函数可以有多个返回值
res1, res2 := rectangle(5, 10)
fmt.Println("周长:", res1)
fmt.Println("面积:", res2)

res3, res4 := rectangle(8, 10)
fmt.Println("周长:", res3)
fmt.Println("面积:", res4)

// 求矩形的周长和面积
func rectangle(len, wid float64) (float64, float64) {
	perimeter := (len + wid) * 2
	area := len * wid
	return perimeter, area
}

// 进阶写法
func rectangle2(len, wid float64) (perimeter, area float64) {
	perimeter = (len + wid) * 2
	area = len * wid
	return perimeter, area
}

11.return语句

一个函数的定义上有返回值,那么函数中必须使用return语句,将结果返回给调用处
函数返回的结果必须和函数定义的一致:类型,个数,顺序
作用:

  • 将函数的结果返回给调用处
  • 同事结束了该函数的执行

12.空白标识符: _

用于舍弃数据的

res5, _ := rectangle(8, 10)
fmt.Println("周长:", res5)
fmt.Println("不需要面积")

13.函数中变量的作用域

作用域:变量可以使用的范围

  • 局部变量:函数内部定义的变量,就叫做局部变量
    • 变量定义在哪儿,就只能在哪个范围内使用,超出作用范围,我们可以认为变量被销毁了
  • 全局变量:函数外部定义的变量,就叫做全局变量
    • 所有的函数都可以使用,而且共享这一份数据
/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/5/9  0:50
 * @tags 喜欢就去努力的争取
 */
package main

import "fmt"

// 全局变量
var num = 200

func main() {
	fun5()
	fmt.Println(num)
}

func fun5() {
	// 局部变量
	num := 100
	fmt.Println(num)
}

14.递归函数

/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/5/11  21:47
 * @tags 喜欢就去努力的争取
 */
package main

import "fmt"

func main() {

	/**
	递归函数
	求1-5的和?
	*/
	sum := diGuiSum(5)
	fmt.Printf("%T,%d\n", sum, sum)

	sequence := fibonacciSequence(100)
	fmt.Println(sequence)
}

func diGuiSum(num int) (sum int) {
	if num == 1 {
		return num
	}
	return num + diGuiSum(num-1)
}

/*
*
1 1 2 3 5 8 13 21
*/
func fibonacciSequence(num int) int {
	if num == 1 || num == 2 {
		return 1
	}
	return fibonacciSequence(num-1) + fibonacciSequence(num-2)
}

标签:函数,17,int,fmt,num,func,Println
From: https://www.cnblogs.com/qbbit/p/17367897.html

相关文章

  • AtCoder Beginner Contest 177 F I hate Shortest Path Problem
    洛谷传送门AtCoder传送门设\(f_{i,j}\)为从第\(1\)行到\((i+1,j)\)的最短路。因为我们并不关心最后到达的是哪一个格子,于是强制\(f_{i,j}\)为必须从\((i,j)\)往下走一格到\((i+1,j)\)的最短路。有转移:\[f_{i,r+1}\getsf_{i-1,j}+r+2-j,j\in[l......
  • P3723 [AH2017/HNOI2017]礼物(FFT)
    P3723[AH2017/HNOI2017]礼物(FFT)目录P3723[AH2017/HNOI2017]礼物(FFT)[AH2017/HNOI2017]礼物题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示思路题意分析题目传送门[AH2017/HNOI2017]礼物题目描述我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他......
  • LR损失函数的两种形式
    1.label为1和0 2.label为1和-1因为:所以: 最后可以得到损失函数为: 参考资料https://zhuanlan.zhihu.com/p/362317339 ......
  • 如何手写一个promise函数
    constPENDING='pending'constFULFILLED='fulfilled'constREJECT='rejected';classMyPromise{#state=PENDING#result=undefined#handler=[]constructor(executor){constresolve=(data)......
  • 17th
    卖金鱼源代码#include<iostream>usingnamespacestd;intmain(){ intx=11; //1x/2+1/2 //2x/3+1/3 //3x/4+1/4 //4x/5+1/5最后剩下11条 /*因为金鱼只能整条出售所以,x只能是奇数(x-x/2-1/2)-((x-x/2-1/2)/3-1/3)-......=11*///逆运算for(inti=4;i>=1;i-......
  • 移相全桥控制算法的C代码+仿真模型,电压单闭环,电压外环电流内环双闭环,采用S函数调用的
    移相全桥控制算法的C代码+仿真模型,电压单闭环,电压外环电流内环双闭环,采用S函数调用的方式直接在simulnik环境下对C代码进行仿真。已经在样机上验证过,波形非常好!ID:2560680754811245......
  • 使用 Lambda 函数将 CloudWatch Log 中的日志归档到 S3 桶中
    >作者:[SRE运维博客](https://www.cnsre.cn/)>博客地址:[https://www.cnsre.cn/](https://www.cnsre.cn/)>文章地址:[https://www.cnsre.cn/posts/221205544069/](https://www.cnsre.cn/posts/221205544069/)>相关话题:[https://www.cnsre.cn/tags/aws/](https://www.cnsr......
  • LSTM算法做时间序列的预测,使用matlab自带的LSTM工具箱函数,预测精度很高,网络参数最优化
    LSTM算法做时间序列的预测,使用matlab自带的LSTM工具箱函数,预测精度很高,网络参数最优化处理,误差评价指标计算。ID:6768660696244807......
  • EKF_SOC_Estimation函数使用二阶RC等效电路模型估算电池的端电压(Vt)和充电状态(SOC)。
    EKF_SOC_Estimation函数使用二阶RC等效电路模型估算电池的端电压(Vt)和充电状态(SOC)。该功能可以使用扩展卡尔曼滤波器(EKF)或自适应扩展卡尔曼滤波器(AEKF)。用户还可以选择估算-20℃至40℃的SOC。其中包括一个样品LA92行驶周期,电池参数(包括内部电阻)和Turnigy电池的SOC-OCV曲线。SOC......
  • python基础学习-hashlib - 哈希函数模块
    hashlib-哈希函数模块参考地址:Python-Core-50-Courses/第20课:Python标准库初探.mdatmaster·jackfrued/Python-Core-50-Courses(github.com)待补充......哈希函数又称哈希算法或散列函数,是一种为已有的数据创建“数字指纹”(哈希摘要)的方法。哈希函数把数据压缩成摘要,对......