进击の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这个参数,找到了,就不会报错!


*这没啥用*
*但你别艮*

~~函数基础(二):返回值&作用域~~的更多相关文章

  1. python函数基础-参数-返回值-注释-01

    什么是函数 函数就是有特定功能的工具 # python中有内置函数(python解释器预先封装好的)与自定义函数(用户自定义封装的)之分 为什么要用函数 # 可以减少代码冗余,增加代码复用性 # 使代 ...

  2. linux shell自定义函数(定义、返回值、变量作用域)介绍

    http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell ...

  3. go语言基础之函数只有一个返回值

    1.函数只有一个返回值 示例1: package main //必须有一个main包 import "fmt" func myfunc01() int { return 666 } ...

  4. Python基础之函数参数与返回值进阶

    参数作用:如果外界希望在函数内部处理数据,就可以将数据作为参数传入函数内部: 返回值作用:如果希望一个函数函数执行完成后,向外界报告函数的执行结果,就可以使用函数的返回值. 函数的返回值 进阶 利用元 ...

  5. JS基础语法---函数---介绍、定义、函数参数、返回值

    函数: 把一坨重复的代码封装,在需要的时候直接调用即可 函数的作用: 代码的重用 函数需要先定义,然后才能使用 函数名字:要遵循驼峰命名法 函数一旦重名,后面的会把前面的函数覆盖 Ctrl +鼠标左键 ...

  6. scala基础题--函数可以没有返回值案例,编写一个函数,从终端输入一个整数,打印出对应的金字塔

    函数可以没有返回值案例,编写一个函数,从终端输入一个整数,打印出对应的金字塔 import scala.io.StdIn object work02 { def main(args: Array[St ...

  7. 【C语言入门教程】5.1 函数说明 与 返回值

    C 语言是结构化语言,它的主要结构成分是函数.函数被作为一种构件,用以完成程序中的某个具体功能.函数允许一个程序的各个任务被分别定义和编码,使程序模块化.本章介绍 C 语言函数的设计,如何用函数分解程 ...

  8. Python函数变量和返回值

    Python函数的全局变量和局部变量 1.不同的编程语言,程序可以分为函数和过程两大类,函数具有具体返回值,而过程则不具有具体的返回值,python只具有函数,因为对于它的一般函数,其返回值为所具体返 ...

  9. python开发初识函数:函数定义,返回值,参数

    一,函数的定义 1,函数mylen叫做函数名 #函数名 #必须由字母下划线数字组成,不能是关键字,不能是数字开头 #函数名还是要有一定的意义能够简单说明函数的功能 2,def是关键字 (define) ...

  10. [Golang]-3 函数、多返回值、变参、闭包、递归

    // test01 project main.go package main import ( "fmt" ) // 单返回值的函数 func plus(a int, b int) ...

随机推荐

  1. WEB性能优化【资料】

    为了解决近期项目遇到的性能瓶颈,花费不少功夫恶补了web性能的相关优化方案,整理了一些资料,分享给大家. 博客 网页性能管理详解 - 阮一峰的网络日志 页面性能优化的利器 - Timeline - 云 ...

  2. Delphi Android ActivityManager(提供了接口, 利用它可以方便的对Memory, Processes, Task, Service 等进行管)

    ActivityManager:   对Activity交互提供了接口, 利用它可以方便的对Memory, Processes, Task, Service 等进行管理,. 这里对Delphi接口进行 ...

  3. MQTT开源代理Mosquitto源码分析(访问控制篇)

    一.整体流程概览 从GitHub下载源码后,代理的源码在src中,同时还用到了lib库中的一些函数.对项目的工作流程有个大概理解是分析mosquitto的访问控制权限的基础,网络上已有很多中文博客在介 ...

  4. 从零开始学习音视频编程技术(三) 开发环境搭建(Qt4.86手动设置环境,主要就是设置g++和qmake,比较透彻,附下载链接)

    1.先下载安装Qt 我们使用的版本是4.8. 可以自行百度下载也可以从下面的网盘地址下载: Qt库和编译器下载: 链接:http://pan.baidu.com/s/1hrUxLIG 密码:0181 ...

  5. ubuntu Linux 操作系统安装与配置

    Ubuntu是一个以桌面应用为主的Linux操作系统.Ubuntu每六个月发布一个新版本(一般是4和10月份,命名为YY.MM),每一个普通版本都将被支持 18个月,长期支持版(Long Term S ...

  6. C# 设置IP地址及设置自动获取IP

    原文:C# 设置IP地址及设置自动获取IP </pre><pre name="code" class="csharp">1.添加引用&q ...

  7. MyCat的初步了解

    MyCat 1 开源数据库中间件 MyCat   如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据 ...

  8. 使用Disk2VHD进行P2V转换需要知道的一些事

    据不可靠统计,有「无数」工具可以实现物理机到虚拟机的(P2V)转换,虽然有很多此类工具都被开发商帖上了高价标签,但至少来自微软 Sysinternals 工具集中的 Disk2VHD 还是可以免费使用 ...

  9. c#与JAVA利用SOCKET实现异步通信的SanNiuSignal.DLL已开源

    大家好,前段时间C#的SanNiuSignal.DLL已开源;因部分用户特需要JAVA版的SanNiuSignal;现在只能把半成品先拿出来暂时给他们用了,以后再慢慢改进; JAVA版目前已实现跟C# ...

  10. JavaScript-DOM续

    一.路由的跳转 <body> <a href="#/course">课程</a> <a href="#/main"&g ...