python 函数

lambda表达式和匿名函数

  • 一个表达式实现的函数
  • 匿名函数
f = lambda x, y: x + y
print(f('ds', 'fe'))

在这里插入图片描述
也可以同时定义多个,就像同时赋值

  • 匿名函数本身也可以作为函数的返回值来使用
def fun():
    return lambda x, y: x + y


f = fun()
print(f('fd', 'da'))

在这里插入图片描述
不可以直接使用

def fun():
    return lambda x, y: x + y


print(fun('fd', 'da'))

在这里插入图片描述

def fun(x, y):
    return lambda x, y: x + y


print(fun('fd', 'da'))

在这里插入图片描述
返回的是一个函数
而且要返回一个看函数时,fun()里不能有形参

函数参数传递的共享引用

def fun(lst1, lst2, dict1, dict2):
    lst1[0] = 10
    lst2 = [1, 2]
    dict1['a'] = 100
    dict2 = {'a': 3, 'b': 4}
    print("Inside:lst1={},lst2={},dict1={},dict2={}".format(lst1, lst2, dict1, dict2))


lst1 = [5, 6]
lst2 = [7, 8]
dict1 = {'a': 9, 'b': 10}
dict2 = {'a': 11, 'b': 12}
print("Before:lst1={},lst2={},dict1={},dict2={}".format(lst1, lst2, dict1, dict2))
fun(lst1, lst2, dict1, dict2)
print("After:lst1={},lst2={},dict1={},dict2={}".format(lst1, lst2, dict1, dict2))

在这里插入图片描述
改变可变数据类型的部分成员时,指向的时同一个地址,是在原地改变,会影响实参
但是全部改变时,形参和实参不是指向同一个地址,不会改变实参

  • 由此可以用列表来实现两个数的交换

参数类型

函数的返回值

  • 没有return 和return不带任何值时,相当于return None
  • 执行一次return 就跳出函数体

变量的作用域

  1. 局部变量
    变量名浅没有如何关键字,作用域为改函数的函数体
    形参在未调用函数时不存在,调用后才有了内存空间,并且在函数执行完时,释放内存空间
  2. 全局变量
    赋值语句在函数外部就是全局变量,作用域为定义变量后至程序结束的所有代码范围
    一个函数体中要对全局变量重新赋值,要使用global关键字声明,否则就代表局部变量

递归函数

def fac(n):
    if n == 0 or n == 1:
        return 1
    else:
        return fac(n - 1) * n


for i in range(11):
    print(f"{i}!={fac(i)}")

在这里插入图片描述

  • 基本结构
  1. 自我相似
  2. 有结束条件
def gcd(a, b):
    return b if a % b == 0 else gcd(b, a % b)


print(gcd(45, 24))

在这里插入图片描述

内嵌函数

内嵌函数的作用域和变量的作用域的规则是一样的,定义在一个A函数里的B函数不能在A函数外调用

def f1():
    global x
    x = 10
    y = 20

    def f2():
        nonlocal y
        global x
        x = x + 1
        y = 40
        print("In f2:x=", x, "y=", y)

    f2()
    print("In f1:x=", x, "y=", y)


x = 100
y = 200
print("Before:x=", x, "y=", y)
f1()
print("After:x=", x, "y=", y)

在这里插入图片描述
nonlocal关键字说明y是上层变量(局部变量),又称为‘闭包’,也就是未在本地作用域中定义的变量(此处y就是f1()中的局部变量y)

def f1():
    global x
    x = 10
    y = 20

    def f2():
        nonlocal y
        nonlocal x
        x = x + 1
        y = 40
        print("In f2:x=", x, "y=", y)

    f2()
    print("In f1:x=", x, "y=", y)


x = 100
y = 200
print("Before:x=", x, "y=", y)
f1()
print("After:x=", x, "y=", y)

将f2中的global x改成nonlocal x就会出错
原因是f1中并没有局部变量x
在这里插入图片描述

def f1():
    global x
    x = 10
    y = 20

    def f2():
        nonlocal y
        x = x + 1
        y = 40
        print("In f2:x=", x, "y=", y)

    f2()
    print("In f1:x=", x, "y=", y)


x = 100
y = 200
print("Before:x=", x, "y=", y)
f1()
print("After:x=", x, "y=", y)

同样,删去也会出错,因为改变全局变量必须要使用global关键字,否则就是局部变量,但是f1中并未对x赋初始值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值