函數

一、函數封裝練習
1、編寫一個函數,能夠接收至少2個參數,返回最小值和最大值
def double_values(*arge):
if len(arge) < 2:
print("Please enter at least 2 Parameters")
else:
return max(arge),min(arge)

    import random
    print(*double_values(*[random.randint(10,20) for _ in range(10)]))

2、編寫一個函數,接收一個參數n,n爲正整數,打印右下三角和右下三角
(1)右下三角
    def show(n):
        tail = " ".join([str(i) for i in range(n,0,-1)])
        width = len(tail)
        for i in range(1,n):
            print('{:>{}}'.format(" ".join([str(j) for j in range(i,0,-1)]),width))
        print(tail)
    或者:
    def show(n):
        for i in range(1,n):
            print('{:>{}}'.format(" ".join([str(j) for j in range(i,0,-1)]),int(n*2+(n-10))))
        print(tail)
(2)右上三角
    def showtail(n):
        tail = " ".join([str(i) for i in range(n,0,-1)])
        print(tail)
        for j in range(len(tail)):
            if tail[j] == ' ':
                print(' '*i,tail[i+1:])

二、遞歸函數練習
1、斐波那契數列
def fib(n):
return 1 if n < 2 else fib(n-1) + fib(n-2)
for i in range(5):
print(fib(i),end='')

2、斐波那契數列(改進)
    def fib(n,pre=0,cur=1):
        print(cur,end=' ')
        pre, cur = cur, pre+cur
        if n == 2:
            print(cur,end=' ')
            return cur
        return fib(n-1,pre,cur)
    fib(n)

3、求n的階乘
    def fac(n):
        if n == 1:
            return 1
        return n * fac(n-1)

    def fac(n,p = 1):
        if n == 1:
            return p
        p *= n
        return fac(n-1,p)

    def fac(n,p = None):
        if p is None:
            p = [1]
        if n == 1:
            return p[0]
        p[0] *= n
        return fac(n-1,p)

4、將一個數逆序放入列表中,例如1234 => [4,3,2,1]
(1)索引查找
    data = str(1234)
    def revert(x):
        if x == -1:
            return ''
        return data[x] + revert(x-1)
    print(revert(len(date)-1))
(2)取模,取餘
    def revert(n,lst1=None):
        if lst is None:
            lst = []
        x,y = divmod(n,10)
        lst.append(y)
        if x == 0:
            return lst
        return revert(x,lst)
(3)切片
    def revert(num,target=[]):
        num = str(num)
        if num:
            target.append(num[len(num)-1]) # target.append(num[-1:])
            revert(num[:len(num)-1])
        return target

5、猴子吃桃問題
(1)天數的正向思維
    def peach(days=10):
        if days == 1:
            return 1
        return (peach(days-1)+1)*2
(2)天數的逆向思維
    def peach(days=1):
        if days == 10:
            return 1
        return (peach(days+1)+1)*2

三、生成器函數
1、處理遞歸問題(斐波那契數列)
def fib():
x = 0
y = 1
while True:
yield y
x,y = y,x+y
foo = fib()
for in range(5):
print(next(foo))
for
in range(10):
netx(foo)
print(netx(foo))

2、計數器
    def inc():
        def counter():
            i = 0
            while True:
                i += 1
                yield i
            c = counter()
            return lambda:next(c)
    foo = inc()
    print(foo())
    print(doo())

四、作業
1、把一個字典扁平化
源字典:{'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
目標字典{'a,b':1,'a,c':2,'d,e':3,'d,f,g':4}

    #外部給定字典
    source = {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
    target = {}
    def flatmap(src,prefix=''):
        for k,v in src.items():
            if isinstance(v,(list,tuple,set,dict)):
                flatmap(v,prefix = prefix + k + '.')
            else:
                target[prefix + k] = v
        return target
    flatmap(sorted)

    #可以外部提供,可以內部自動創建字典
    source = {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
    def flatmap(src,dest=None,prefix=''):
        if dest == None:
            dest = {}
        for k,v in src.items():
            if isinstance(v,(list,tuple,set,dict)):
                flatmap(v,dest,prefix = prefix + k + '.')
            else:
                dest[prefix + k] = v
        return dest
    flatmap(source)

    #只提供一個參數源字典
    source = {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
    def flatmap(src):
        def _flatmap(src,dest=None,prefix=''):
            for k,v in src.items():
                key = prefix + k
                if isinstance(v,(list,tuple,set,dict)):
                    _flatmap(v,dest,key + '.')
                else:
                    dest[key] = v

        dest = {}
        _flatmap(src,dest)
        return dest

    flatmap(sorted)

2、實現Base64編碼
alphabet = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

teststr = "abcd"
def base64(src):
    ret = bytearray()
    length = len(src)
    # r記錄補0的個數
    r = 0
    for offset in range(0,length,3):
        if offset + 3 <= length:
            triple = src[offset:offset + 3]
        else:
            triple = src[offset:]
            r = 3 - len(triple)
            triple = triple + '\x00'*r # 補幾個0
        #print(triple,r)
        #將3個字節看成一個整體轉成字節bytes,大端模式
        #abc => 0x616263
        b = int.from_bytes(triple.encode(),'big')
        #print(hex(b))

        for i in range(18,-1,-6):
            if i == 18:
                index = b >> i
            else:
                index = b >> i & 0x3F
            ret.append(alphabet[index]) #得到base64編碼的列表
        if r != 0:
            for i in range(1,r+1):
                ret[-i] = 0x3D
    return ret

3、求2個字符串的最長公共子串
    #矩陣算法
    s1 = 'abcdefg'
    s2 = 'defabcd'
    def findit(str1,str2):
        matrix = []
        xmax = 0
        xindex = 0
        for i, x in enmerate(str2):
            matrix.append([])
            for j, y in enmerate(str1):
                if x != y: #若兩個字符不相等
                    matrix[i].append(0)
                else:
                    if i == 0 or j == 0: #兩個字符相等,有字符在邊上的
                        matrix[i].append(1)
                    else: #不在邊上
                        matrix[i].append(matrix[i-1][j-1] + 1)

                    if matrix[i][j] > xmax: #判斷當前加入的值和記錄的最大值比較
                        xmax = matrix[i][j]
                        xindex = j #記錄當前值的x軸偏移量,和str[xindex+1-xmax:xindex+1]匹配
                        xindex += 1 #只是爲了計算的需要才+1,和str1[xindex - xmax:xindex]匹配
        #return str1[xindex+1-xmax:xindex+1]
        return str[xindex - xmax:xindex]

    #最長切到最短
    s1 = 'abcdefg'
    s2 = 'defabcdoabcdeftw'
    s3 = '1234a'

    def findit(str1,str2):
        if len(str1) < len(str2):
        length = len(str1)
        strmin = str1
        strmax = str2
        else:
        length = len(str2)
        strmin = str2
        strmax = str1
        count = 0

        for sublen in range(length,0,-1):
            for start in range(0,length - sublen + 1):
                substr = strmin[start:start + sublen]
                count += 1
                if strmax.find(substr) > -1:
                    print("count={},subsrtlen={}".format(count,sublen))
                    return substr

    print(findit(s1,s2))
    print(findit(s1,s2))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章