匿名函数 函数递归

一 匿名函数

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)

 

转载于:https://www.cnblogs.com/gongcheng-/p/9767463.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值