Jammly
发布于 2023-03-30 / 490 阅读
93

Python 函数

函数的创建和调用

  • 什么是函数
    函数就是执行特定任务和以完成特定功能的一段代码

  • 为什么需要函数
    服用代码
    隐藏实现细节
    提高可维护性
    提高可读性便于调试

  • 函数的创建

def 函数名 ([输入参数]):
	函数体
	[return xxx]

---- def func(key1, key2, key3…):
---- def func(key1, key2=value2…):

  • 函数的调用
    函数名([实际参数])

---- func(arg1, arg2, arg3…) #会按照前后顺序对应到函数参数
----func(key1=arg1, key2=arg2…) #指定了key,可不按顺序对应

----如果混用,所有位置参数必在前,关键字参数必在后

  • 函数的参数传递
    位置实参:根据形参对应的位置进行实参传递
    关键字实参:根据形参名称进行实参传递
    如果是不可变对象,在函数体内的修改不会影响实参的值,
    如果是可变对象,在函数体内的修改会影响实参的值

  • 函数的返回值
    函数返回多个值时,结果为元组

  • 函数的参数定义
    个数可变的位置参数
    #定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
    #使用 *args 定义个数可变的位置形参
    #结果为一个元组
    个数可变的关键字形参
    #定义函数时,无法实现确定传递的关键字实参的个数时,使用可变的关键字形参
    #使用 **args 定义个数可变的关键字形参
    #结果为一个字典

---- def func(*args): #不带key的多个无名参数
---- def func(**kwargs): #key=val形式的多个命名参数

  • 调用函数的参数:解包
    对于有多个参数的函数,可以单个序列或字典“解包”对应到每个参数
    ---- func(*aseq) #序列解包对应到每个位置参数
    ---- func(**adict) #字典解包对应到每个关键字参数

  • 变量的作用域
    程序代码能访问该变量的区域
    根据变量的有效范围可分为:
    –局部变量:在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就会成为全局变量
    –全局变量:函数体外定义的变量,可作用于函数内外

函数作为参数:map函数

  • 有时候,需要对列表中每个元素做一个相同的处理,得到新列表
    –例如所有数据乘以3
    –例如所有字符串转换为整数
    –例如两个列表对应值相加

    num = [10, 20, 40, 80, 160]
    lst = [2, 4, 6, 8, 10]
    def mul3(a):
    return a * 3
    print(list( map(mul3, num) ))

  • map(func, list1, list2 …) #函数func有几个参数,后面就跟几个列表

    def atob(a, b):
    return a + 1.0/b
    print(list( map(atob, num, lst) ))

函数表达式:lambda运算符

  • 有时候函数只用一次,其名称也就不重要,可以无须费神去def一个

  • Lambda表达式可以返回一个匿名函数

    lambda <参数表>:<表达式>
    –lambda x: x * 3
    –lambda x, y: x + 1.0/y

函数作为参数:reduce函数

  • reduce函数对列表进行滚动式处理,最终得到一个值
  • 例如,累加,累乘等等
  • reduce(func, list)
    – 相当于:func(func(func(l0, l1), l2), l3)…
  • reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
    – 相当于:((((1+2)+3)+4)+5)
    >>>> from functools import reduce
    >>>> reduce(lambda x, y: max(x, y), [2, 3, 7, 1, 4, 5])
    >>>> 7

函数作为参数:filter函数

  • filter函数对数据集中的对象逐个调用func
    – 如果结果为真,则保留这个对象
    – 否则抛弃这个对象
    >>>> list(filter(lambda x: x % 2 == 0, range(100)))
    >>>> list(filter(lambda x: len(x)>3, [“hello”, “am”, “bye”, “good”]))
    >>>> [‘hello’, ‘good’]

函数值缓存:lru_cache装饰器

  • 来着functools模块的lru_cache装饰器

  • 对产生大量重复计算的递归函数自动提供函数值缓存

    from functools import lru_cache

    @lru_cache(maxsize=128)
    def fibonacci(n):
    if n == 1:
    return 0
    elif n == 2:
    return 1
    else:
    return fibonacci(n-1) + fibonacci(n-2)

    print(fibonacci(100))