python函数的返回值、嵌套方式以及函数中的变量_python 函数返回值 变量-程序员宅基地

技术标签: python基础语法,高阶实战应用教学  python函数  python  返回值  变量  开发语言  

函数的返回值

Python函数的返回值可以通过使用return关键字来指定。当调用该函数时,会将函数中所有被return语句后面跟着的表达式作为结果返回。

return 自定义函数的返回值

概念:return 把函数内部的数据返回到函数的外面,返回到函数的调用处
1.return + 六大标准数据类型 , 除此之外还可以 返回函数 或者 是类对象
2.return 在执行时,意味着终止函数,后面的代码不执行.
3.如果不定义return返回值,默认返回None

(1) return + 六大标准数据类型,每次只能返回一个数据

def func():
    # return 111
    # return 6.89
    # return "你好帅啊,我爱死你乐"
    # return [1,2,3]                         #如果要返回多个值,将数据放入列表或元祖中,返回个列表或元祖
    # return {"a":1,"b":2}
    return 1,2,3 # 返回元组
res = func()
print(res)

(2) return 在执行时,意味着终止函数,后面的代码不执行.

def func():
    print(1)
    print(2)
    return 3
    print(4)
res = func()
print(res)

后面的4没打印出来
在这里插入图片描述

def func():
    for i in range(5):
        if i == 3:
            return 4
        print(i)
res = func()
print(res)

i = 3的时候,返回4,后面的循环就没在执行

在这里插入图片描述

(3) 如果不定义return返回值,默认返回None

def func():
    pass
    
res = func()
print(res) # None

在这里插入图片描述

#注意点 打印的数据和返回的数据不是等价的,返回的数据是可以自定义的;

res = print(1234)
print(res)  # None

没定义返回值,返回None
在这里插入图片描述

案例 模拟±*/计算器

"""
功能:   完成计算
参数:   2个数字和运算符
返回值: 计算后的结果
"""
def calc(num1,num2,sign):
    if sign == "+":
        return num1 + num2
    elif sign == "-":
        return num1 - num2
    elif sign == "*":
        return num1 * num2
    elif sign == "/":
        if num2 == 0:
            return "除数不能为零"
        return num1 / num2
    else:
        return "抱歉,超出了我的运算范围."
    
res = calc(3,5,"+")
res = calc(3,5,"-")
res = calc(3,5,"*")
res = calc(3,0,"/")
res = calc(3,0,"&")
print(res)

写函数谨记从三个方面去抓:功能,参数,返回值。这三个方面搞好了,就能写出优秀的函数
在这里插入图片描述

函数的变量

####全局变量和局部变量
“”"
1.概念
局部变量:在函数内部定义的变量就是局部变量
全局变量:在函数外部定义的变量 或者在函数内部使用global关键字声明是全局变量

2.作用域:
局部变量的作用范围仅仅在函数的内部,在函数外部无法调用,强制调用报错
全局变量的作用范围横跨整个文件

#作用域:作用范围
#命名空间 : 划分一块区域保存所有数据,以字典的方式存储(变量与值形成映射关系).一共三种.
(1)内建命名空间:解释器启动时创建,直到解释器运行结束,生存周期最长
(2)全局命名空间:文件运行时创建,直到解释器运行结束,生存周期较长
(3)局部命名空间:函数调用时,里面的局部变量才创建,调用结束后即释放,生存周期较短
#命名空间的提出是为了划分和控制变量是否可见,以及生存周期的长短.

#命名空间 创建顺序:(了解)
python解释器启动->创建内建命名空间->创建全局命名空间->创建局部命名空间
#命名空间 销毁顺序:(了解)
函数调用结束后->销毁函数对应的局部命名空间数据->销毁全局命名空间数据->销毁内建命名空间数据

内置的函数,关键字,属性等放到内置命名空间
在这里插入图片描述

全局变量 与 局部变量 及 其关键字的使用
#局部变量:函数内部的变量是局部变量,作用域仅在函数内部可见(局部命名空间)
#全局变量:函数外部的变量是全局变量,作用域横跨整个文件(全局命名空间)
#内置函数:内建命名空间

– globals() :返回字典,存放着全局作用域所有内容
– locals() :返回字典,当前作用域所有内容(locals调用之前的变量)
– global :关键字:声明全局变量获修改全局变量
– nonlocal :关键字:修改局部变量(当前函数上一层的局部变量)

