Python学习 - 函数(2)

Python学习 - 语法入门:https://blog.csdn.net/wanzijy/article/details/125287855
Python学习 - 数据类型:https://blog.csdn.net/wanzijy/article/details/125341568
Python学习 - 流程控制:https://blog.csdn.net/wanzijy/article/details/125400906
Python学习 - 运算符(操作符):https://blog.csdn.net/wanzijy/article/details/125387919
Python学习 - 列表:https://blog.csdn.net/wanzijy/article/details/125457990
Python学习 - 字典:https://blog.csdn.net/wanzijy/article/details/125567225
Python学习 -元组和集合:https://blog.csdn.net/wanzijy/article/details/125577609
Python学习 - 函数(1):https://blog.csdn.net/wanzijy/article/details/125669084
Python学习 - 函数(2):https://blog.csdn.net/wanzijy/article/details/125739981
Python学习 - 类与对象:https://blog.csdn.net/wanzijy/article/details/125826952
Python学习 - 面向对象之封装:https://blog.csdn.net/wanzijy/article/details/125902925
Python学习 - 面向对象之继承:https://blog.csdn.net/wanzijy/article/details/125963829
Python学习 - 面向对象之多态:https://blog.csdn.net/wanzijy/article/details/127140632
Python - 文件操作(1):https://blog.csdn.net/wanzijy/article/details/127099071
Python - 文件操作(2):https://blog.csdn.net/wanzijy/article/details/127150189
Python学习 - 垃圾回收、特殊方法和模块:https://blog.csdn.net/wanzijy/article/details/126202999
Python学习 - 异常处理:https://blog.csdn.net/wanzijy/article/details/126803672

7. 递归

递归式的函数,其实就是函数在自己调用自己
无穷递归:如果这个函数被调用,程序的内存会溢出,效果类似于死循环
递归是解决问题的一种方式

递归式函数的两个要件:

  • 基线条件:问题可以被分解为的最小问题,当满足基线条件时,递归就不在执行了
  • 递归条件:将问题继续分解的条件
def factprial1(n) :
    '''
    递归函数,用来求任意数的阶乘
    :param n:
    :return:
    '''
    if(n == 1) :
        return 1
    return n * factprial1(n - 1)

8. 高阶函数

函数是一等对象,一等对象一般都有如下特点:

  • 对象在运行时创建
  • 能赋值给变量或作为数据结构的元素
  • 作为参数传递
  • 作为返回值返回

高阶函数,要至少符合以下两个特点中的一个:

  • 接收一个或多个函数作为参数
  • 将函数作为返回值返回
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def fn2(i):
    if (i % 2 == 0):
        return True
    return False


def fn3(i):
    if (i > 5):
        return True
    return False

def fn4(i):
    if (i % 4 == 0):
        return True
    return False

def fn(lst, func) :
    '''
    根据传进去的函数参数,决定这个函数是什么功能
    :param lst: 指定的参数列表
    :param func: 定义的规则,函数
    :return:
    '''
    new_list = []
    for n in lst :
        if(func(n)) :
            new_list.append(n)
    return new_list

9. 匿名函数

filter()

  • 从序列中过滤出符合条件的元素,保存到一个新的序列中
  • 参数:
    1. 函数,根据该函数来过滤序列
    2. 需要过滤的序列
  • 返回值:过滤后的新序列

lambda 函数表达式(语法糖):

  • 用来创建一些简单的函数,是创建函数的又一种方式
  • 语法:   lambda 参数列表 : 返回值
  • 也可以将匿名函数赋值给一个变量
def fn5(a, b) :
    return a+b

lambda a, b : a + b  #  声明
print((lambda a, b: a + b)(10, 20))  #  调用

当有 lambda 表达式后,第八节的高阶函数就可以改造成

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def fn4(i):
    return i % 4 == 0
print(list(filter(fn4, l)))
print(list(filter(lambda i : i % 4 == 0, l)))

10. sort 、sorted 和 map

sort()

  • 用来对列表中的元素进行排序,会直接改变原本列表
  • 默认是直接比较列表中的元素的大小
l = ['bb', 'aaaa', 'c', 'dddddddd', 'fff']
l.sort();
print(l)  #  ['aaaa', 'bb', 'c', 'dddddddd', 'fff']

