[TOC]
高階函數(shù)
匿名函數(shù)
lambda x:x+y #return x+y
定義標(biāo)志/參數(shù)(形式類似函數(shù)傳參)/跟表達(dá)式(返回)
匿名函數(shù)存在的情況:
執(zhí)行完這行之后,如果沒有被賦值給別的變量
其引用計(jì)數(shù)為0,就會(huì)被內(nèi)存垃圾回收機(jī)制清空
from functoolimport reduce
- sorted 倒序并且生成新列表/sort是僅僅倒序
- map 映射
- reduce 合成累加
- filter 過濾
內(nèi)置函數(shù)
build_in function
- all 所有為真,返回真
- any 一個(gè)為真,返回真
- chr 數(shù)字轉(zhuǎn)換成ascii碼
- ord 相反
- complex 復(fù)數(shù)/.imag/.real
- dir 查看對(duì)象可使用的方法
- divmod 查看商和余數(shù)
- enumerate 得到一個(gè)迭代器
- pow 取模運(yùn)算
- zip 將兩個(gè)可迭代元素結(jié)合,返回元組結(jié)果
- round 四舍五入,為0.5結(jié)尾時(shí)返回與其最接近的偶數(shù)
函數(shù)式編程
遞歸
age(5) = age(4)+2 #n = 5 age(n) = age(n-1)+2
age(4) = age(3)+2 #n = 4 age(n) = age(n-1)+2
age(3) = age(2)+2 #n = 3 age(n) = age(n-1)+2
age(2) = age(1)+2 #n = 2 age(n) = age(n-1)+2
age(1) = 10 #n = 1 age(n) = 10
遞歸的表示:
def age(n):
if n ==1:
return 10
else:
return age(n) = age(n-1)+2
棧(stack):吃了吐
sys.setrecursionlimit()設(shè)置棧深度
sys.getrecursionlimit()查看棧深度
特點(diǎn):
- 進(jìn)入一層棧就需要保存一次結(jié)果,所以深度在物理?xiàng)l件上有限制
- 但在python的理論層面可以很大
- 效率不高,遞歸的層次過多會(huì)導(dǎo)致棧溢出
必須要有一個(gè)明確的結(jié)束條件
遞歸每進(jìn)入下一層,問題的規(guī)模就減少一點(diǎn)
應(yīng)用場景:
遞歸使用在“不知道問題需要循環(huán)多少次”
理論上,遞歸能做的事循環(huán)都能完成
有序列表date = [....]
二分法查找:
date = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
def two_find(num,list):
print(list)
# 首先需要判斷傳入list的長度,因?yàn)楫?dāng)list長度為3的時(shí)候
# 二分以后的list長度會(huì)變成1,從而直接進(jìn)入else進(jìn)行判斷
# 這時(shí)候的list[0]不一定是想要取得值
if len(list)>1:
n = len(list) // 2
if num>list[n]:
list = list[n:]
two_find(num,list)
elif num<list[n]:
list = list[:n]
two_find(num,list)
elif num == list[n]:
print('find')
else:
if list[0]==num:
print('y')
else:
print('n')
two_find(17,date)
遍歷的方法尋找數(shù)字,對(duì)內(nèi)存占用較大,不推薦
def search(n):
if date[n-1]==19:
print('True')
else:
return search(n+1)
函數(shù)式編程
- 不修改外部傳參的狀態(tài)
- 函數(shù)式編程會(huì)很精簡,可讀性不強(qiáng)
面向?qū)ο蟮某绦蛟O(shè)計(jì)
類:
- 實(shí)例化
- 引用名字(類名.變量名,類名.函數(shù)名)
實(shí)例:
引用名字(實(shí)例名.類變量,實(shí)例名.綁定方法,實(shí)例.實(shí)力自己的變量名)
類中的變量,可以進(jìn)行增刪改查
方法中的變量,也是可以增刪改查
OOP
class Student:
country = 'china'
def __init__(self,ID,NAME,SEX,PROVINCE):
self.id = ID
self.name = NAME
self.sex = SEX
self.province = PROVINCE
def search_score(self):
print('tell score')
def study(self):
print('study')
s1 = Student('9527','scott','male','zhejiang')
Student.__init__(s1,'9527','scott','mail','zhejiang')
s1.search_score()
在python3中,所有類都是新式類
class A:pass
在python2中,新式類:
class B(object):pass
class C(B):pass
print(B.__bases__)
print(C.__bases__)
繼承自object的都是新式類
類的用法:
實(shí)例化
s1 = Student('9527','scott','male','zhejiang')
Student.__init__(s1,'9527','scott','mail','zhejiang')
屬性引用:特征(變量)和技能(函數(shù)、綁定方法)
print(s1.name)
print(s1.study())
類的命名空間:
Student.x = 1
print(Student.x)
x = 10000
print(Student.x)
類的增刪改查
刪:del Student.x
- 對(duì)象也稱為實(shí)例
- 對(duì)象的屬性:對(duì)象本身只有特征(變量)
- 對(duì)象的用法:屬性引用
類的名稱空間/對(duì)象的名稱空間
查看類的名稱空間
print(Student.dict)
查看對(duì)象的名稱空間
print(s1.dict)
print(s1.id)
比較對(duì)象s1的方法,和類當(dāng)中的方法的id號(hào)可以發(fā)現(xiàn)
這兩個(gè)東西,并不是同一個(gè)。
print(s1.study,id(s1.study))
print(Student.study,id(Student.study))
綁定方法的核心在于“綁定”,為已綁定一個(gè)確定的對(duì)象