天天看點

Python-遞歸、三元表達式清單生成式等

一、函數遞歸

1.什麼是函數遞歸:函數的遞歸調用是函數嵌套的一種特殊形式,在調用一個函數的過程中又直接或者間接地調用該函數本身,稱之為函數的遞歸調用

2.遞歸調用必須明确的兩個階段:

  1.回溯:一次次遞歸調用下去,應該讓每一次重複問題的規模有所減少,直到逼近最終的結果,即回溯階段一定要有明确的結束條件

  2.遞推:往回一層一層推算結果

例子:

# def age(n):
#     if n == 1:
#         return 18
#     return age(n-1) + 2
#
#
# print(age(5))      

思路:

# 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 #n>1
# age(n)=18         #n=1      

二分法:

# nums=[13,15,17,23,31,53,74,81,93,102,103,201,303,403,503,777]
# find_num=503
#
#
# def binary_search(nums,find_num):
#     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(nums,find_num)
#     elif find_num < nums[mid_index]:
#         #in the left
#         nums=nums[0:mid_index]
#         # 重新執行二分的邏輯
#         binary_search(nums,find_num)
#     else:
#         print('find it')

binary_search(nums,find_num)      

二、三元表達式

三元表達式實作的效果就是:條件成立的情況下傳回一個值,不成立的情況下傳回另外一種值

# res=條件成立情況下傳回的值  if 條件 else 條件不成立情況下傳回的值
name=input('your name: ').strip()
res="SB" if name == 'lqz' else "NB"
print(res)      

三、清單生成式

# l =[ i for i in range(10)]
# print(l)
# l = [i for i in range(10) if (i%2)==0]
# print(l)
names = ['alex_sb','lqz_sb','yyh_sb','fm_sb','egon']
l=[name for name in names if name.endswith('sb')]
print(l)      

四、字典生成式

keys=[‘name‘,‘age‘,‘sex‘]
values=[‘egon‘,18,‘male‘]
res=zip(keys,values)
print(list(res))    #[(‘name‘, ‘egon‘), (‘age‘, 18), (‘sex‘, ‘male‘)]
方式一
d={ }
for k,v in zip(keys,values):
    d[k]=v
print(d)   #{‘name‘: ‘egon‘, ‘age‘: 18, ‘sex‘: ‘male‘}

方式二
d={k:v for k,v in zip(keys,values)}
print(d)   #{‘name‘: ‘egon‘, ‘age‘: 18, ‘sex‘: ‘male‘}
方式三
      
dic={k:values[i] for i,k in enumerate(keys)}
print(dic)      

補充:zip(拉鍊函數)

s=‘hello‘
l=[1,2,3,]
res=zip(s,l)
print(list(res))    #[(‘h‘, 1), (‘e‘, 2), (‘l‘, 3)]      

五、匿名函數

匿名函數就是沒有名字的函數,用于僅僅臨時使用一次的場景,沒有重複使用的需求,一般和内置函數結合使用

# max,min,sorted,map,filter,reduce      

正常函數使用 

def

 關鍵字定義,但匿名函數使用 

lambda

 關鍵字定義

文法格式為 lambda arguments:expression

  • lambda

    :定義匿名函數的關鍵字
  • arguments

    :函數的參數清單,參數之間用逗号(

    ,

    )分割。
  • expression

    :被傳回的表達式,且表達式隻能有一個(注意: lambda 定義不包含 return語句)。
  • lambda 表達式建構的其實是一個函數對象

 内置函數和匿名函數搭配使用的例子:

salaries={
    'egon':300000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2000
}

# 求最大值
res=max(salaries,key=lambda name:salaries[name])  #'egon'
print(res)

# 求最小值
res=min(salaries,key=lambda name:salaries[name])  #'egon'
print(res)      

注:max直接傳回的是人名,需要使用裡面的參數key,通過key指定的函數,将拿到的傳回值當做比較依據。

map()函數:

map(function, iterable, ...)

# map:把一個清單按照我們自定義的映射規則映射成一個新的清單
names=['alex','lxx','wxx','yxx']
# res=map(lambda name: name + "dSB", names)
# print(list(res))      

filter(func, seq) 

該函數的目的是提取出seq中能使func為true的元素序列。func函數是一個布爾函數,filter()函數調用這個函數一次作用于seq中的每一個元素,篩選出符合條件的元素,并以清單的形式傳回。

# names=['alex_sb','lxx_sb','wxx_sb','egon','yxx']
# res=filter(lambda name:name.endswith('sb'),names)
# print(list(res))      

reduce() 

格式: 

reduce (func, seq[, init()]) 

# reduce: 把多個值合并成一個結果
from functools import reduce
l=['a','b','c','d']

res=reduce(lambda x,y:x+y,l,'A')
# 'A','a' => 'Aa'
# 'Aa','b'=>'Aab'
# 'Aab','c'=>'Aabc'
# 'Aabc','d'=>'Aabcd'
print(res)      

焚膏油以繼晷,恒兀兀以窮年。

繼續閱讀