控制循環與函數
寫在最前:
Python的厲害之處就不多說了,在機器學習的技能圖譜中,Python屬於地基層面。為此,多花些時間,把Python基礎打牢固,是為將來的職業路徑中走得更遠更穩。
該Python基礎筆記是七月學員clownfish對機器學習集訓營一期中Python部分的整理,共分為四篇,1. Python環境配置及基礎數據類型,2. 控制循環,與函數,3.面向對象,4.內置模塊(os,文件,正則等)與第三方庫(requests等)的應用
控制語句control statement
程序執行流程叫控制流,在Python中有三種程序基本控制流:
1. 順序結構
2. 條件分支 if, if elif
3. 循環結構 for while
第一種順序結構比較好理解在此跳過,主要筆記後兩種。
關於邏輯值(Boolean)
True與False分別代表邏輯值的真與假,或是與否。他們的數據類型都是Boolean
x=7; x<10#通過比較符得出邏輯
控制語句control statement
if else
注意冒號與換行,縮進這些python特有的語法格式
X=77
if x>10:
print(x is more than 10)
else:
print(x is less than 10)
if elif elif else
x=9
if x>10:
print(x is more than 10)
elif x<10:
print(x is less than 10)
else:
print(x is equal 10)
直接用True值來代替判斷語句,方便我們理解流程式控制制
循環loops
for loop
range
循環中配合使用range,可以非常方便地進行迭代。
在python2中,當使用range()時,直接返回的是一個列表對象。
而在python3中,當使用range()時,返回的則是一個range對象,以便節省系統資源。
當我們使用range時,可以看到range是按參數生成一個可以迭代的對象(python3)。
range函數的三個參數為,起始點,結束點,步長。這點和切片訪問列表一樣。
藉助range,我們可以用訪問下標的方式來循環訪問我們的列表對象了。
for i in range(len(names)):
print(names[i])
也可以在訪問時,順便打出序號
枚舉器
有沒有更快速的方法能對列表對象中的每個元素前都加上編號怎麼辦呢? 使用枚舉器。
for no,item in enumerate(names):
print(no,:,item)
其實enumerate(names)返回的是一tuple,
列表表達式list comprehension
列表推導式也叫列表解析式(list comprehension),列表表達式的是指從一個列表中生成一個新的列表。
這種可以非常簡潔的方式來快速生成滿足特定需求的列表,代碼可讀性強,Python的內部實現對列表推導式做了大量優化,可以保證很快的運行速度。
[http://julyedu.com -> +item.upper() for item in names]
迭代器
Python中可以直接作用於for循環的對象統稱為可迭代對象:Iterable
# 可以使用isinstance()判斷一個對象是否是Iterable對象:
from collections import Iterable
isinstance([],Iterable)True
生成器
生成器是不但可以被用作於for循環,還可以被next()函數不斷調用並返回下一個值的對象,直到最後跑出StopIteration錯誤表示無法繼續返回下一個值了。
注意:Python3的generator沒next方法,要使用__next__()方法向下循環
迭代器與生成器的區別
*可以被next()函數調用並不斷返回下一個值的對象成為迭代器:Iterator
*可以使用isinstance()判斷一個對象是否是Iterator對象:
生成器都是Iterator對象,但是list、dict、str雖然是Iterable,卻不是Iterator
while loop
while是指定條件進行循環。
n=0
while n<5:
print(n)
n+=1
注意:
一定要加上最後一句n+=1,否則n的值一直小於5,這樣就陷入死循環了。
break and continue打斷循環的關鍵字
對於一個一直在執行的循環(或死循環),可以在滿足某些條件後,使用break或continue其結束或跳轉的條件。
continue跳過本次循環,返回循環起點
for letter in Python: # continue實例
if letter == h: continue
print (當前字母 :, letter)#最終列印結果會缺少h,因為跳過了h
break結束一個循環
假設while條件為真,則執行代碼塊會被執行。因為條件永遠是真,程序就會一直被執行下行,進入死循環,怎麼解決這個問題呢?使用break語句來結束循環。
x=0
while True: # break實例
print (x)
x+=1
if x>5:break
[擴展]:比寫循環更方便的map,filter,reduce序列操作函數
Python內置了這三個函數可以在寫循環代碼的情況下,對一個可迭代對象內每個元素進行依次操作。
filter
filter函數會對指定序列執行過濾操作。
filter(function or None, sequence) -> list, tuple, or string
function是一個謂詞函數,接受一個參數,返回布爾值True或False。
filter函數會對序列參數sequence中的每個元素調用function函數,最後返回的結果包含調用結果為True的元素。
reduce
reduce函數,reduce函數會對參數序列中元素進行累積。
reduce(function, sequence[, initial]) -> value
function參數是一個有兩個參數的函數,reduce依次從sequence中取一個元素,和上一次調用function的結果做參數再次調用function。
說明:在Python 3里,reduce()函數已經被從全局名字空間移除了,它現在被放置在fucntools模塊
from functools import reduce
l1=list(range(100))
reduce(lambda x,y:x+y,l1)
map
map函數會根據提供的函數對指定序列做映射。
map(function, sequence[, sequence, ...]) -> list
通過定義可以看到,這個函數的第一個參數是一個函數,剩下的參數是一個或多個序列,返回值是一個集合。
function可以理解為是一個一對一或多對一函數,map的作用是以參數序列中的每一個元素調用function函數,返回包含每次function函數返回值的list。
函數
函數是什麼?
函數的本質:是功能的封裝平滑,提升編程效率與代碼可讀性。
創建函數
使用def關鍵字創建函數,和上面循環一時注意冒號及縮進這種python獨有的語法。
lambda匿名函數
在上面創建一個函數要使用def關鍵字,但有些場合會使用一些簡單的函數來完成任務,這時就可以使用lambda,也就是匿名函數了。比如在列表表達式中
l1=[lambda x:x**2 for x in range(12)]
f=lambda x,y:x+y
f(3,4)
與不定長參數
* 該位置接受任意多個非關鍵字(non-keyword)參數,在函數中將其轉化為元組(1,2,3,4)
**該位置接受任意多個關鍵字(keyword)參數,在函數**位置上轉化為詞典 [key:value, key:value ]
函數的本質是一個盒子,接收傳入的參數(也可以什麼都不用接收),內部完成特定的功能後返回一些值(也可以什麼都不用返回)。這些概念比較簡單,用一個例子把之前的點都匯總起來
from functools import reduce
def test(*args):
print (reduce(lambda x,y:x+y,args))
test(7,5,222);test(5,5,6,3,2,1,5,9,15)
函數式編程Functional Programming
"函數式編程"是一種"編程範式"(programming paradigm),是如何編寫程序的方法論。是一種如何把運算過程盡量寫成一系列嵌套的函數調用的思想。
函數是"第一等公民(first class),是指函數與其他數據類型一樣,處於平等地位,可以賦值給其他變數,也可以作為參數,傳入另一個函數,或者作為別的函數的返回值。
我們下邊會一一記錄。
函數名變數
那麼函數名變數是什麼呢?函數名變數就是指向函數的變數!
例如:對於abs()這個函數,完全可以把函數名abs看成變數,它指向一個可以計算絕對值的函數!
這裡的funvar就是函數名變數,()括弧代號對函數的調用。
高階函數:
能接收函數做參數的函數就是高階函數。
要實現高階函數,要實現以下兩點:
1)、變數可以指向函數 2)、一個函數可以接受另一個函數作為參數
函數式編程就是指這種函數可以像變數一樣使用的高度抽象的編程範式。
閉包與裝飾器將在Python高級筆記中介紹。
本篇結束。
練習
使用循環控制語句,實現一個斐波那契數組
推薦閱讀:
※【七夕特輯のML初體驗】Passive Aggressive,探索因子模型的新姿勢
※專欄開張!無痛的機器學習
※Word2vec的詞聚類結果與LDA的主題詞聚類結果,有什麼不同?
※尋找CNN的弱點
※機器學習——字典學習/稀疏編碼學習筆記