• ~~函数基础(二):返回值&作用域~~


    进击のpython

    ***** # 函数的返回值和作用域

    上文我们讲到了函数的基础——参数的相关问题

    举的例子也都是带有print的函数定义

    但是有个问题就出现了:我不想打印这个函数处理后的参数

    我想拿到这个参数然后做后续的事情

    我应该怎么办呢?


    • 返回值

      这就需要一个关键字 return 来解决这个问题了

      return:回来 回去 返回 带回……(又学个英语单词)

      那我们就能看出来,这个词的意思就是从函数当中把参数拿回来的意思

      对吧!

      那么原先的函数我就可以这么写:

      def func(x, y, z):
          a = "输入的三个数为%s,%s,%s" % (x, y, z)
          return a
      
      
      func(1, 2, 3)
      print(func(1, 2, 3))
      

    第一个执行了func()函数,返回了a,但是没有打印出来

    第二个执行了func()函数,返回了a,打印了出来

    这样 我想打印出来就打印出来,我不想打印就不打印,就很舒服!


    很简单的一个小知识点

    但是却有一个小陷阱!

    函数执行过程中,遇到了 return 那就不执行接下来的语句,直接退出函数。

    (想想还有哪个像这个??循环里的break)

    给你举个例子:

    def func(x, y, z):
        a = "输入的三个数为%s,%s,%s" % (x, y, z)
        return a
        print("这句话执行不出来")
    
    
    print(func(1, 2, 3))
    

    明白了吧!


    当然 有的时候也不一定要指定返回值,那我们看看这东西会返回什么

    def func(x, y, z):
        a = "输入的三个数为%s,%s,%s" % (x, y, z)
        # return a
        # print("这句话执行不出来")
    
    
    print(func(1, 2, 3))
    

    OK,那我们大概可以知道了,没有指定返回值,那就返回None!
    那要是有多个返回值呢?

    def func(x, y, z):
        a = x * 2
        b = y * 3
        c = z * 4
        return a, b, c
    
    
    print(func(1, 2, 3))
    
    (2, 6, 12)
    

    ┗|`O′|┛ 嗷~~!

    当有多个返回值的时候,返回的是个元组!

    但是奥!切记!!return是终止函数!!但是不会终止循环!

    lst = [1, 2, 3, 4, 5]
    
    
    def func():
       for i in lst:
            print(i)
            return
    
    
    print(func())
    
    1
    None
    

    懂我意思吧!凑弟弟!


    • 作用域

      说作用域那可就是相当抽象了

      作用域就相当于你能够行使权利的区域

      你的员工卡高级,你就能去公司更高层的办公室

      你的员工卡低级,那你就只能在你的一亩三分地呆着了

      员工卡就类比成程序中的变量

      那怎么设置程序中“员工卡”的等级呢?

      这就是函数的作用域了


      话不多说,直接上代码:(1.1)

      name = "jevious"
      
      
      def change():
          print(name)
      
      
      change()
      

      我在 change() 函数中调用这个name,能调用吗?

      执行了!可以!会输出这个 jevious

      那我可以修改这个变量吗?

      name = "jevious"
      
      
      def change():
          name = "poddy"
          print(name)
      
      
      change()
      

      打印的是什么呢?(自己试试 打印的是 poddy)

      那,这真的将name变量修改了吗?(1.2)

      name = "jevious"
      
      
      def change():
          name = "poddy"
          print(name)
      
      
      change()
      print(name)
      

    两个结果,说明name没有被修改

    那是怎么回事呢?

    不卖关子,直接 tell you

    在函数外面的name 是全局变量

    在函数内部的name 是局部变量

    当函数在自己一片区域里发现到自己需要的变量就用自己的变量(1.2)

    当函数在自己区域里没有找到想要的变量就去外面找需要的变量(1.1)

    所以说,在局部不能修改全局的变量

    看到的修改其实只是在局部新建了变量

    怎么验证呢?python给我们提供了两种方法

    localsglobals

    name = "jevious"
    
    
    def change():
        name = "poddy"
        age = "22"
        print(locals())  # 局部变量
        print(globals())  # 全局变量
    
    
    change()
    print(name)
    

    下面的你不用都看,因为全局的比较多,但是你会在里面找到'name': 'jevious'

    但是你却找不到age的任何信息


    • 总结

      知识点就有点杂,慢慢积累被:

      1、在函数中定义的是局部变量,在程序一开始定义的是全局变量

      2、全局变量的作用域是整个程序,局部变量作用域是定义该变量的函数

      3、变量的查找顺序是局部变量>全局变量

      4、当全局变量与局部变量同名时,在函数里,局部起作用;在其他地方,全局起作用

      5、在函数里不能直接修改全局变量


      就有艮的,就想在函数中定义全局变量

      global

      用这个关键字,先声明,再赋值,这样就是全局的了

      # name = "jevious"
      
      
      def change():
          global name
          name = "poddy"
          age = "22"
          print(locals())  # 局部变量
          print(globals())  # 全局变量
      
      
      change()
      print(name)
      
      

      自己打印结果,我可不想像你这么艮,而且也不建议这么使用

      那你丫非得这么艮?那你开心就好!


    其实不光是以上的需求,有的时候,我们还需要在函数里调用全局变量然后进行修改

    很明显,根据上面的理论,直接修改是不行的

    所以我们可以声明一个全局变量,再进行修改

    a = 10
    
    
    def func():
        global a
        a += 1
        print(a)
        return a
    
    
    func()
    

    这样就对a进行了修改

    但是不一定需求这么简单,我现在想调用函数里面的参数可以直接调用

    那我要是想修改呢?

    那就需要一个局部声名了 nonlocal

    但是注意奥,这个方法只能在局部里找参数,如果局部没有就报错

    根本不往全局看

    a = 10
    
    
    def func():
        nonlocal a
        a += 1
        print(a)
        return a
    
    
    func()
    
    SyntaxError: no binding for nonlocal 'a' found
    
    a = 10
    
    
    def foo():
        a = 20
    
        def func():
            nonlocal a
            a += 1
            print(a)
            return a
    
    
    foo()
    
    

    因为在上一个局部里有a这个参数,找到了,就不会报错!


    *这没啥用*
    *但你别艮*
  • 相关阅读:
    根据屏幕大小,加载不同大小的图片
    规范命名CSS
    iframe框架加载完成后执行函数
    js获取IP地址
    80端口被System占用 造成Apache不能启动的解方案
    自定义一个仿Spinner
    让你的代码量减少3倍!使用kotlin开发Android(一)
    屏幕适配
    一个旋转菜单
    手势监听GestureDetector 案例
  • 原文地址:https://www.cnblogs.com/jevious/p/11131748.html
Copyright © 2020-2023  润新知