【Class 28】童心大发 通过递归函数 解决 python实践题目二 之 压缩代码

重新把题目贴上来:

看到书中有个实践题目:童心大发,来玩玩:

4.10.1 逗号代码
假定有下面这样的列表:
spam = [‘apples’, ‘bananas’, ‘tofu’, ‘cats’]
编写一个函数,它以一个列表值作为参数,返回一个字符串。
该字符串包含所有表项,表项之间以逗号和空格分隔,并在最后一个表项之前插入 and。
例如,将前面的 spam 列表传递给函数,将返回’apples, bananas, tofu, and cats’。但你的函数应该能够处理传递给它的任何列表。

======》
这道题目如果用我们的for 等循环来实现,非常简单,那就没意思了

我们来增加一点难度,
要求:
1. 必须使用递归函数来实现
2. 可以实现正序或者逆序累加
3. 传入的列表不限制长度,并且 maybe 无限长的list。

想想应该如何实现呢? 是不是修改题目后变得有意思多了呢?

在前面得博客中: 【Class 27】童心大发 通过递归函数 解决 python实践题目<一>
我们已经实现了这个功能,但代码得精炼程度,貌似还不让我们满意,
且前面得代码有个缺点是,使用 传递引用 方法,会导致传入得值被修改
今天继续来优化一下,将代码进行压缩。

最终压缩到只剩三行逻辑代码:

import copy

# format = True, 正序相加, 默认
# format = False, 倒序相加 
def str_add(arg , str_ready='' , format=True):
	# 第一行代码:判断正序逆序
    index =  0 if format==True else (len(arg)-1)
	# 第二行代码:将字符串进行累加
    str_ready += ('and '+arg[index] ) if len(arg)==1 else (arg[index] + ' , ')
    
    print(str_ready)
	# 第三行代码: 直接return 结果,或者继续 递归调用
    return  str_ready  if len(arg)<=1 else  str_add(arg[1:] if format==True else arg[0:-1], str_ready, format) 

b = ['a' , 'b', 'c', 'd', 'e', 'f', 'g' , 'h' , 'i']
print('收到函数最终正序返回值: ', str_add(b))

print('收到函数最终逆序返回值: ', str_add(b, format=False))

输出结果:

PS C:\Users\Administrator\Desktop\tmp> python .\Untitled-4.py
a ,
a , b ,
a , b , c ,
a , b , c , d ,
a , b , c , d , e ,
a , b , c , d , e , f ,
a , b , c , d , e , f , g ,
a , b , c , d , e , f , g , h ,
a , b , c , d , e , f , g , h , and i
收到函数最终正序返回值:  a , b , c , d , e , f , g , h , and i
i ,
i , h ,
i , h , g ,
i , h , g , f ,
i , h , g , f , e ,
i , h , g , f , e , d ,
i , h , g , f , e , d , c ,
i , h , g , f , e , d , c , b ,
i , h , g , f , e , d , c , b , and a
收到函数最终逆序返回值:  i , h , g , f , e , d , c , b , and a

猜你喜欢

转载自blog.csdn.net/Ciellee/article/details/88072071