python學習筆記01
遞歸
遞歸的經典例子
1) 斐波那契數列, F(1)=1,F(2)=1, F(3)=2,F(n)=F(n-1)+F(n-2)
def fib(n):
if n < 1:
raise ValueError
elif (n == 1) or (n == 2):
return 1
else:
return fib(n - 1) + fib(n - 2)
print(fib(1)) #1
print(fib(2)) #1
print(fib(3)) #2
print(fib(4)) #3
print(fib(5)) #5
print(fib(6)) #8
叠代器與可叠代對象
1、定義:
可叠代對象:大部分容器如 list,truples,str,sets是可叠代對象,但是他們不是叠代器。可叠代對象實現了__iter__方法,返回一個叠代器,或者使用iter(“可叠代對象”)返回一個叠代器。
叠代器:叠代器提供了一種不依賴索引取值的方式,這樣可以遍歷沒有索引的可叠代對象,比如字典、集合、文件等等,加載這一個元素至內存中隨後釋放,相比之下更節省內存,但是我們沒有辦法獲取叠代器的長度,而且只能往後依次取值。遍歷的方法使用next(“叠代器”)
2、代碼示例
d={‘a‘:1,‘b‘:2,‘c‘:3}
s = d.__iter__() #s是一個叠代器
p = iter(“可叠代對象”) #p是一個叠代器
#遍歷叠代器
next(p)
next(p)
3、for循環
在for循環中,Python將自動調用工廠函數iter()獲得叠代器,自動調用next()獲取元素,還完成了檢查StopIteration異常的工作。如下
a = (1, 2, 3, 4)
for key in a:
print key
首先python對關鍵字in後的對象調用iter函數叠代器,然後調用叠代器的next方法獲得元素,直到拋出StopIteration異常。
4、自定義一個叠代器:
class Fibs:
def __init__(self): #初始化
self.a = 0
self.b = 1
def __next__(self): #獲取下一個條目
self.a, self.b = self.b, self.a + self.b
return self.a
def __iter__(self): #返回叠代器
return self
fibs = Fibs() #產生一個對象
for f in fibs: #叠代
if f > 5:
break
print(f)
>>>8
next(fibs)
>>>13
next(fibs)
>>>21
文件目錄操作
os.path.join(‘/Users/EDC‘, ‘Pictures‘)
# 這裏你得到的是一個字符串,代表了新的文件夾是這個位置:/Users/EDC/Pictures/
# 自己也可以拼起來,但是怕不同操作系統下的區分符問題,最好是用OS接口
# 但是你還並沒有創建任何的文件
# 需要用mkdir創建:
os.mkdir(‘/Users/EDC/Pictures/‘)
# 同理,刪除一個文件夾
os.rmdir(‘/Users/EDC/Pictures/‘)
#切分路徑
os.path.split(‘/Users/EDC/Pictures/AJiao.txt‘)
# (‘/Users/EDC/Pictures/‘, ‘AJiao.txt‘)
#切分路徑
os.path.splitext(‘/Users/EDC/Pictures/AJiao.txt‘)
# (‘/Users/EDC/Pictures/AJiao‘, ‘.txt‘)
#復制文件
import shutil
shutil.copyfile(‘/path/to/file‘, ‘/path/to/other/file‘)
匿名函數
1、概念介紹
python 使用 lambda 來創建匿名函數。
lambda只是一個表達式,函數體比def簡單很多。
lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
lambda函數擁有自己的命名空間,且不能訪問自有參數列表之外或全局命名空間裏的參數。
2、語法
語法:lambda [arg1 [,arg2,.....argn]]: expression
lambda x, y : x * y
3、Reduce
傳給reduce中的函數func() (必須是一個二元操作函數)先對集合中的第1,2個數據進行操作,得到的結果再與第三個數據用func()函數運算,最後得到一個結果。
from functools import reduce
l = [1,2,3,4,5]
print(reduce(lambda x,y: x+y, l))
# 這裏代表著,把l中的值,一個個放進lamda的x,y中
# 如果你給出一個初始值,可以放在l後面
print(reduce(lambda x,y: x+y, l, 10))
# 這樣,x開始的時候被賦值為10,然後依次把l中的值放進來
4、Map
格式:map(func, seq1[, seq2...] )
Python函數式編程中的map()函數是將func作用於seq中的每一個元素,並用一個列表給出返回值。
l = [1,2,3]
new_list = list(map(lambda i: i+1, l))
print(new_list)
>>> [2,3,4]
# 我們也可以把兩個數組搞成一個單獨的數組
l = [1,2,3]
l2 = [4,5,6]
new_list = list(map(lambda x,y: x+y, l, l2))
print(new_list)
>>>[5, 7, 9]
5、Filter
和map()類似,filter()也接收一個函數和一個序列。和map()不同的時,filter()把傳入的函數依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素。
l = [100, 20, 24, 50, 110]
new = list(filter(lambda x: x<50, l))
print(new)
>>> [20, 24]
數組List的操作
a = [1,2,3,4,5,6,7]
b = [11,22,33]
a[ : 1] = b
則a = [11,22,33,2,3,4,5,6,7]
python學習筆記01