Python从入门到上瘾12——函数(函数返回值、匿名函数、变量作用域)

版权申明:原创文章,未经博主同意,不得转载!

Python从入门到上瘾12——函数(下)

小白高效学习Python系列,50小时学会Python “ 阅读本文需要大约5分钟。”

上一节函数(上)学习了Python函数的定义、调用以及函数参数。本节主要涉及以下几个方面:

  • 函数返回值
  • 匿名函数
  • 变量作用域

函数返回值

从上一节学习我们知道,函数以 return [表达式] 结束函数,并返回函数值。若没有return相当于返回 None。那return可以返回哪些类型的值呢?实际上,包括整型、字符串、列表、字典以及实例对象都可作为返回值。下面给出两个例子:

  • 返回整型
def sum( arg1, arg2 ):
   # 返回2个参数的和."
   total = arg1 + arg2
   print ("函数内 : ", total)
   return total
 
# 调用sum函数
total = sum( 10, 20 )
print ("函数外 : ", total)

#输出结果为:
#函数内 :  30
#函数外 :  30
  • 返回字典
def info(name, age, country):
    # 返回2个参数的和."
    person ={'name':name, 'age': age, 'country': country}
    return person


# 调用info函数
person = info('Lily', 20, 'China')
print("类型 : ", type(person))
print("返回值 : ", person)

#输出结果为:
#类型 :  <class 'dict'>
#返回值 :  {'name': 'Lily', 'age': 20, 'country': 'China'}

匿名函数

所谓匿名,即不使用 def 语句这样标准的形式定义一个函数。python 使用 lambda关键字 来创建匿名函数。
语法如下:

lambda [arg1 [,arg2,.....argn]]:expression

将前面的求和函数转换为匿名函数,如下所示:


sum = lambda arg1, arg2: arg1 + arg2
 
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))

#输出结果为:
#函数内 :  30

变量作用域

简单来说,变量的作用域就是指,在程序的什么范围内,该变量仍然有效,即仍然可以访问它。Python的作用域一共有3种,分别是:

  • L (Local) 局部作用域
  • G (Global) 全局作用域
  • B (Built-in)内置作用域(内置函数所在模块的范围)

初一看,很晕菜,这些都是什么玩意。看下面一个实例,立刻明白:

a = 0  # 全局作用域
def inner():
    b = 3; # 局部作用域
    a = 2  # 局部作用域
    print('函数内:',a)

# print(b); 会报错,函数外无法 访问函数内定义的变量
print('函数外:',a)
inner()
print('函数外:',a)

#输出结果为:
#函数外: 0
#函数内: 2
#函数外: 0

以上代码形象说明了,局部作用域 、 全局作用域的含义。
局部作用域即是指只能在申明它的函数中访问。在inner()函数中定义的局部变量b,函数外无法使用。
**注意,**函数内外都定义名字为‘a’的变量,但从代码结果可以看到,他们互不影响。

内置作用域是通过一个名为 builtin 的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。在Python3.0中,可以使用以下的代码来查看到底预定义了哪些变量:

import builtins
dir(builtins)
  • global 和 nonlocal关键字

如果想在内部作用域修改外部作用域的变量时,该怎么办呢?Python中可以通过global和nonlocal关键字实现。

以下实例修改全局变量 num:

num = 0
#定义函数
def fun1():
    global num  # 使用 global 关键字声明
    print('函数内:',num)
    num = 999
    print('函数内:',num)

#调用函数
fun1()
print('函数外:',num)

#输出结果:
#函数内: 0
#函数内: 999
#函数外: 999

可以看到,上面代码,通过在函数内对变量进行globle申明就可对全局变量进行修改。

如果要修改嵌套作用域(外层非全局作用域)中的变量则需要 nonlocal 关键字,如下实例:

# 定义函数
def outer():
    num = 10
    print('外层函数:',num)
    def inner():
        nonlocal num  # nonlocal关键字声明
        num = 100
        print('内层函数:',num)

    inner()
    print('外层函数:',num)

# 调用函数
outer()

#输出结果:
#外层函数: 10
#内层函数: 100
#外层函数: 100

可以看到,上面代码,通过在内层嵌套函数内对变量进行nonlocal申明后,就可对外层函数中的变量(非全局作用域)进行修改。

  • 关注本人,一起学习进步!==

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值