Python学习之旅(十一)

时间:2022-03-25 13:38:57

Python基础知识(10):函数(Ⅱ)

一、全局变量和局部变量

局部变量:在函数内定义的变量,在函数内使用

全局变量:在函数外定义的变量,在程序任何地方都可以使用

1、全局变量与局部变量同名

这时函数内部只调用局部变量,如果要调用全局变量需要在函数内加一句“global 同名变量”

x=1
#x:全局变量
def test():
    global x
    x=5
    #x:局部变量
    print(x)
    return x

test()

结果:1

2、一个函数中的内层函数调用外层函数中的变量

内层函数调用外层函数中的变量要在内层函数中加一句“nonlocal 变量”

def demo1():
    num=2
    def demo2():
        nonlocal num
        num+=1
        
    return demo2()
demo1()

demo1()

结果:3

3、全局变量一般不可修改,如果函数中想要修改全局变量要加上“global 变量”语句

如果B函数要调用A函数中的c变量,需要在A函数内部加一句“global c”

x=1
def test1():
    global x
    global y
    y=2
    x=x+y
    print(x)
    return x
def test2():
    print(y)
    print(x)
    
test1()
test2()

结果:

3
2

二、函数递归

1、一个函数自己调用自己

2、有明确的结束条件:加if判断

3、无穷递归:运行后它会永远运行下去,进而导致程序崩溃

4、理论上所有递归函数都可以写成循环的方式

计算阶乘

#用循环语句
def fact1(num):
    result=num
    for i in range(1,num):
        result *=i
    return result

print(fact1(3))

#用递归函数
def fact2(n):
    if n==1:
        return 1
    else:
        return n*fact2(n-1)

print(fact2(3))

结果:6

5、使用递归函数时要防止栈溢出,解决栈溢出的方法是通过尾递归优化

6、匿名函数

用lambda定义,只能有一个表达式,没有函数名

lambda x:x+1等价于def test(x):x+=1 retrun x

(1)可以把匿名函数赋值给一个变量,用该变量调用匿名函数

y=lambda x:x+2
y(1)
结果:3

(2)可以把匿名函数作为返回值返回