一、高級特性
1、切片
取list或tuple中的一部分元素,可使用切片運算子(:),
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] #取前三個元素 >>>L[0:3] ['Michael', 'Sarah', 'Tracy'] #索引號第1個是0,可省略 >>>L[:3] ['Michael', 'Sarah', 'Tracy'] #取第1-3個字元素 >>>L[1:4] ['Sarah', 'Tracy', 'Bob']
也可以倒數取:
L = list(range(100)) >>> L [0, 1, 2, 3, ..., 99] #取最后10個數 >>>L[-10:] [90, 91, 92, 93, 94, 95, 96, 97, 98, 99] #取倒數第二個數 >>>L[-2,-1] [98]
也可以每N個取出元素:
>>> L[:10:2] #前10個數,每兩個取一個 [0, 2, 4, 6, 8] >>> L[::5] #所有數,每5個取一個 [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
2、迭代
可用for回圈遍歷集合物件中所有元素的行為,稱為迭代(Iteration),
可迭代的物件:list、tuple、dict、set、字串等,
d = {'a': 1, 'b': 2, 'c': 3}
for key in d: #dict默認只迭代key值
print (key)
for value in d.values() #迭代value值
print (value)
for k,v in d.items() #迭代key和value值
print (k, v)
需要將list實作迭代時出現索引下標,可用enumerate函式:
for i, value in enumerate(['A', 'B', 'C']): print(i, value)
判斷一個物件是否可迭代,可用collections模塊的Iterable型別判斷:
>>>from collections import Iterable >>>isinstance('abc', Iterable) #判斷字串是否可迭代 True >>>isinstance(123, Iterable) #判斷整數是否可迭代 False
3、串列生成式
list(range(1,11))可以生成[1,2,3,....10]的list,
但如果要生成[1*1, 2*2, 3*3, ..., 10 * 10]這樣的串列,除了用回圈演算法,還可以用串列生成式:[x * x for x in range(1,10)]
串列生成式的格式:[運算式 for x in range()]
for回圈后加上if判斷,可篩選for回圈的結果:
>>> [x * x for x in range(1, 11) if x % 2 == 0] #僅出偶數的平方 [4, 16, 36, 64, 100]
也可以使用兩層回圈:
>>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
使用兩個變數來生成List:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
if...else可以用在運算式當中:
[x if x % 2 == 0 else -x for x in range(1, 11)] [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
上面的運算式,相當 ?:三目運算子:x= x % 2 ?: -x,python貌似沒有三目運算子,這里僅供理解用, 4、生成器generator 如果使用串列生成式,比如:
>>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
則list會直接生成出來,但是如果生成十萬百萬個這樣的元素,則會消耗掉記憶體,可使用生成器來代替上面的串列生成式:
>>> g = (x * x for x in range(10))
將串列生成式兩邊的[]括號改成()括號即可創建了一個generator, 也可以寫成函式的方法:
def g(): for x in range(10): yield x*x return 'end'
函式體內包含yield則此函式為generator,
要呼叫該generator時,首先要生成一個generator物件,然后再用next()函式不斷獲得下一個yield的回傳值,
o = g() while True: try: x = next(o) print('g:', x) except StopIteration as e: #使用StopIteration捕獲return值 print('Generator return value:', e.value) break
也可以用for回圈來不斷獲得回傳值,這時不需要next()函式,也不會產生StopIntertaion錯誤,
for n in g(): print(n)
5、迭代器
可以for回圈的資料型別有兩種:
一種是集合型別,歸屬于Interable物件,比如:list、tuple、dict、set、str等;
一種是generator生成器,這類歸屬于Iterator物件,
把list、dict、str等Iterable變成Iterator可以使用iter()函式:
>>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
二、函式式編程
函式式編程的重要特點:函式本身可以作為引數傳入到另一個函式,還允許回傳一個函式,
Python對函式式編程提供部分支持,
(一)函式作為引數傳入:
1、map和reduce函式
map():接收兩個引數,一個是函式(此函式只有一個引數),一個是Iterable,作用是將傳入的函式作用到傳入序列的每一個元素上,
def f(x): return x * x; r=map(f, [1,2,3,4,5,6,7,8,9]) list(r) #結果:[1,4,9,16,25,36,49,64,81]
reduce():把一個函式作用在一個序列上,該函式必須有兩個引數,接收序列中前兩個的累積結果和下一個元素,效果如下:
reduce(f, [x1,x2,x3,x4]) = f(f(f(x1,x2), x3), x4)
from functools import reduce def add(x, y): return x + y reduce(add, [1, 3, 5, 7, 9]) #序列累積求和:25
2、filter函式
通過傳入的函式,對序列進行過濾,傳入的函式回傳值必須是布林值,
#去掉偶數,只保留奇數 def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # 結果: [1, 5, 9, 15]
3、sorted排序函式
sorted()函式有三個引數,第一引數是要接受排序的序列,第二引數可選,用于在排序前對序列作用于每個元素,第三引數可選,默認為false,設為true則表示反向排序,
sorted(['bob', 'about', 'Zoo', 'Credit']) #按ascii碼排序: ['Credit', 'Zoo', 'about', 'bob'] sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) #對每個元素變小寫,再按ascii碼排序:['about', 'bob', 'Credit', 'Zoo'] sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) #每個元素變小寫,再按ascii碼反向排序:['Zoo', 'Credit', 'bob', 'about']
(二)函式作為回傳值:
函式可作為回傳值回傳,此時回傳的函式體并不會立即執行,
#回傳求和函式 def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum f = lazy_sum(1, 3, 5, 7, 9) #呼叫函式f時,才會計算求和結果 f() #結果:25
注意:回傳的函式體不要參考區域會變化的變數,否則會引起預想不到的結果,
(三)匿名函式
py的匿名函式寫法:
lambda <引數>:回傳函式體結果,
匿名函式的限制:只有有一個運算式,不用寫return,回傳值就是該運算式的結果,
f = lambda x:x*x #實際上就是: def f(x): return x*x
(四)裝飾器decorator
當需要增強函式功能時,可使用裝飾器decorator,
比如,在呼叫now()函式前顯示自動列印函式日志,
def log(func): def wrapper(*args, **kw): print('呼叫 %s():' % func.__name__) return func(*args, **kw) return wrapper #要使用上面的封裝器,則可這樣使用: @log def now(): print('2020-04-14') #呼叫now() now() #顯示: #call now(): #2020-04-14
(五)偏函式Partial function
偏函式的作用:把一個函式的某些函式用某個值固定,并回傳一個新函式,可以簡單呼叫,
舉例:
int()函式可把字串轉換為整數,傳入字串時,會默認按十進制轉換,此函式的第二個引數為默認值 10,可以用偏函式固定成其他值:
import functools int2 = functools.partial(int, base=2) int2('1000000') #結果:64
三、模塊
模塊作用:將代碼利用模塊分隔開,利于維護;
python:一個.py檔案為一個模板,一個檔案夾為一個package(檔案夾下必須包含__init__.py),
模塊名起名規范:遵循py變數命名規范,不要使用中文和特殊字符,不要與系統模塊名沖突;
示例:
mycompany
├─ web
│ ├─ __init__.py
│ ├─ utils.py
│ └─ www.py
├─ __init__.py
├─ abc.py
└─ utils.py
檔案www.py的模板名為:mycompany.web.www,utils.py模塊名分別有:mycompany.web.utils和mycompany.utils,
參考模塊:
import 模塊名
python在指定的路徑下搜索對應的.py檔案來加載模塊,包括:當前目錄、所有已安裝的內置模塊和第三模塊目錄,這些目錄存放在sys模塊下的path變數中,
>>> import sys >>> sys.path ['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', ..., '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']
添加模塊搜索目錄的方法:
(1)運行時添加:
>>> import sys >>> sys.path.append('/Users/michael/my_py_scripts')
這種方法在運行時添加,運行完后失效,
(2)設定PYTHONPATH環境變數
這種方式與PATH環境變數類似,
模塊檔案的撰寫規范:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- ' a test module ' __author__ = 'Michael Liao' import sys def test(): args = sys.argv if len(args)==1: print('Hello, world!') elif len(args)==2: print('Hello, %s!' % args[1]) else: print('Too many arguments!') if __name__=='__main__': test()
前兩行為標準注釋;
第4行是一個模塊的檔案注釋,任何模塊代碼第一個字串都被視為模塊的檔案注釋;
第6行__author__變數是作者名,
而后的代碼就是真正的代碼部分,
最后兩行,__name__變數是特殊變數,當模塊在命令列模式運行時此變數為__main__字串,常用于運行測驗,
另外說明一點:
模塊中的函式和變數都是公開的,無公有或私有化一說,只是我們自己可以規定_或__開頭的應該業內口頭規定為私有變數或函式,但實際上仍可以被外部呼叫,
安裝第三方模塊:
在安裝了python后,可以使用pip(3版本為pip3)命令安裝第三方庫,
第三方庫一般都在pypi.python.org 中注冊,
安裝常用模塊,可以使用Anaconda更方便,下載地址:https://www.anaconda.com/download/
有關介紹說明:https://www.jianshu.com/p/62f155eb6ac5
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/158901.html
標籤:Python
上一篇:集成學習之隨機森林