LEGB原则(即就近原则找变量)
#找寻变量的调用顺序采用LEGB原则(即就近原则)
B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)
G —— Global(module); 函数外部所在的命名空间 (全局作用域)
E —— Enclosing function locals;外部嵌套函数的作用域 (嵌套作用域)
L —— Local(function);当前函数内的作用域 (局部作用域)

依据就近原则,从下往上 从里向外 依次寻找

3.生命周期:该变量的作用时长
内置命名空间 -> 全局命名空间 -> 局部命名空间 (开辟空间顺序)
内置属性 > 全局属性 > 局部属性 (作用时长:长->短)
“”"

1 局部变量

def func():
    # 定义一个局部变量
    a = 1
    # 获取当前的局部变量
    print(a)
    # 修改一个局部变量
    a = 2
    print(a)
    
func()
# print(a) error

局部变量在函数外部调用报错
在这里插入图片描述

2.全局变量

# 定义一个全局变量
b = 10
# 获取当前的全局变量
print(b)
# 修改一个全局变量
b = 20
print(b)

def func():
    print(b)
func()

全局变量,函数内部外部都能调用
在这里插入图片描述

3.函数内部定义全局变量

在函数内部要想定义全局变量,使用global关键字

def func():
    global c
    c =30
func()
print(c)

在这里插入图片描述

4.函数内部修改全局变量

需要先用global关键字修饰

d = 50
def func():
    global d
    d = 51
func()
print(d)

在这里插入图片描述

总结:global的使用
如果当前不存在全局变量,可以在函数内部通过global关键字来定义全局变量
如果当前存在全局变量,可以在函数内部通过global关键字来修改全局变量

函数名的使用

python中的函数可以像变量一样,动态创建,销毁,当参数传递,作为值返回,叫第一类对象.其他语言功能有限

def func():
    print( "我是func函数")

(1)动态创建

a = 1
print(a)
a = func
a()

如下,通过函数名赋值的方式,相当于创建了与func功能一样的a函数
在这里插入图片描述

(2)动态销毁

del a
#a()
#func()

在这里插入图片描述

(3)当参数传递

def func2():
    return "我是func2函数"

def func1(f):
    return f() # "我是func2函数"

res = func1(func2)
print(res)

在这里插入图片描述

(4)作为值返回

def func3():
    print( "我是func3函数" )
    
def func4(f):
    return f
res = func4(func3)    
print(res)
res()

print("<===>")

返回的是个函数名,函数对象,再调用,打印出func1()函数的输出
在这里插入图片描述

(5)函数名可以作为容器类型数据的元素

lst = [func,func3]
for i in lst:
    i()

print("<=========>")

变量可以怎么用,函数就可以怎么用
在这里插入图片描述

__doc__ 或者help查看文档。可以给自定义的函数写说明文档,告诉别人怎么更方便的使用,__doc__可以帮我们获取到函数内部自定义的文档
一般是三个引号包裹着的注释,__doc__只能查看到三个引号注释的部分

在这里插入图片描述

help查看的更全面,包含函数名和以及定义的参数

在这里插入图片描述

def big_chang_cishen(something):
    """
    功能: 教你怎么吃大肠
    参数: 吃的内容
    返回值: 是否满意
    """
    print("把{}洗一洗".format(something))
    print("直接找肠子头,放嘴里,吸一下")
    print("擦擦嘴,满意的放下肠子头")
    return "吃完了,真好吃~"
    
big_chang_cishen("生肠子")
# 方法一
res = big_chang_cishen.__doc__
print(res)
# 方法二
help(big_chang_cishen)

在这里插入图片描述

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

函数的嵌套

互相嵌套的两个函数:
包裹在外层的叫做外函数,内层的就是内函数

def outer():
    # inner()
    def inner():
        print("我是inner函数")

在外层调用外层函数,如果外层函数没有打印,内层函数有打印,不执行内层函数的打印
在这里插入图片描述

在内部调用内部函数,才能打印
在这里插入图片描述

