一、函数封装练习 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))