面向函数编程
def func(): print('从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?') func()
解耦:尽量把不相关的功能拆开,用的时候再调用函数,增强代码重用性,减少代码变更的相互影响
要完成一个完整的功能,但这个功能的规模要尽量小,并且和这个功能无关的其他代码应该和这个函数
分离
recursion 递归
什么是递归:
一个函数在内部调用了自己本身
def func(): print('从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?') func() print('123')
这里面的123永远不会打印,永远都在执行下一个func()
import sys 和python解释器相关的模块
递归层数在python中最大997。可以改限制。
import sys sys.setrecursionlimit(1000000) # 修改最大范围 ---但是 python 自己会根据计算机性能停止 count=0 def func(): global count count+=1 print(count) func() func()
递归实例:
写递归函数,必须要有一个结束条件
alex比egon大两岁 alex=egon+2
egon比wusir大两岁 egon=wusir+2
wusir比金鑫大两岁 wusir=金鑫+2
金鑫40了 金鑫40
推测的过程是递,后面计算是归
def age(n): if n ==4: return 40 return age(n+1)+2 f = age(1) print(f)
根据线索向下是递,拿到一个结果再向上是归
递归方法求阶乘:
def jie(n): return jie(n-1)*n print(jie(7))
二分查找
l=[1,5,6,7,8,9,25,26,78,123,456,789,1233,7899,8521,9635,10255] def search(num,l,start=None,end=None): start=start if start else 0 end=end if end else len(l)-1 mid = (end-start)//2+start if start>end: return None if l[mid]>num: return search(num,l,0,mid-1) if l[mid]<num: return search(num,l,mid+1,end) if l[mid]==num: return mid,l[mid] print(search(78,l))
无序的先用.sort()排序
斐波那契数列递归
li=[1,1] def fib(n): if n>len(li): li.append(li[-2]+li[-1]) fib(n) return li n = input('请输入要计算的数字个数:') n = int(n) ret = fib(n) print(ret)
面试真题递归
data={'time':'2016-08-05T13:13:05', 'some_id':'ID1234', 'grp1':{'fld1':1,'fld2':2}, 'xxx2':{'fld3':0,'fld5':0.4}, 'fld6':11, 'fld7':7, 'fld46':8} def select(data,fields): li=fields.split('|') for item in data: if item in li: print(item,data[item]) elif type(data[item])==dict: ret = select(data[item],fields) n = input('按照格式输入:') select(data,n)
三级菜单递归
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } #相同的数据类型 嵌套在一起 def Three_Level_Menu(menu): while True: for k in menu:print(k) key = input('>>>') if key == 'q':return 'q' elif key == 'b':break elif key in menu: ret = Three_Level_Menu(menu[key]) if ret == 'q': return 'q' Three_Level_Menu(menu)