匿名函数 函数递归

一 匿名函数

1. 什么是匿名函数

  def 定义的时有名函数:特点是可以通过名字重复调用

    def func(): #func=函数的内存地址

      pass

    匿名函数就是没有名字的函数:特点是只能在定义时使用一次

 

2.为何要用匿名函数

  强调:

    匿名函数的定义就相当于只村上一个变量在值,而没有绑定任何名字

    所以会在定义完之后就被回收,无法重复使用,只能在定义时使用一次

  应用:当某一功能仅使用一次就没有再重复使用的必要了.就应该定义成匿名函数

 

3.如何用匿名函数
    lambda x,y:x+y

res=(lambda x,y:x+y)(1,2)

print(res)

 

salaries={

  'egon':3000,

  'alex':10000000,

  'wupeiqi':10000,

  'yuanhao':2000

}

排序

numa=[10,-1,11,9,23]

print(max(nums))

print(max(salaries.values()))

 

key=函数的内存地址:作用是控制max函数的比较值

def func(k):

  return salaries[k]

print(max(salaries,key=func))

1.将可迭代对象salaries变成迭代器对象iter_obj

2.next(iter_obj)得到一个人名,然后将该人名当作参数传给key指定的函数,

   然后调用函数将函数的返回值当作比较依据

3.比较大小,取出最大值对应的人名

print(max(salaries,key=lambda k:salaries[k}))

 

sorted排序

nums=[10,-1,11,9,23]

print(sorted(nums))

print(nums)

 

salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
print(sorted(salaries,key=lambda k:salaries[k]))
print(sorted(salaries,key=lambda k:salaries[k],reverse=True))

 

map

names = ['alex','wupeiqi','yuanhao','kevin','hu老师']

方式一:手动实现

new_name=[]

for name in names:

  new_names.append(name+'dsb)

print(new_names)

 

方式二:列表生成式

new_names = [name + 'dsb' for name in names]

print(new_names)

 

方式三:map+匿名函数

res=map(lambda x:x+'dsb',names)

print(res)

print(list(res))

 

reduce

方式一:手动实现

res=0

for i in range(101):

  res+=1

print(res)

 

方式二:列表生成式

print(sum([i for i in range(101)]))

 

方式三:reduce+匿名函数 

from functools import reduce

print(reduce(lambda x,y:x+y,[i for i in range(101)],100))#=>5150

print(reduce(lambda x,y:x+y,[i for i in range(101)]))#=>5050

print(reduce(lambda x,y:x+y,['h','e','l','l','o'],'----------'))#=>----------hello

 

filter 

names=['alex_dsb','wxx_sb','kevin_sb','hu_sb','egon']

方式一:手动实现

new_names=[]

for name in names:

  if name.endswith('sb'):

    new_names.append(name)

print(new_names)

 

方式二:列表生成式

new_names=[name for name in names if name.endswith('dsb')]

print(new_names)

 

方式三:filter+匿名函数

res=filter(lambda name:name.endswith('sb'),names)

print(res)

print(list(res))

二 函数递归

1.什么是函数递归

  函数的递归调用是函数嵌套调用的一种特殊形式,

  特殊在调用一个函数过程中有直接或者间接的调用了该函数本身

  

  递归本质就是一个循环的过程

    但是递归必须满足两个原则:

      1.每进入下一层递归,问题的规模必须有所减少

      2.递归必须有一个明确的结束条件或者说有一个明确的进入下一层递归的条件

    并且递归有两个明确的阶段

      1.回溯:一层一层的递归调用下去

      2.递推:再某一层结束掉递归,然后一层一层返回

 

2.为何要用递归:

  在某些情况下,基于递归来使用重复的过程比while循环更加简单

 

3.如何用

 

def f1():

  print('from f1')

  f1()

f1()

 

def f2():

  print('from f2')

  f1()

def f1()

  print('from f1')

  f2()

f1()

 

递归举例:

age(5)=age(4)+2

age(4)=age(3)+2

age(3)=age(2)+2

age(2)=age(1)+2

age(1)=18

 

age(n) = age(n-1)+2

age(1)=18

def age(n):

  if n==1:

    return 18

  return age(n-1)+2

res=age(5)

print(res)

 

list = [1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]

def func(1)

  for item in 1:

    if type(item)is list:

      #将item当做一个新列表传给功能本身

      func(item)

    else:

      print(item)

func(list1)

 

二分法:二分法是算法的一种,算法是如何高效的解决问题的思路

nums=[1,13,15,23,27,31,33,57,73,81,93,94,97,101] # 从小到大排列的数字列表

for num in nums:
if 58 == num:
print('find it')
break
else:
print('not exists')

 

nums= [1,13,15,23,27,31,33,57,73,81,93,94,97,101]# 从小到大排列

def binary_search(find_num,nums):

  print(nums)\

  if len(nums) ==0:

    print('not exists')

    return

  #功能

  mid_index = len(nums)//2

  if find_num > nums[mid_index]:

    #in the right

    nums=nums[mid_index+1:]

    binary_search(find_num,nums)

  elif find_num , nums[mid_index]:

    # in the left

    nums = nums[:mid_index]

    binary_search(find_num,nums)

  else:

    print('find it')

binary_search(97,nums)

binary_search(95,nums)

 

posted @ 2018-10-10 16:46  Milford  阅读(207)  评论(0编辑  收藏  举报