遞歸,匿名函數

目錄app

遞歸

函數的嵌套調用:函數嵌套函數。函數的遞歸調用:它是一種特殊的嵌套調用,可是它在調用一個函數過程當中,有直接間接調用了自身。dom

def foo():
    print('from foo')
    foo()

foo()  # 進入死循環
  • 直接調用函數

    import sys
    
    # 修改遞歸層數
    sys.setrecursionlimit(10000)
    def foo(n):
        print('from foo',n)
        foo(n+1)
    foo(0)
  • 間接調用code

def bar():
    print('from bar')
    foo()
    
def foo():
    print('from foo')
    bar()
    
bar()

遞歸必需要有兩個明確的階段:對象

  1. 遞推:一層一層遞歸調用下去,進入下一層遞歸的問題規模都將會減少
  2. 回溯:遞歸必需要有一個明確的結束條件,在知足該條件開始一層一層回溯。

遞歸的精髓在於經過不斷地重複逼近一個最終的結果。遞歸

def age(n):
    if == 1:
        return 26
    res = age(n-1)+2
    return res
print(f"age(5):{age(5)"})
age(5):34

二分法的應用

from random import randint
nums = [randint(1, 100) for i in range(100)]
nums = sorted(nums)
print(nums)
[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47, 51, 52, 52, 53, 53, 55, 55, 56, 56, 57, 57, 57, 58, 59, 61, 62, 64, 66, 66, 67, 68, 69, 69, 71, 72, 72, 74, 74, 75, 76, 78, 78, 79, 79, 79, 79, 80, 82, 85, 88, 89, 90, 90, 91, 91, 91, 94, 99, 99, 100]
def search(search_num,nums):
    mid_index=len(nums)/2
    print(nums)
    if not nums:
        print("not exists")
        return 
    if search_num>nums[mid_index]:
        nums=nums[mid_index+1:]
        search(search_num,nums)
    elif search_num<nums[mid_index]:
        nums=nums[:mid_index]
        search(search_num,nums)
    else:
        print('find it')
search(7,nums)
[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47, 51, 52, 52, 53, 53, 55, 55, 56, 56, 57, 57, 57, 58, 59, 61, 62, 64, 66, 66, 67, 68, 69, 69, 71, 72, 72, 74, 74, 75, 76, 78, 78, 79, 79, 79, 79, 80, 82, 85, 88, 89, 90, 90, 91, 91, 91, 94, 99, 99, 100]
[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47]
[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21]
[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7]
[6, 6, 7, 7, 7]
find it
  • 普通版本和遞歸版本比較
import time


def rec_find_num(num, lis):
    """遞歸版本"""
    lis_len = int(len(lis) / 2)  # 10.0

    binary_num = lis[lis_len]  # 10

    if len(lis) == 1:
        print('沒找到')
        return

    if binary_num > num:
        lis = lis[:lis_len]
        rec_find_num(num, lis)
    elif binary_num < num:  # 10 < 18
        lis = lis[lis_len + 1:]
        rec_find_num(num, lis)
    else:
        print('找到了')


lis = [i for i in range(100000000)]  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
start = time.time()
rec_find_num(4567899900, lis)
end = time.time()
print(end - start)  # 1.1569085121154785

import time

lis = [i for i in range(100000000)]


def time_count(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)
        end = time.time()
        print(end - start)
        return res

    return wrapper


@time_count
def find_num(num):
    """普通版本"""
    for i in lis:
        if i == num:
            print('找到了')
            break
    else:
        print('沒有被找到')


find_num(4567899900)  # 2.293410062789917

匿名函數

  • 有名函數it

    咱們以前定的函數都是有名函數,它是基於函數名使用。io

    def func():
        print('from func')
    
    
    func()
    func()
    func()
    print(func)
    from func
    from func
    from func
    <function func at 0x10518b268>
  • 匿名函數function

    匿名函數,他沒有綁定名字,使用一次即被收回,加括號既能夠運行。class

    lambda x, y: x+y
    <function __main__.<lambda>(x, y)>
    res = (lambda x, y: x+y)(1, 2)
    print(res)
    3

    與內置函數聯用

    1.若是咱們想從上述字典中取出薪資最高的人,咱們能夠使用max()方法,可是max()默認比較的是字典的key。

    1. 首先將可迭代對象變成迭代器對象
    2. res=next(迭代器對象),將res當作參數傳給key指定的函數,而後將該函數的返回值當作判斷依據
salary_dict = {
    'nick': 3000,
    'jason': 100000,
    'tank': 5000,
    'sean': 2000
}

print(f"max(salary_dict): {max(salary_dict)}")


def func(k):
    return salary_dict[k]


print(f"max(salary_dict, key=func()): {max(salary_dict, key=func)}")
print(
    f"max(salary_dict, key=lambda name: salary_dict[name]): {max(salary_dict, key=lambda name: salary_dict[name])}")
max(salary_dict): tank
max(salary_dict, key=func()): jason
max(salary_dict, key=lambda name: salary_dict[name]): jason

sorted()、filter()、sorted()方法聯用。

相關文章
相關標籤/搜索