Prthon递归及迭代器
一、递归
凡是循环能干的事,递归都能干。只不过,递归不是一般人等运用自如地,因为太复杂了……
1、概念
递归调用:一个函数,调用了自身,成为自身调用
递归函数:一个会调用自身的函数称为递归函数
写一个递归的过程方式
写出临界条件(出口)
找这一次和上一次的关系
假设当前函数已经能用,调用自身计算上一次的结果,在求出本次的结果
2、案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| def gc_sum(n):
if n == 1: return 1 else: return n + gc_sum(n - 1)
res = gc_sum(5) print("res =", res)
import os def getAllDirRE(path, sp = ""):
filelist = os.listdir(path) sp += " " for fileName in filelist: gc_path = os.path.join(path, fileName) if os.path.isdir(gc_path) == True: print(sp, f"目录:{fileName}") getAllDirRE(gc_path, sp) else: print(sp, f"文件:{fileName}")
getAllDirRE(r"路径")
|
二、迭代对象与迭代器
可迭代对象 与 迭代器
1、可迭代对象
可以直接作用于for循环的对象统称为可迭代对象(Iterable),可以用isinstance()这个方法去判断一个对象是否为Iterable可迭代对象。可以直接作用于for的数据类型一般分为以下两种:
- 集合数据类型,如list、tuple、dict、set、string
- generator,包括生成器和带yield的generator function
案例
1 2 3 4 5 6 7 8 9 10 11
| from collections.abc import Iterator from collections.abc import Iterable
print(isinstance([], Iterable)) print(isinstance((), Iterable)) print(isinstance({}, Iterable)) print(isinstance("", Iterable)) print(isinstance((x for x in range(10)), Iterable)) print(isinstance(2, Iterable))
|
2、迭代器
不但可以作用于for循环还能被next()函数不断调用并返回下一个值,直到最后抛出一个StopIteration错误表示无法继续返回下一个值。
可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator对象)
可以使用isinstance()函数判断一个对象是否为Iterator对象
案例
1 2 3 4 5 6 7 8 9 10 11
| print(isinstance([], Iterator)) print(isinstance((), Iterator)) print(isinstance({}, Iterator)) print(isinstance("", Iterator)) print(isinstance((x for x in range(10)), Iterator))
i = (x for x in [1, 2, 3]) print(next(i), type(i)) print(next(i), type(i)) print(next(i), type(i))
|
iter() 转换Iterator对象: List、tuple、dict、string都能转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| print(isinstance(iter([]), Iterator)) print(isinstance(iter(()), Iterator)) print(isinstance(iter({}), Iterator)) print(isinstance(iter(""), Iterator)) print(isinstance(([]), Iterator))
a = iter([4, 5, 6]) print(next(a),type(a)) print(next(a),type(a)) print(next(a),type(a))
Endstr = "end" String = "" for i in iter(input, Endstr): String += i + "\n" print(String)
|