函数------续2

1.三元表达式

符合Python语法的表达方式(形式,公式)称之为表达式

三元,三个元素

总体就是由三个元素组成的表达式

其目的是为了简化书写既然是简化必然有局限性

三元表达式·只能帮你简化两个分支的if 判断,无论这个判断条件是否成立都必须返回一个值

2.递归

指的是递归调用,简单地说就是一个函数在执行是过程直接或间接调用了本身

递归时可能出现以下错误:

在调用函数时超出最大递归深度

Python为了防止递归无限制占用内存,对函数的递归的调用做了最大的层级限制

修改方法

import sys
sys.getrecursionlimit()
sys.setrecursionlimit(2000)  

递归分为回溯和递推

回溯就是从外向里一层一层递归调用下去,

回溯阶段必须要有一个明确的结束条件,每进入下一次递归时,问题的规模都应该有所减少(否则自身毫无意义)

递推就是从里向外一层一层结束递归

总结递归的使用:

1.必须有一个明确的结束条件

2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack) 这种数据结构实现的,每次进入一个函数调用,栈就会加一层栈,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多就会导致 栈溢出)

二分查找法

​ 分成俩。。。。找不到继续分(前提是从小-----大/从大-----小)

[1,2,10,30,33,99,101,200,301,311,402,403,500,900,1000]
def search(n,l):
   print(l)
   if len(l) == 0:
       print('not exists')
       return
   mid_index=len(l) // 2
   if n > l[mid_index]:
       #in the right
       l=l[mid_index+1:]
       search(n,l)
   elif n < l[mid_index]:
       #in the left
       l=l[:mid_index]
       search(n,l)
   else:
       print('find it')


search(3,l)
l=[1,2,10,30,33,99,101,200,301,402]

def search(num,l,start=0,stop=len(l)-1):
   if start <= stop:
       mid=start+(stop-start)//2
       print('start:[%s] stop:[%s] mid:[%s] mid_val:[%s]' %(start,stop,mid,l[mid]))
       if num > l[mid]:
           start=mid+1
       elif num < l[mid]:
           stop=mid-1
       else:
           print('find it',mid)
           return
       search(num,l,start,stop)
   else: #如果stop > start则意味着列表实际上已经全部切完,即切为空
       print('not exists')
       return

search(301,l)

3.匿名函数

就是没有名字

与函数作用域相同,但是匿名意味着引用计数为0,只能使用一次

lambd 关键字

有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能

匿名函数:随时定义,一次使用

应用:max ,min ,sorted , map, reduce ,filter

 

 

猜你喜欢

转载自www.cnblogs.com/wangyunlll/p/10282171.html