#(1)内部函数可以直接在函数外部调用么 不行
#inner()
#(2)调用外部函数后,内部函数可以在函数外部调用吗 不行
#outer()
#inner()
#(3)内部函数可以在函数内部调用吗 可以
outer()
#(4)内部函数在函数内部调用时,是否有先后顺序 有的
#先定义在调用
#在其他语言中有预加载的机制,提前把函数驻留到内存中,然后再去编译脚本内容
#python没有预加载函数的机制,只能先定义在调用;

#外函数是outer 中间函数是inner 最里层是smaller ,调用smaller函数

def outer():
    def inner():
        def smaller():
            print("我是smaller函数")
        smaller()
    inner()
outer()

#多层函数调用,只能层层都调用,才能显示出最内层函数内容,不能断层
在这里插入图片描述

以下调用才是正常的

在这里插入图片描述

LEGB 原则

def outer():    
    
    def inner():
        
        def smaller():    
            
            print(a)
        smaller()
    inner()
outer()

LEGB原则(就近找变量原则)
#找寻变量的调用顺序采用LEGB原则(即就近原则)
B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)
G —— Global(module); 函数外部所在的命名空间 (全局作用域)
E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
L —— Local(function);当前函数内的作用域 (局部作用域)
依据就近原则,从下往上 从里向外 依次寻找
在这里插入图片描述

即便id未定义,但它是内置函数,在最内层也能调用
在这里插入图片描述

nonlocal的使用 (用来修改局部变量)

nonlocal遵循LEGB原则 nonlocal 只能修改局部变量
(1) 它会找当前空间上一层的变量进行修改
(2) 如果上一层空间没有,继续向上寻找
(3) 如果最后找不到,直接报错

(1)它会找当前空间上一层的变量进行修改

def outer():
    a = 10
    def inner():
        nonlocal a
        a = 20
        print(a)
    inner()
    print(a)
outer()

在这里插入图片描述

(2)如果上一层空间没有,继续向上寻找

def outer():
    a = 20
    def inner():
        a = 15
        def smaller():
            nonlocal a
            a = 30
            print(a)
        smaller()
        print(a)
    inner()
    print(a)
outer()

#如果有多层定义同一变量,nonloacl找到最近一层的变量,即不再向上寻找,只修改最近一层的变量
在这里插入图片描述

(3)如果最后找不到,直接报错

nonlocal 只能修改局部变量,不能修改全局变量

a = 20
def outer():    
    def inner():
        def smaller():
            nonlocal a
            a = 30
            print(a)
        smaller()
        print(a)
    inner()
    print(a)
outer()

error

如果在L,E层未找到该变量的定义,会直接报错
在这里插入图片描述

(4) 不通过nonlocal 是否可以修改局部变量呢?

def outer():
    lst = [1,2,3]
    def inner():
        lst[-1] = 3000
    inner()
    print(lst)
outer()

#使用nonlocal,如果多层都有这个变量的定义,只可以修改最近层变量的值
在这里插入图片描述

针对可变类型数据也一样,只修改最近层变量的值
在这里插入图片描述

不使用nonlocal,当变量是不可变类型,只能修改本层内的变量
在这里插入图片描述

不使用nonlocal,当变量是可变类型,可以直接修改各层数据
在这里插入图片描述
在这里插入图片描述

在使用nonlocal的层,不能再定义该变量

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/littlefun591/article/details/135449282

智能推荐

如何配置filezilla服务端和客户端_filezilla server for windows (32bit x86)-程序员宅基地

文章浏览阅读7.8k次,点赞3次,收藏9次。如何配置filezilla服务端和客户端百度‘filezilla server’下载最新版。注意点:下载的版本如果是32位的适用xp和win2003,百度首页的是适用于win7或更高的win系统。32和64内容无异。安装过程也是一样的。一、这里的filezilla包括服务端和客户端。我们先来用filezilla server 架设ftp服务端。看步骤。1选择标准版的就可以了。 _filezilla server for windows (32bit x86)

深度学习图像处理01:图像的本质-程序员宅基地

文章浏览阅读724次,点赞18次,收藏8次。深度学习作为一种强大的机器学习技术,已经成为图像处理领域的核心技术之一。通过模拟人脑处理信息的方式,深度学习能够从图像数据中学习到复杂的模式和特征,从而实现从简单的图像分类到复杂的场景理解等多种功能。要充分发挥深度学习在图像处理中的潜力,我们首先需要理解图像的本质。本文旨在深入探讨深度学习图像处理的基础概念,为初学者铺平通往高级理解的道路。我们将从最基础的问题开始:图像是什么?我们如何通过计算机来理解和处理图像?

