精华内容
下载资源
问答
  • 6.2 函数参数与返回值函数能够接收参数供自己使用,也可以返回零个或多个值(我们通常把返回多个值称为返回一组...事实上,任何一个有返回值(单个或多个)的函数都必须以 return 或 panic(参考第 13 章)结尾。...

    6.2 函数参数与返回值

    函数能够接收参数供自己使用,也可以返回零个或多个值(我们通常把返回多个值称为返回一组值)。相比与 C、C++、Java 和 C#,多值返回是 Go 的一大特性,为我们判断一个函数是否正常执行(参考 第 5.2 节)提供了方便。

    我们通过 return 关键字返回一组值。事实上,任何一个有返回值(单个或多个)的函数都必须以 return 或 panic(参考第 13 章)结尾。

    在函数块里面,return 之后的语句都不会执行。如果一个函数需要返回值,那么这个函数里面的每一个代码分支(code-path)都要有 return 语句。

    问题 6.1:下面的函数将不会被编译,为什么呢?大家可以试着纠正过来。

    func (st *Stack) Pop() int {
        v := 0
        for ix := len(st) - 1; ix >= 0; ix-- {
            if v = st[ix]; v != 0 {
                st[ix] = 0
                return v
            }
        }
    }    

    函数定义时,它的形参一般是有名字的,不过我们也可以定义没有形参名的函数,只有相应的形参类型,就像这样:func f(int, int, float64)

    没有参数的函数通常被称为 niladic 函数(niladic function),就像 main.main()

    6.2.1 按值传递(call by value) 按引用传递(call by reference)

    Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Function(arg1)

    如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加&符号,比如 &variable)传递给函数,这就是按引用传递,比如 Function(&arg1),此时传递给函数的是一个指针。如果传递给函数的是一个指针,指针的值(一个地址)会被复制,但指针的值所指向的地址上的值不会被复制;我们可以通过这个指针的值来修改这个值所指向的地址上的值。(译者注:指针也是变量类型,有自己的地址和值,通常指针的值指向一个变量的地址。所以,按引用传递也是按值传递。

    几乎在任何情况下,传递指针(一个32位或者64位的值)的消耗都比传递副本来得少。

    在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。

    有些函数只是完成一个任务,并没有返回值。我们仅仅是利用了这种函数的副作用,就像输出文本到终端,发送一个邮件或者是记录一个错误等。

    但是绝大部分的函数还是带有返回值的。

    如下,simple_function.go 里的 MultiPly3Nums 函数带有三个形参,分别是 abc,还有一个 int 类型的返回值(被注释的代码具有和未注释部分同样的功能,只是多引入了一个本地变量):

    示例 6.2 simple_function.go

    package main
    
    import "fmt"
    
    func main() {
        fmt.Printf("Multiply 2 * 5 * 6 = %d\n", MultiPly3Nums(2, 5, 6))
        // var i1 int = MultiPly3Nums(2, 5, 6)
        // fmt.Printf("MultiPly 2 * 5 * 6 = %d\n", i1)
    }
    
    func MultiPly3Nums(a int, b int, c int) int {
        // var product int = a * b * c
        // return product
        return a * b * c
    }

    输出显示:

    Multiply 2 * 5 * 6 = 60

    如果一个函数需要返回四到五个值,我们可以传递一个切片给函数(如果返回值具有相同类型)或者是传递一个结构体(如果返回值具有不同的类型)。因为传递一个指针允许直接修改变量的值,消耗也更少。

    问题 6.2:

    如下的两个函数调用有什么不同:

    (A) func DoSomething(a *A) {
            b = a
        }
    
    (B) func DoSomething(a A) {
            b = &a
        }

    6.2.2 命名的返回值(named return variables)

    如下,multiple_return.go 里的函数带有一个 int 参数,返回两个 int 值;其中一个函数的返回值在函数调用时就已经被赋予了一个初始零值。

    getX2AndX3 与 getX2AndX3_2 两个函数演示了如何使用非命名返回值与命名返回值的特性。当需要返回多个非命名返回值时,需要使用 () 把它们括起来,比如 (int, int)

    命名返回值作为结果形参(result parameters)被初始化为相应类型的零值,当需要返回的时候,我们只需要一条简单的不带参数的return语句。需要注意的是,即使只有一个命名返回值,也需要使用 () 括起来(参考 第 6.6 节的 fibonacci.go 函数)。

    示例 6.3 multiple_return.go

    package main
    
    import "fmt"
    
    var num int = 10
    var numx2, numx3 int
    
    func main() {
        numx2, numx3 = getX2AndX3(num)
        PrintValues()
        numx2, numx3 = getX2AndX3_2(num)
        PrintValues()
    }
    
    func PrintValues() {
        fmt.Printf("num = %d, 2x num = %d, 3x num = %d\n", num, numx2, numx3)
    }
    
    func getX2AndX3(input int) (int, int) {
        return 2 * input, 3 * input
    }
    
    func getX2AndX3_2(input int) (x2 int, x3 int) {
        x2 = 2 * input
        x3 = 3 * input
        // return x2, x3
        return
    }

    输出结果:

    num = 10, 2x num = 20, 3x num = 30    
    num = 10, 2x num = 20, 3x num = 30 

    警告:

    • return 或 return var 都是可以的。
    • 不过 return var = expression(表达式) 会引发一个编译错误:syntax error: unexpected =, expecting semicolon or newline or }

    即使函数使用了命名返回值,你依旧可以无视它而返回明确的值。

    任何一个非命名返回值(使用非命名返回值是很糟的编程习惯)在 return 语句里面都要明确指出包含返回值的变量或是一个可计算的值(就像上面警告所指出的那样)。

    尽量使用命名返回值:会使代码更清晰、更简短,同时更加容易读懂。

    练习 6.1 mult_returnval.go

    编写一个函数,接收两个整数,然后返回它们的和、积与差。编写两个版本,一个是非命名返回值,一个是命名返回值。

    练习 6.2 error_returnval.go

    编写一个名字为 MySqrt 的函数,计算一个 float64 类型浮点数的平方根,如果参数是一个负数的话将返回一个错误。编写两个版本,一个是非命名返回值,一个是命名返回值。

    6.2.3 空白符(blank identifier)

    空白符用来匹配一些不需要的值,然后丢弃掉,下面的 blank_identifier.go 就是很好的例子。

    ThreeValues 是拥有三个返回值的不需要任何参数的函数,在下面的例子中,我们将第一个与第三个返回值赋给了 i1 与f1。第二个返回值赋给了空白符 _,然后自动丢弃掉。

    示例 6.4 blank_identifier.go

    package main
    
    import "fmt"
    
    func main() {
        var i1 int
        var f1 float32
        i1, _, f1 = ThreeValues()
        fmt.Printf("The int: %d, the float: %f \n", i1, f1)
    }
    
    func ThreeValues() (int, int, float32) {
        return 5, 6, 7.5
    }

    输出结果:

    The int: 5, the float: 7.500000

    另外一个示例,函数接收两个参数,比较它们的大小,然后按小-大的顺序返回这两个数,示例代码为minmax.go。

    示例 6.5 minmax.go

    package main
    
    import "fmt"
    
    func main() {
        var min, max int
        min, max = MinMax(78, 65)
        fmt.Printf("Minmium is: %d, Maximum is: %d\n", min, max)
    }
    
    func MinMax(a int, b int) (min int, max int) {
        if a < b {
            min = a
            max = b
        } else { // a = b or a < b
            min = b
            max = a
        }
        return
    }

    输出结果:

    Minimum is: 65, Maximum is 78

    6.2.4 改变外部变量(outside variable)

    传递指针给函数不但可以节省内存(因为没有复制变量的值),而且赋予了函数直接修改外部变量的能力,所以被修改的变量不再需要使用 return 返回。如下的例子,reply 是一个指向 int 变量的指针,通过这个指针,我们在函数内修改了这个int 变量的数值。

    示例 6.6 side_effect.go

    package main
    
    import (
        "fmt"
    )
    
    // this function changes reply:
    func Multiply(a, b int, reply *int) {
        *reply = a * b
    }
    
    func main() {
        n := 0
        reply := &n
        Multiply(10, 5, reply)
        fmt.Println("Multiply:", *reply) // Multiply: 50
    }

    这仅仅是个指导性的例子,当需要在函数内改变一个占用内存比较大的变量时,性能优势就更加明显了。然而,如果不小心使用的话,传递一个指针很容易引发一些不确定的事,所以,我们要十分小心那些可以改变外部变量的函数,在必要时,需要添加注释以便其他人能够更加清楚的知道函数里面到底发生了什么。




    展开全文
  • 函数是有一定功能的一个代码块,因为C云雨烟处理数据的关系,而内存存储不同类型的值有不同的存放方法,所以任何数据都有类型,任何东西也必须有名称,所以函数定义就是 函数类型(返回值类型) 函数名称(参数类型1...

    函数是有一定功能的一个代码块,因为C云雨烟处理数据的关系,而内存存储不同类型的值有不同的存放方法,所以任何数据都有类型,任何东西也必须有名称,所以函数定义就是
    函数类型(返回值类型) 函数名称(参数类型1 参数名称1,参数类型2 参数名称2…)
    {
    函数体
    }
    也就是函数对参数进行处理,返回一定的数据,这也是函数的功能。
    关于void 和return :
    可以这么理解,函数可以分为有无返回值和需不需要返回,可以进行两两组合:
    1,有返回值,需要返回,就是一般形式
    2,有返回值,不需要返回,函数名称前有void,且函数体不能出现return某值,但可以只有一个return。
    3,无返回值,不需要返回,函数名称前有void,且函数体不能出现return某值,但可以只有一个return。
    4,无返回值,需要返回,这种情况不存在
    以上可见,函数名前有void存在,1,函数体就不能出现return 某值,2,但可以只出现return,3,可以什么也不出现
    主调函数从被调函数的位置开始,进入被调函数,对变元(主调函数传递给被调函数的参数值)进行操作,被调函数执行结束时,主调函数再从这里继续执行剩余部分,当然一个函数可以进行多次调用。
    多个函数之间的调用机制:
    函数就是一个功能,进行编译函数或者调用函数时先想明白我要用他做什么,也就是我1,给这个函数什么数据,函数体内进行操作后,我能得到什么,这点必须想清楚。2,然后再是怎么操作;这是需要思考的两个点,并且顺序要正确。然后执行完这个函数后,我就会得到我想要的一部分数据注意加粗部分,执行得到的数据又可以作为参数给另一个函数
    举例:
    2*(a+bc)
    这里可以有3个函数,一个加函数,一个乘函数,一个2
    某数的函数。
    1,先定义乘函数,函数体是两数形成,返回积,调用函数时两变元肯定是已知的。调用完毕,注意这时积就是已知的了,可以作为其他函数的参数了
    2,再定义加函数,函数体是两值相加,返回和,调用函数进行调用该函数时,两个变元中就包括第一步的返回值,因为它已经是已知的了。
    3,可以定义2*函数,也可以用第一个乘函数,这时候函数体中的第一个乘数是2,第二个乘数是第二步的和

    展开全文
  • 函数变量 ...在一个文件顶部定义的变量可以供文件中的任何函数调用,这些可以为整个程序所使用的变量称为全局变量。 #!/usr/bin/python def fun(): x = 100 print x fun() print x //变量只...

    函数变量

    局部变量和全局变量

    • python中的任何变量都有特定的作用域
    • 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量。
    • 在一个文件顶部定义的变量可以供文件中的任何函数调用,这些可以为整个程序所使用的变量称为全局变量。
    #!/usr/bin/python
    def fun():
       x = 100
       print x
    fun()
    print x //变量只在函数内有效
    
    
    #!/usr/bin/python
    x = 100
    def fun():
       global x //声明下全局变量,否在函数内无法操作全局变量
       x += 1
       print x
    fun()
    print x
    
    #!/usr/bin/python
    x = 100
    def fun():
       x = 1
       y = 1
       print locals() //返回的是一个字典,保存了函数的两个变量
    fun()
    print locals()
    

    函数返回值

    • 函数被调用后会返回一个指定的值
    • 函数调用后默认返回None
    • return 返回值
    • 返回值可以是任意类型
    • return执行后,函数终止
    • return与print区别
    #!/usr/bin/python
    import sys
    import os
    
    def isNum(s):
        for i in s:
            if i not in '0123456789':
                return False
        return True
    for i in os.listdir('/proc'):
        if isNum(i):  //如果返回是true说明i是纯数字
            print i
    
    a.isdigit() 通过字符串方法判断是不是数字
    #!/usr/bin/python
    import sys
    import os
    
    def isNum(s):
          if s.isdigit():
              return Ture
          return False
    for i in os.listdir('/proc'):
        if isNum(i):  //如果返回是true说明i是纯数字
            print i
       ```
    
    展开全文
  • 本文出自“Python为什么”系列,在正式开始之前,我们就用之前讨论过的 pass语句和 …对象 作为例子,看看 Python 的函数是怎样“无中生有”的:可以看出,我们定义的两个函数都没有写任何的 return 语句,但是在...

    1f9fceee8a9fd9e0a1609ce1de24844f.png

    作者:豌豆花下猫

    来源:Python猫

    Python 有一项默认的做法,很多编程语言都没有——它的所有函数都会有一个返回值,不管你有没有写 return 语句。

    本文出自“Python为什么”系列,在正式开始之前,我们就用之前讨论过的 pass语句和 …对象 作为例子,看看 Python 的函数是怎样“无中生有”的:

    57c0866120d8ea40a2f2543f54cc6323.png

    可以看出,我们定义的两个函数都没有写任何的 return 语句,但是在函数调用后,都能取到一个返回值。

    它们的执行效果跟直接写 return 语句相比,是完全相同的:

    547885e8e5ff6c8ea65caca1fe9e6004.png

    这 4 个例子属于两种类型:一种没有写 return,但是都有隐藏的 return 返回值;一种写了 return,而且实际也有返回值。

    也就是说,后者在语义和行为上表现一致,前者虽然在语义上缺失,但是却有实际的行为和结果;后者的行为是显性的,前者却是隐性的。

    《Python之禅》中有一句“显性胜于隐性(Explicit is better than implicit)”,但是,出于简洁和便利的考虑(Simple is better than complex),实际上 Python 中有很多行为都是隐性的,会把一些在语法层面的事交给解释器去完成。

    上一期的 真值判断 是隐性的行为,本文前两个例子也是如此。

    使用dis查看字节码,就可以看到其背后的小动作:

    4cfa5b989e1d4096daf2c69ccff770d4.png

    在这个对比图中,可以看出上述 4 个函数的解释器指令一模一样!

    不管有没有写 return,它们都会执行 return 的逻辑,而且默认的返回值就是 None。

    那么,问题来了:Python 的函数为什么能默认返回 None 呢?它是如何实现的呢?

    答案就在解释器中,当 CPython 解释器执行到函数的最后一个代码块时,若发现没有返回值,它就会主动地加上一个 Py_None 值返回(出自:compile.c):

    f0bec1e67c43c8b716466475dcf5a38a.png

    也就是说,如果定义的函数没有返回值,Python 解释器就会(强行地)默认给我们注入一段返回逻辑!

    对于解释器的这种附赠的服务,大家是觉得很贴心,还是嫌弃它多事呢?这样的做法似乎没多少好处,但似乎也没有坏处?大家有什么疑问可以后台留言或评论哦!

    展开全文
  • 构造函数返回值

    2019-09-29 14:37:58
    而其他方法都有返回值.即使是void返回值,尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的。 构造函数是没有返回值的,即使使用void也不可以;但是在一个类中可以使用返回值为...
  • 注意:在定义带默认参数的函数时,默认参数只能出现在所有参数的最右端,并且任何一个默认参数的右侧不能再定义非默认参数 # 默认参数示例 def interest(money, day=1, interest_rate=0.05): income = 0 ...
  • js中函数返回值return

    千次阅读 2017-06-30 11:26:22
    js中函数返回值:return 一、函数返回值需要注意的几点:  1、函数名+括号:如fn1() == return 后面的值  2、所有函数默认返回值... 1、return返回的类型: js中函数返回值类型数字、字符串、布尔值、函
  • Python中的任何变量都有特定的作用域在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量在一个文件顶部定义的变量可以供文件中的任何函数调用,这些可以为整个程序...
  • 1. 任何函数都有返回值的。 2. 若是一个函数没有return,则返回值为None。 3. 若是一个函数有return,则返回值为函数执行后的值或表达式。 ''' # 例子一 def add(a,b): c=a+b print (c) # 执行后显示4,为打印...
  • C++函数返回值的规则

    千次阅读 2019-01-03 10:12:32
    C++函数返回值的规则 【规则6-2-1】不要省略返回值...由于C++程序可以调用C函数,为了避免混乱,规定任何C++/ C函数都必须类型。如果函数没有返回值,那么应声明为void类型。   【规则6-2-2】函数名字与返回值...
  • 引用作为函数返回值

    2020-12-22 22:40:27
    一、引用作为函数参数 ...即使函数内部对参数的修改,也只是针对形参,也是那个副本,实参不会有任何更改。函数一旦结束,形参生命也宣告终结,做出的修改一样没对任何变量产生影响。  例如: v
  • return语句是从python 函数返回一个值,在讲到定义函数的时候讲过,每个函数都一个返回值。Python中的return语句什么作用,今天就来仔细的讲解一下。 python 函数返回值 return,函数中一定要return...
  • 函数的变量和返回值

    千次阅读 2018-01-03 20:35:03
    局部变量:在Python中的任何变量都有特定的作用域,在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量 全局变量:在一个文件顶部定义的变量可以供文件中的任何...
  • return语句是从python 函数返回一个值,在讲到定义函数的时候讲过,每个函数都一个返回值。Python中的return语句什么作用,今天小编就依目前所了解的讲解一下。python 函数返回值 return,函数中一定要...
  • Python中的任何变量都有特定的作用域在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量在一个文件顶部定义的变量可以供文件中的任何函数调用,这些可以为整个程序...
  • 在PHP中所有的函数都有返回值——即使你没有指定它返回内容。因此在PHP中声名”void”(无返回值)的函数没有意义。你可以使用return关键字来指定要返回的内容: function hello(){ return "Hello World"; // 没有...
  • 首先看看怎么获取命令的返回值, 根据linux标准,返回0就是正确,非0就是错误的原则,只要命令执行正确,返回的一般是0,那么怎么获取命令的返回值?...0表示没有错误,其他任何值表明错误) ls -l a=...
  • return 语句是Python语言中函数返回的一个值,每个函数都应该一个返回值;其中,return返回值可以是一个数值,一个字符串,一个布尔值或者一个列表。 Python 函数返回值return ,函数中一定要return 返回值才是...
  • python中的任何变量都有特定的作用域 在函数里面定义的变量一般只能在该函数内部使用,这些称之为局部变量, 在一个文件顶部定义的变量可以供文件中的任何函数调用,这些称之为全局变量。 声明全局变量,就能再函数...
  • 局部变量--- python中的任何变量都有特定的作用域,在函数中定义的变量,一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量,我们称为局部变量 全局变量--- 在一个文件顶部定义的变量,可以供...
  • 在正式开始之前,我们就用之前讨论过的 pass语句和 …对象 作为例子,看看 Python 的函数是怎样“无中生有”的:可以看出,我们定义的两个函数都没有写任何的 return 语句,但是在函数调用后,都能取到一个返回值。...
  • return语句是从python 函数返回一个值,在讲到定义函数的时候讲过,每个函数都一个返回值。Python中的return语句什么作用,今天就来仔细的讲解一下。python 函数返回值 return,函数中一定要return返回值...
  • Python中的任何变量都有特定的作用域 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量 在一个文件顶部定义的变量可以供文件中的任何函数调用,这些可以为整个...
  • return语句是从python 函数返回一个值,在讲到定义函数的时候讲过,每个函数都一个返回值。Python中的return语句什么作用,今天就来仔细的讲解一下。python 函数返回值 return,函数中一定要return返回值...
  • 在正式开始之前,我们就用之前讨论过的 pass语句 和 …对象 作为例子,看看 Python 的函数是怎样“无中生有”的:可以看出,我们定义的两个函数都没有写任何的 return 语句,但是在函数调用后,都能取到一个返回值。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 878
精华内容 351
关键字:

任何函数都有返回值