1. 程式人生 > >python學習筆記01

python學習筆記01

命名空間 break 擁有 copy fun print 定義 示例 切分

遞歸

遞歸的經典例子

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