在 sort() 可以接收一个关键字参数
key 需要一个函数作为参数,当设置了函数作为参数,每次都会以列表中的一个元素作为参数来调用函数,并且使用函数的返回值来比较元素的大小

l = ['bb', 'aaaa', 'c', 'dddddddd', 'fff']

l.sort(key=len)  #  此时会根据每个字符串的长度来进行排序
print(l)  #  ['c', 'bb', 'fff', 'aaaa', 'dddddddd']

l = [2, 5, '1', 3, '6', '4']
l.sort(key=str)  #  将元素转换为字符串再比较,也可以转为整型再比较,不会改变原来的元素类型,但是顺序会被改变
print(l)  #  ['1', 2, 3, '4', 5, '6']

sorted()

  • 用法基本和 sort() 函数一致,但是 sorted() 可以对任意的序列进行排序
  • 并且使用sorted()排序不会影响原来的对象,而是返回一个新对象
l = [2, 5, '1', 3, '6', '4']
print(sorted(l, key=int))  #  ['1', 2, 3, '4', 5, '6']
print(l)  #  [2, 5, '1', 3, '6', '4']

l = '27287328248193874834'
print(sorted(l, key=int))  #  ['1', '2', '2', '2', '2', '3', '3', '3', '4', '4', '4', '7', '7', '7', '8', '8', '8', '8', '8', '9']

map() :可以对可迭代对象中的所有元素做指定的操作(比如全部元素都加1),然后将其添加到一个新的对象中返回

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
r = map(lambda i : i + 1, l)
print(list(r))

11. 闭包

将函数作为返回值返回的高阶函数,叫做闭包
通过闭包,可以创建一些只有当前函数能访问的变量,将一些私有的数据藏到闭包中

形成闭包的条件:

  • 函数嵌套
  • 将内部函数作为返回值返回
  • 内部函数必须要使用到外部函数的变量

使用闭包可以保护一些内部的变量,防止外面去篡改,比如下面的 nums 列表

def make_averager() :
    nums = []
    def averager(n) :
        nums.append(n)
        return sum(nums) / len(nums)
    return averager
averager = make_averager()
print(averager(10))  #  10.0
print(averager(20))  #  15.0
print(averager(30))  #  20.0

12. 装饰器

不修改原函数内部的情况下,来对函数进行扩展

装饰器的好处:

  • 可以修改多个函数
  • 方便后期的维护
  • 不违反开闭原则(OCP)
def fn() :
print('我是fn函数')

def add(a, b) :
    return a + b

def mul(a, b) :
    return a * b

def begin_end(old) :
    '''
    用于对其他函数进行扩展,使其他函数可以在执行前打印开始执行,执行后打印执行结束
    :param old: 要进行扩展的函数
    :return:
    '''

    def new_function(*args, **kwargs) :
        print('开始执行......')
        result = old(*args, **kwargs)
        print('执行结束......')
        return result
    return new_function

f = begin_end(fn)
f()

f2 = begin_end(add)
print(f2(12, 34))

fn3 = begin_end(mul)
print(fn3(12, 34))

调用时,会在函数的调用前和后打印 “开始执行” 和 “结束执行”

在定义函数时,可以通过“@”装饰器,来使用指定的装饰器,来使用指定的装饰器,来装饰当前函数

def begin_end(old) :
    def new_function(*args, **kwargs) :
        print('开始执行......')
        result = old(*args, **kwargs)
        print('执行结束......')
        return result
return new_function

@begin_end  #  这种用法较为常用
def say_hello() :
    print('大家好')

可以同时为一个函数指定多个装饰器,这样函数将会按照从内向外的顺序被装饰

def begin_end(old) :
    def new_function(*args, **kwargs) :
        print('开始执行......')
        result = old(*args, **kwargs)
        print('执行结束......')
        return result
    return new_function

def test(old) :
    def new_function(*args, **kwargs) :
        print('test开始执行......')
        result = old(*args, **kwargs)
        print('test执行结束......')
        return result
return new_function

@begin_end
@test
def say_hello() :
    print('大家好')

say_hello()

执行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LF3_

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值