python基础六:函数的几种类型与局部变量和全局变量、申明修改全局变量global与修改嵌套函数变量的nonlocal

阅读时注意看代码注释

python定义一个函数格式:函数有无参数无返回值类型、无参数有返回值类型(返回特定数据时使用)、有参数无返

回值类型、有参数有返回值类型(所有返回值要用关键字return返回)。

def    函数变量名(形式参数):

            执行语句(如果有返回值用return)

实例:

# 有参数返回型
def dance(num):
    for i in range(num):
        return '跳舞{}次。'.format(i)

# 无参返回型
def dance1():
    num = 3
    for i in range(num):
        return '跳舞{}次。'.format(i)

# 无参无返回型
def dance2():
    num = 3
    for i in range(num):
        print('跳舞{}次。'.format(i))

# 有参无返回型
def dance3(num):
    for i in range(num):
        print('跳舞{}次。'.format(i))

# if __name__ == '__main__':为主线程执行入口(可以没有,没有就是无缩进的代码是执行入口,然后一行一行执行)
if __name__ == '__main__':
    a = dance(3)
    print(a)
    print('*'*20)
    b = dance1()
    print(b)
    print('*' * 20)
    dance2()
    print('*' * 20)
    dance3(3)


结果:

跳舞0次。
********************
跳舞0次。
********************
跳舞0次。
跳舞1次。
跳舞2次。
********************
跳舞0次。
跳舞1次。
跳舞2次。

注意:可以看到第一和第二个有返回类型的时候,return 在第一次循环返回结果后,会跳出循环,所一达不到循环的结果,写代码时要注意。

Python中引用一个变量的时候,是按照找本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来寻找变量的,即所谓的LEGB规则。 

但是当在一个函数内部给一个局部变量(本地作用域的变量名)赋值的时候,并不是按照上面所说LEGB规则来首先找到变量,之后

为该变量赋值。而是遵循这样一条规则:在函数中给一个变量名赋值(不是在一个表达式中对其进行引用),Python中是创建或改变

本地作用域的变量名,而对其他作用域没有影响(如果它已经在那个函数中被声明为全局变量,则所有的作用域都可用)。

几个实例来说明:

简单例子:

赋值:可以看到第一个输出的的是dance函数的print结果是函数中变量num的值2,而全局下,print输出的结果是全局变量num的值(并没有受到dance函数局部变量的影响)。

num = 1
def dance():
    num = 2
    print(num)
if __name__ == '__main__':
    dance()
    print(num)


结果:
2
1

 引用:将上面代码的num=2注释掉,结果中dance函数中的print输出的num在本地作用域没有找到,到全局作用域找到num的值为1并输出,全局中的print输出全局变量num的值1.

# 将num = 2注释掉
num = 1
def dance():
    # num = 2
    print(num)
if __name__ == '__main__':
    dance()
    print(num)

结果:
1
1

结论:赋值只改变和创建本地作用域的变量值,不改变其他作用域,而引用可以一层一层的寻找。

有函数嵌套也一样,给个代码自己体会:

num = 1
def dance():
    num = 2
    # 嵌套函数
    def sing():
        num = 3
        print(num)
    sing()
    print(num)

if __name__ == '__main__':
    dance()
    print(num)

关键字:global

用法:在函数中申明要修改全局变量。

实例:dance函数内的num申明修改了全局变量,所以全局变量的num变成了2,全局print输出2

num = 1
def dance():
    # 申明修改全局变量num
    global num
    num = 2
    print(num)
if __name__ == '__main__':
    dance()
    print(num)

结果
2
2

关键字:nonlocal (Python3.0中新增的关键字,python2.x不支持)

用法:使用nonlocal关键字可以在一个嵌套的函数中修改嵌套作用域中的变量

实例:

def dance():
    # 外部函数要修改的变量num必须存在
    num = 2
    # 嵌套函数
    def sing():
        # 申明修改外部函数变量num(外部函数要修改的变量num必须存在)
        nonlocal num
        num = 3
        print(num)
    # 在外部函数调用内部函数
    sing()
    print(num)

if __name__ == '__main__':
    dance()

结果:
3
3

注意:使用global关键字修饰的变量之前可以并不存在,而使用nonlocal关键字修饰的变量在嵌套作用域中必须已经存在。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙子园

期待你的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值