栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python Note — Day 4. 递归函数和高阶函数

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python Note — Day 4. 递归函数和高阶函数

10.4 递归函数 定义了一个函数 函数内自己调用自己递归函数必须要有结束 否则会一直调用下去 直到栈溢出递归函数是一层一层的调用 再一层一层的返回

就像坐在最后一排想要第一排妹子的电话 一个一个拍过去问 直到拍到第一排要到电话 最后一层层返回

def di(n): 
 print(n) 
 if n 0: 
 di(n-1) 
 print(n) 
di(3) 
di(3) 3 
 di(3-1) 2 
 di(2-1) 1 
 di(1-1) 0 
 di(0) 0 
 di(1) 1 
 di(2) 2 
di(3) 3
练习题-斐波那契数列
def feibo(x): 
 if x 1 or x 2: 
 return 1 
 else: 
 print(x-1,x-2)
 s feibo(x - 1) feibo(x - 2) 
 return s 
print(feibo(1)) 
print(feibo(6))
练习题-阶乘
def jie(n): 
 if n 1: 
 return 1 
 else: 
 return n*jie(n-1) 
s jie(9) 
print(s) 
递归函数效率并不高 能不用就不用一个函数调用后若没有结束 在栈空间就一直存在 直到函数运算结束才销毁 10.5 高阶函数

1.回调函数 闭包函数 匿名函数 迭代器

10.5.1 回调函数

函数调用的参数为函数

//如果将函数指针作为参数被传递到函数中 当这个函数指针被用于调用其指向的函数时 我们就称这个函数为回调函数

回调函数的主要优势是解耦 即调用者和被调用者被分开 调用者无需了解谁是被调用者 它只需知道如果满足某条件之后 函数将被调用

def func(x, y, f): 
 当前函数接受两个数值 并把这两个数值传递给第三个参数进行运算 
 x,y, int ; f, function 
 :param x: 
 :param y: 
 :param f: 
 :return: 
 #print(f([x,y])) 
 print(f(x, y)) 
func(1,2,sum) #sum计算一个容器
func(2,2,pow) 幂函数

10.5.2 闭包函数

函数内返回一个内函数 且内函数中使用了外函数的局部变量
特点

在外函数中定义局部变量 内函数总是用了这个局部变量外函数中返回内函数 返回的内函数就是闭包函数主要在于保护了外函数中的局部变量 既可以被使用 又不会被破坏
def person():
money 0
def work():
 nonlocal money
 money 100
 print(money)
#在外函数中返回内函数 闭包
return work
res person()
res() # work()
res()
res()
work()中是print不是return 此时不能在全局中对money进行任何此操作
如何检测是否为闭包函数
函数名.__closure__如果是闭包函数返回cell
print(res.closure)

10.5.3 匿名函数 lambda表达式

可以不使用def定义 且函数没有名字
注意 lambda表达式仅仅是一个一行代码 不是代码块 又称为一行代码的函数
不能访问除了自己形参外的数据包含全局变量

#lambda 参数列表 返回值
def add(x, y):
 return x y
print(add(3,4))
res lambda a,b:a b
print(res(4,4))
# lambda是一个表达式 不能写太复杂的逻辑 功能相对单一
# 可以使用分支结构
def func(sex):
 if sex male :
 return handsome 
 else:
 return beauty 
res func( male )
print(res)
# lambda 参数列表 真区间 if 表达式判断 else 假区间
ret lambda sex: nicce if sex male else good 
print(ret( man ))

10.5.4 迭代器

python中最具特色的功能之一 是访问集合元素的一种方式
迭代器是一个可以记住访问遍历的位置的对象
从集合第一个元素开始到左右元素被访问完毕
只能从前往后一个一个的遍历 不能后退
能被next()函数调用 并不断放回下一个值的对象称为iterator

迭代器

range(10,3,-1) #返回一个可迭代对象
for i in range(10,2,-1):
 print(i)
arr [99,8, yy ,1]
for i in arr:
 print(i)

iter()
功能 把可迭代的对象 转为一个迭代器对象
参数 可迭代的对象 str list tuple dict set range...
返回值 迭代器对象
注意 迭代器一定是一个可迭代的对象 但是可迭代对象不一定是迭代器

f4 [ one , two , three , four ]
# 可以使用for循环来遍历数据、
# 可以把可迭代对象转为迭代器使用
res iter(f4)
print(res,type(res))

迭代器的取值方案

next 调用一次获取一次 直到数据被取完list 直接取出所有的数据for 使用for循环遍历迭代器的数据
# 1. 使用next 函数去调用迭代器对象
r next(res)
print(r)
print(list(res)) #2.list 
r next(res) #超出可迭代的范围 StopIteration
print(r)
# print(next(res))
# print(next(res))
# print(next(res)) #超出可迭代的范围 StopIteration
# 3. for 循环
for i in res:
 print(i)
# print(next(res)) #超出可迭代的范围 StopIteration

迭代器取值特点

取出一个少一个 直到取完

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

from collections.abc import Iterator,Iterable
from collections.abc import Iterator,Iterable
varstr 12345 
res iter(varstr)
# type()函数返回当前数据的类型
# isinstance()检测一个数据是不是一个指定的类型
r1 isinstance(varstr, Iterable)
r2 isinstance(varstr, Iterator)
r3 isinstance(res, Iterable)
r4 isinstance(res, Iterator)
print(r1,r2,r3,r4)
#迭代器一定是一个可迭代对象 可迭代对象不一定是一个迭代器

2.next()函数检测
next(varstr) #TypeError: str  object is not an iterator

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/266654.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号