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