三元表示式 遞迴 匿名函式

2022-08-18 18:27:13 字數 4260 閱讀 5827

三元表示式

符合python語法的表達方式(形式,公式)

元素,三個元素

總體就是,由三個元素組成的表示式

其目的是為了簡化書寫,既然是簡化就必然有侷限性,

三元表示式只能幫你簡化僅有兩個分支if判斷

res=true if age>=18 else false,並且這個判斷無論成立與否都必須返回乙個值

a=9b=12

res=a if a>b else b

print(res)

遞迴

遞迴指的是遞迴呼叫,簡單地就是乙個函式在執行過程中又直接或者間接的呼叫該函式本身

遞迴時可能出現一下錯誤:

recursionerror: maximum recursion depth exceeded while calling a python object

在呼叫函式時超出了最大遞迴深度

python為了防止遞迴太多導致記憶體溢位,所以給遞迴呼叫加上了深度(次數)限制,預設為1000

遞迴呼叫本質上就是在迴圈執行**,與普通迴圈不同的是,函式呼叫會產生一系列記憶體開銷,所以就會導致記憶體溢位

如此一來,則表示所有遞迴能幹的事情迴圈也能幹

在使用遞迴時要注意:

1.一定要在某個條件滿足時結束迴圈呼叫

2.迴圈呼叫的次數不能超過系統的限制

3.每一次執行函式都應該使問題的規模減少,否則就是無用的迴圈

4.python中沒有尾遞迴優化機制(使得遞迴呼叫時占用的開銷更小)

在使用遞迴完成在遍歷所有元素(不知道有幾層),可以發現遞迴使用起來**量更少結構更加清新

什麼時候該使用遞迴

你不知道到底迴圈幾次

二分查詢法

分半查詢

拆分查詢

原理:先將整體分為兩半

然後去除中間的元素,與你要查詢的目標進行比對,如果你要找的比中間值大請走右邊

如果你要找的比中間值小請走左邊

1.先得到乙個中間值,比較是不是你要找到值如果是直接返回

2.如果不是 那就把列表拆為兩半,進行比較

3.如果你要找的比中間值大找右邊

如果你要找的比中間值小找左邊

li = [1, 3, 5, 7, 11, 13, 17, 19, 23, 29]

def search(li, tage):

if not li:

return false

i = len(li) // 2

if li[i] == tage:

return true

if len(li) == 1:

return false

left = li[:i]

right = li[i:]

if tage > len(li[i]):

return search(right, tage)

else:

return search(left, tage)

print(search(li, 13))

匿名函式

匿名指的就是沒有名字

其罪明細的特點就是

有名字的值可以多次使用,多次訪問

而沒有名字的值,只能臨時使用一次,用完就沒了

匿名函式與有名函式的區別

關鍵字為lambda

引數不需要加括號,並且支援所有型別的引數

命名空間與作用域關係完全相同

函式體中不能寫return,會自動將執行結果返回

函式體只能有乙個表示式而且不能執行

匿名函式什麼時候用

當你的函式體只有一行表示式時並且僅使用一次時就可以作為匿名函式

更多的是與內建函式聯用(max,min,sorterd,map,filter,reduce)

當預設的比較方式無法滿足需求時就可以通過傳入同乙個函式來決定用什麼比較

函式可以是匿名也可以是有名的,很明顯這時候匿名函式更好

max,min

salary =

print(max(salary,key=lambda k:salary[k] ))

print(min(salary,key=lambda k:salary[k]))

def get_value(k):

return salary[k]

#使用有名函式完成取值

print(max(salary, key=get_value))

sorterd#排序

print(sorted(li))#從小到大排序

print(sorted(li,reverse=true))#從大到小排序

print(sorted(salary,key=lambda k:salary[k]))#得到工資從小到大排序

print(sorted(salary,key=lambda k:salary[k],reverse=true))#得到工資從大到小排序

print(res[-1],salary[res[-1]])最高工資的人即錢

map對映,用於從乙個可迭代物件中取出所有資料,進行一系列操作後再放回新列表中

def f(v):

print(v)

return v+100

res=map(f,li)

print(list(res))#li中每乙個加100

res=map(lambda v:v+100,li)

print(list(res))#li中每乙個加100

li1=['a','b','c']

res=map(lambda v:v+'.txt',li1)

print(list(res))#li1中每乙個的字尾加上.txt

filter過濾,用於從一堆資料中過濾一些不滿足條件的資料,

提供乙個函式,要函式的返回值是bool型別true表示要保留,false就過濾掉

res=filter(lambda v:true if v>18 else false,li)

print(list(res))#過濾掉li中大於18的數

names = ["agon","bgon","cgon","blex","jerry"]

res=filter(lambda v:true if not v.endswith('gon') else false,names)

print(list(res))#從names中過濾掉名字結尾為gon的

reduce合併,是把列表中的資料進行合併 每次會傳給你兩個值 n和n+1個

# 從functools中拿到乙個reduce

from functools import reduce

li2=['a','b','c','d']

def f(a,b):

return a+b

res=reduce(f,li2)

print(res)#讓li2中的元素合併

res=reduce(lambda a,b:a+b ,li2)

print(res)#讓li2中的元素合併

abs()絕對值

all()如果所有元素都為true結果為true

any()任意乙個元素為true結果為true

ascii()將引數轉為asc如果asc不支援這個就轉為uncode

bin()轉為2進製

oct()轉為8進製

hex()轉為16進製制

bool()轉為布林型別

bytearray()

bytes()

callable()是否可呼叫

chr()數字轉asc字元

ord()按照asc把字元轉數字

compile()把乙個物件轉為指定的位元組碼

complex()轉為複數形式

dir()檢視該物件中所有可用的名字函式名和變數

divmod()得到商和餘數

enumerate()列舉把乙個值與數字進行對應

eval()執行乙個字串型別的表示式

可用幫你把乙個字串的內容轉換為pyton資料型別 但是這並不是它的本職工作

foozenset()凍結乙個集合

globals()檢視全域性命名空間中的所有名字

lobals()檢視區域性命名空間中的所有名字在全域性位置調該函式 看到也是全域性

hash()可用來校驗乙個資料是不是可變的

可hash是不可變的

不可hash是可變的

持續更新中

函式遞迴 三元表示式 匿名函式 函式內建方法

遞迴函式 定義 任何函式在呼叫自己的情況下 就叫遞迴 函式在呼叫的時候可以直接性或者間接性的呼叫自己.但是他不能無限制的呼叫下去 也不應該無限制的呼叫下去 遞迴分為兩個階段,遞推和 回溯 回溯就像while迴圈一樣一直重複下去 但是每一次重複 都要建立在上一次迴圈的基礎上 減小目標難度 遞迴的回溯 ...

三元表示式,遞迴,匿名函式,常用的內建函式

三元表示式 符合python語法的表達方式 形式,公式 稱之為表示式 三元 三個元素 總體 由三個元素組成的表示式 其目的是為了簡化書寫,既然是簡化就必然有侷限性 三元表示式只能幫你簡化僅有兩個分支的if判斷,並且這個判斷無論成立與否都必須返回乙個值 遞迴指的是遞迴呼叫,簡單的說就是乙個函式在執行過...

三元表示式 生成式 匿名函式

def max2 x,y if x y return x else return y res max2 10,20 x 10 y 20 res x if x y else y print res res ok if false else no print res 1 列表生成式 l for i in...