数据探索阶段——对样本数据集的结构和规律进行分析_数据分析 规律集-程序员宅基地

文章浏览阅读62次。在收集到初步的样本数据之后,接下来该考虑的问题有:(1)样本数据集的数量和质量是否满足模型构建的要求。(2)是否出现从未设想过的数据状态。(3)是否有明显的规律和趋势。(4)各因素之间有什么样的关联性。解决方案:检验数据集的数据质量、绘制图表、计算某些特征量等,对样本数据集的结构和规律进行分析。从数据质量分析和数据特征分析两个角度出发。_数据分析 规律集

上传计算机桌面文件图标不见,关于桌面上图标都不见了这类问题的解决方法-程序员宅基地

文章浏览阅读8.9k次。关于桌面上图标都不见了这类问题的解决方法1、在桌面空白处右击鼠标-->排列图标-->勾选显示桌面图标。2、如果问题还没解决,那么打开任务管理器(同时按“Ctrl+Alt+Del”即可打开),点击“文件”→“新建任务”,在打开的“创建新任务”对话框中输入“explorer”,单击“确定”按钮后,稍等一下就可以见到桌面图标了。3、问题还没解决,按Windows键+R(或者点开始-->..._上传文件时候怎么找不到桌面图标

LINUX 虚拟网卡tun例子——修改_怎么设置tun的接收缓冲-程序员宅基地

文章浏览阅读1.5k次。参考:http://blog.csdn.net/zahuopuboss/article/details/9259283 #include #include #include #include #include #include #include #include #include #include #include #include _怎么设置tun的接收缓冲

UITextView 评论输入框 高度自适应-程序员宅基地

文章浏览阅读741次。创建一个inputView继承于UIView- (instancetype)initWithFrame:(CGRect)frame{ self = [superinitWithFrame:frame]; if (self) { self.backgroundColor = [UIColorcolorWithRed:0.13gre

随便推点

字符串基础面试题_java字符串相关面试题-程序员宅基地

文章浏览阅读594次。字符串面试题(2022)_java字符串相关面试题

VSCODE 实现远程GUI,显示plt.plot, 设置x11端口转发_vscode远程ssh连接服务器 python 显示plt-程序员宅基地

文章浏览阅读1.4w次,点赞12次,收藏21次。VSCODE 实现远程GUI,显示plt.plot, 设置x11端口转发问题服务器 linux ubuntu16.04本地 windows 10很多小伙伴发现VSCode不能显示figure,只有用自带的jupyter才能勉强个截图、或者转战远程桌面,这对数据分析极为不方便。在命令行键入xeyes(一个显示图像的命令)会failed,而桌面下会出现:但是Xshell能实现X11转发图像,有交互功能,但只能用Xshell输入命令plot,实在不方便。其实VScode有X11转发插件!!方法_vscode远程ssh连接服务器 python 显示plt

element-ui switch开关打开和关闭时的文字设置样式-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏2次。element switch开关文字显示element中switch开关把on-text 和 off-text 属性改为 active-text 和 inactive-text 属性.怎么把文字描述显示在开关上?下面就是实现方法: 1 <el-table-column label="状态"> 2 <template slot-scope="scope">..._el-switch 不同状态显示不同字

HttpRequestUtil方法get、post、JsonToPost_httprequestutil.httpget-程序员宅基地

文章浏览阅读785次。java后台发起请求使用的工具类package com.cennavi.utils;import org.apache.http.Header;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apach_httprequestutil.httpget

App-V轻量级应用程序虚拟化之三客户端测试-程序员宅基地

文章浏览阅读137次。在前两节我们部署了App-V Server并且序列化了相应的软件,现在可谓是万事俱备,只欠东风。在这篇博客里面主要介绍一下如何部署客户端并实现应用程序的虚拟化。在这里先简要的说一下应用虚拟化的工作原理吧!App-V Streaming 就是利用templateServer序列化出一个软件运行的虚拟环境,然后上传到app-v Server上,最后客户..._app-v 客户端

推荐文章

热门文章

相关标签