zoukankan      html  css  js  c++  java
  • python3练习100题——031

    原题链接: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传到上面两个参数会报错
            
  • 相关阅读:
    TCP服务器是否需要心跳包?
    用最简单的函数实现功能:判断一个int数据是否是2的x次幂(不能使用循环)。
    防止程序启动两次的方法CreateMutex()
    WINDOWS操作系统中可以允许最大的线程数
    setsockopt 设置socket 详细用法
    我的结论:DX9不支持非2的次幂尺寸纹理,还得显卡说了算
    D3DX_DEFAULT_NONPOW2
    【解决】Select网络模型问题——奇怪的发送接收问题
    CRC32 简单使用
    .NET开发总结 2010年2月
  • 原文地址:https://www.cnblogs.com/drifter/p/9194696.html
Copyright © 2011-2022 走看看