python第六周拼图_python学习-第六周:高阶函数

高阶函数

递归函数

递归函数就是定义了一个函数,然后在函数内,自己调用了自己这个函数

递归函数内必须要有结束,不然就会一只调用下去,直到调用的层数越来越多,栈溢出

递归函数是一层一层的进入,再一层一层的返回

使用案例

def digui(num):

print(num)

if num > 0:

digui(num-1)

print(num)

digui(3)

'''

当前递归函数的执行过程:

digui(3) ==> 3

digui(3-1) ==> 2

digui(2-1) ==> 1

digui(1-1) ==> 0

digui(0) ==> 0

digui(1) ==> 1

gidui(2) ==>2

digui(3) ==> 3

'''

回调函数

函数中的参数可以是任意类型的,那参数能不能是一个函数呢?此处就用到了回调函数

回调函数:在 函数1 中要求传递的参数是 函数2,并且在 函数1 中使用了传递进来的 函数2

使用案例

# 定义一个函数,函数中的一个参数要求是另一个函数

# 带有回调函数参数的函数

def func(f):

print(f,type(f))

# 并且在函数中调用了传递进来的行参函数

f()

# 回调函数

def love():

print('123')

func(love)

闭包函数

既然可以把函数作为一个行参进行传递,作为回调函数,那么如果在一个函数中,返回了一个函数呢?

在一个函数内返回了一个内函数, 并且这个返回的内函数还使用了外函数中局部变量,这就是闭包函数

特点:

在外函数中定义了局部变量,并且在内部函数中使用了这个局部变量

在外函数中返回了内函数,返回的内函数就是闭包函数

⚠主要在于保护了外函数中的局部变量,既可以被使用,又不会被破坏

检测一个函数是否为闭包函数,可以使用 函数名.__closure__如果是闭包函数返回 cell

使用案例

# 定义一个函数

def person():

money = 0 # 函数中定义了一个局部变量

def work():

nonlocal money # 在内函数中使用了外函数的临时变量

money += 100

print(money)

# 在外函数中返回了内函数,这个内函数就是闭包函数

return work

# 闭包的作用:保护了函数中的变量不受外部的影响,但是又能够不影响使用

匿名函数 lambda 表达式

语法:lambda [参数列表]:返回值

带有分支结构:lambda 参数列表: 真区间 if 表达式判断 else 假区间

匿名函数的意思就是说可以不使用def定义,并且这个函数也有没有名字

在python中可以使用lambda表达式来定义匿名函数

注意:lambda表达式仅仅是一个表达式,不是一个代码块,所以lambda又称为一行代码的函数

lambda表达式也有行参,并且不能访问除了自己的行参之外的任何数据包括全局变量

使用案例

a = lambda x,y:x+y

print(a(4,4))

b = lambda date:"睡懒觉" if date=='周末' else "去上班"

print(b('周一'))

迭代器

迭代器是python中最具特色的功能之一,是访问集合元素的一种方式

迭代器是一个可以记住访问遍历的位置的对象

从集合的第一个元素开始访问,直到集合中的所有元素被访问完毕

迭代器只能从前往后一个一个的便利,不能后退

能被next()函数调用,并不断返回下一个值的对象称为迭代器(Iterator 迭代器对象)

iter()

功能:把可迭代的对象,转为一个迭代器对象

参数:可迭代的对象 (str,list,tuple,dict

返回值: 迭代器对象

注意:迭代器一定是一个可以迭代的对象,但是可迭代对象不一定是迭代器

next()

next()函数可以去调用迭代器,并返回迭代器中的下一个数据

迭代器的取值方案

next() 调用一次获取一次,直到数据被取完

list() 使用list函数直接取出迭代器中的所有数据

for 使用for循环遍历迭代器的数据

取出一个少一个,直到都取完,最后再获取就会报错

使用案例

f4 = ['赵四','刘能','小沈阳','海参炒面']

# 将列表 f4 转为迭代器

res = iter(f4)

print(res,type(res)) #

# 1.使用next()函数去调用迭代器对象

print(next(res))

print(next(res))

# 2.使用list取值

r = list(res)

print(r)

# 3.使用for循环

for i in res:

print(i)

检测迭代器和可迭代对象的方法

from collections.abc import Iterator,Iterable

varstr = '123456'

res = iter(varstr)

# type() 函数返回当前数据的类型,

# isinstance() 检测一个数据是不是一个指定的类型

r1 = isinstance(varstr,Iterable) # True 可迭代对象

r2 = isinstance(varstr,Iterator) # False 不是一个迭代器

r3 = isinstance(res,Iterable) # True 可迭代对象

r4 = isinstance(res,Iterator) # True 是一个迭代器

print(r1,r2)

print(r3,r4)

# 迭代器一定是一个可迭代的对象,可迭代对象不一定是迭代器

函数第三部分归纳完毕,下周总结python的 file文件相关操作,下周见~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值