原题链接:http://www.runoob.com/python/python-exercise-example31.html
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
我的代码:
def fun(): li=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'] s=input("please enter the initial:").upper() results=[] for i in li: if i.startswith(s): #startswith()函数,解决开头匹配 results.append(i) if len(results) ==1: return results[0] else: s += input("please input the second char:").lower() for i in li: if i.startswith(s): return i if __name__ =='__main__': print(fun())
思考:
这道题乍一看很容易,只要两次if判断就能实现。但是看到别人的答案,发现这是一种典型的题:一次输入一个字母,首字母匹配一个list里的内容,如果匹配多个,再输入并匹配第二个字母、第三个字母……,直到只匹配出一个的时候,返回。
可能列表足够多,要输入好几个字母才能判断,那就不能用上述的两个if实现了,应该设计一个重复判断的函数反复调用,或者递归。
递归的实现:
def fun(s,li=None): li == [] if li is None else li a =input("please enter a character :") s += a results=[] for i in li: if i.startswith(s): results.append(i) if len(results) ==1: #用list储存,用len()判断匹配到的个数 return results[0] else: return fun(s,li) #s来存储上一次运算的结果,给下一次,用这种方式实现了递归 if __name__=='__main__': s='' #初始化s,重要 li=['abe','abce','abcdf','abcdef','abcda'] #其实这种方法并不全面,要找的话,找不到短的会重复匹配的项,如[a,abc,abcd],a和abc都不可能被找出 print(fun(s,li))
本来想着设计一个重复判断的函数调用,但是有问题。
只能写成这样:
def fun(): s='' while True: a=input("please enter a character:") s+=a results=[] li=['abd','abce','abcdf','abcdef','abcda','kw','kxx','Saturday','Sunday'] for i in li: if i.startswith(s): results.append(i) if len(results) ==1: return results[0]
后来改了改,函数参数设置个s,就避免了每一轮循环s保存不下来的问题,还是能写出来了~
def fun(): s='' x=None while not x: #while的条件不能是True了,因为retrun在下面的函数了。 s,x=judge(s) print(x) def judge(s): a=input("please enter a character:") s+=a results=[] li=['abd','abce','abcdf','abcdef','abcda','kw','kxx','Saturday','Sunday'] for i in li: if i.startswith(s): results.append(i) if len(results) ==1: return s,results[0] else: return s,None #要这一句,不然默认返回的None传到上面两个参数会报错