三元表達式
符合python語法的表達方式(形式,公式)
元素,三個元素
整體就是,由三個元素組成的表達式
其目的是爲了簡化書寫,既然是簡化就必然有侷限性,
三元表達式只能幫你簡化僅有兩個分支if判斷
res=True if age>=18 else False,而且這個判斷不管成立與否都必須返回一個值
a=9
b=12
res=a if a>b else b
print(res)python
遞歸
遞歸指的是遞歸調用,簡單地就是一個函數在執行過程當中又直接或者間接的調用該函數自己
遞歸時可能出現一下錯誤:
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)spa
print(search(li, 13))code
匿名函數
匿名指的就是沒有名字
其罪明細的特色就是
有名字的值能夠屢次使用,屢次訪問
而沒有名字的值,只能臨時使用一次,用完就沒了
匿名函數與有名函數的區別
關鍵字爲lambda
參數不須要加括號,而且支持全部類型的參數
名稱空間與做用域關係徹底相同
函數體中不能寫return,會自動將執行結果返回
函數體只能有一個表達式並且不能執行
匿名函數何時用
當你的函數體只有一行表達式時而且僅使用一次時就能夠做爲匿名函數
更多的是與內置函數聯用(max,min,sorterd,map,filter,reduce)
當默認的比較方式沒法知足需求時就能夠經過傳入同一個函數來決定用什麼比較
函數能夠是匿名也能夠是有名的,很明顯這時候匿名函數更好
max,min
salary = {
"egon":250,
"zgon":500,
"bgon":20000,
}
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中每個加100ci
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是可變的
持續更新中