LEMON

记录站

0%

Prthon递归及迭代器(十)

Prthon递归及迭代器

一、递归

凡是循环能干的事,递归都能干。只不过,递归不是一般人等运用自如地,因为太复杂了……

1、概念

  1. 递归调用:一个函数,调用了自身,成为自身调用

  2. 递归函数:一个会调用自身的函数称为递归函数

写一个递归的过程方式

  1. 写出临界条件(出口)

  2. 找这一次和上一次的关系

  3. 假设当前函数已经能用,调用自身计算上一次的结果,在求出本次的结果

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
# 1、输入一个数(大于等于1),使用递归函数求1+2+3+4的总和数
def gc_sum(n):

# 定义出口
if n == 1:
return 1
else:
# 假设gc_sum能够正确的处理1...n - 1
# 执行过程: 4 + 1 + 1 + 2 + 3 + 4 = 15
# 最后再让两个数字相加
return n + gc_sum(n - 1)

res = gc_sum(5)
print("res =", res)


# 2、递归遍历目录
import os
def getAllDirRE(path, sp = ""):

# 以列表的形式得到当前目录下所有的文件、目录
filelist = os.listdir(path)
sp += " "
# for用于处理目录下的每一个文件、目录
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"路径") # 调用gc_dir函数

二、迭代对象与迭代器

可迭代对象 与 迭代器

1、可迭代对象

可以直接作用于for循环的对象统称为可迭代对象(Iterable),可以用isinstance()这个方法去判断一个对象是否为Iterable可迭代对象。可以直接作用于for的数据类型一般分为以下两种:

  1. 集合数据类型,如list、tuple、dict、set、string
  2. generator,包括生成器和带yield的generator function

案例

1
2
3
4
5
6
7
8
9
10
11
# 例如:注意> python3.7之前的版本不用在collections后缀加.abc,只有3.7用,不加则会报错
from collections.abc import Iterator # 导入Iterator模块
from collections.abc import Iterable # 导入Iterable模块

# 用isinstance()这个方法去判断以下对象是否为可迭代对象,是就返回True,否则返回Fales
print(isinstance([], Iterable)) # True
print(isinstance((), Iterable)) # True
print(isinstance({}, Iterable)) # True
print(isinstance("", Iterable)) # True
print(isinstance((x for x in range(10)), Iterable)) # True
print(isinstance(2, Iterable)) # False

2、迭代器

不但可以作用于for循环还能被next()函数不断调用并返回下一个值,直到最后抛出一个StopIteration错误表示无法继续返回下一个值。

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

可以使用isinstance()函数判断一个对象是否为Iterator对象

案例

1
2
3
4
5
6
7
8
9
10
11
print(isinstance([], Iterator))       # False
print(isinstance((), Iterator)) # False
print(isinstance({}, Iterator)) # False
print(isinstance("", Iterator)) # False
print(isinstance((x for x in range(10)), Iterator)) # True

i = (x for x in [1, 2, 3])
print(next(i), type(i)) # 1 <class 'generator'>
print(next(i), type(i)) # 2 <class 'generator'>
print(next(i), type(i)) # 3 <class 'generator'>
# print(next(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)) # True
print(isinstance(iter(()), Iterator)) # True
print(isinstance(iter({}), Iterator)) # True
print(isinstance(iter(""), Iterator)) # True
print(isinstance(([]), Iterator)) # False;不转则都是False

a = iter([4, 5, 6])
print(next(a),type(a)) # 4 <class 'list_iterator'>
print(next(a),type(a)) # 5 <class 'list_iterator'>
print(next(a),type(a)) # 6 <class 'list_iterator'>
# print(next(a)) # 超出范围之后会抛出StopIteration错误码


# 案例
Endstr = "end"
String = ""
for i in iter(input, Endstr):
String += i + "\n"
print(String)
-------------本文结束感谢您的阅读-------------