做數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)需要用到Python,寫(xiě)下一些基本備忘伪嫁,特別是相對(duì)C++不同的地方
信息源
RUNOOB.COM 上的Python教程
http://www.runoob.com/python/python-intro.html
Python定義和特性
Python 是一個(gè)高層次的結(jié)合了解釋性哮奇、編譯性、互動(dòng)性和面向?qū)ο蟮哪_本語(yǔ)言串述。
- Python 是一種解釋型語(yǔ)言: 這意味著開(kāi)發(fā)過(guò)程中沒(méi)有了編譯這個(gè)環(huán)節(jié)执解。類(lèi)似于PHP和Perl語(yǔ)言。
- Python 是交互式語(yǔ)言: 這意味著纲酗,您可以在一個(gè)Python提示符衰腌,直接互動(dòng)執(zhí)行寫(xiě)你的程序新蟆。
- Python 是面向?qū)ο笳Z(yǔ)言: 這意味著Python支持面向?qū)ο蟮娘L(fēng)格或代碼封裝在對(duì)象的編程技術(shù)。
Python代碼縮進(jìn)結(jié)構(gòu)
沒(méi)有{}作為代碼塊功能右蕊,利用縮進(jìn)結(jié)構(gòu)和代碼塊前一行加個(gè)冒號(hào)(:)區(qū)分代碼塊
普通語(yǔ)句除非同行 無(wú)需 分號(hào)(;
)
Python變量無(wú)需聲明類(lèi)型 直接賦值
標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型 | 描述 |
---|---|
Numbers(數(shù)字) | int float complex復(fù)數(shù) |
String(字符串) |
特殊的索引負(fù)數(shù)索引 |
List(列表) | 中括號(hào) [ ] Python 中使用最頻繁的數(shù)據(jù)類(lèi)型 |
Tuple(元組) | 小括號(hào) ( ) 元組不能二次賦值琼稻,相當(dāng)于只讀列表 |
Dictionary(字典) | 大括號(hào) { } 鍵值對(duì) dict={}; dict[180]="林爍" tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
|
有數(shù)據(jù)類(lèi)型轉(zhuǎn)換內(nèi)置函數(shù)
函數(shù) | 描述 |
---|---|
str(x) | 將對(duì)象 x 轉(zhuǎn)換為字符串 |
dict(d) | 創(chuàng)建一個(gè)字典。d 必須是一個(gè)序列 (key,value)元組尤泽。 |
Python運(yùn)算符
運(yùn)算符 | 描述 | 實(shí)例 |
---|---|---|
** | 冪 - 返回x的y次冪 | a**b 為10的20次方欣簇, 輸出結(jié)果 100000000000000000000 |
// | 取整除 - 返回商的整數(shù)部分(向下取整) | 9//2 輸出結(jié)果 4 , 9.0//2.0 輸出結(jié)果 4.0 |
**= | 冪賦值運(yùn)算符 | c **= a 等效于 c = c ** a |
//= | 取整除賦值運(yùn)算符 | c //= a 等效于 c = c // a |
^ << >> | 按位異或 左移 右移 |
a = 60 # 60 = 0011 1100 c = a >> 2; # 15 = 0000 1111
|
**not ** | 布爾“非”,不是 坯约! |
if not( a and b ): print "5 - 變量 a 和 b 都為 false熊咽,或其中一個(gè)變量為 false" else: print "5 - 變量 a 和 b 都為 true"
|
in not in |
成員運(yùn)算符 | a=10; list=[1,2,3]; if ( a in list ): print:"yes" |
is |
身份運(yùn)算符 is 是判斷兩個(gè)標(biāo)識(shí)符是不是引用自一個(gè)對(duì)象 每一個(gè)變量都有name、id闹丐、value三個(gè)屬性 |
x is y, 類(lèi)似 id(x) == id(y) , 如果引用的是同一個(gè)對(duì)象則返回 True横殴,否則返回 False |
is not | is not 是判斷兩個(gè)標(biāo)識(shí)符是不是引用自不同對(duì)象 | x is not y , 類(lèi)似 id(a) != id(b)卿拴。如果引用的不是同一個(gè)對(duì)象則返回結(jié)果 True衫仑,否則返回 False。 |
Python語(yǔ)句
- Python沒(méi)有switch語(yǔ)句
用elif num==2:
來(lái)實(shí)現(xiàn)其功能 - Python 的 while...else語(yǔ)句
#!/usr/bin/python
count = 0
while count < 5:
print count, " is less than 5"
count = count + 1
else:
print count, " is not less than 5"
- Pthon的 for .. in .. : 可以遍歷任何序列的項(xiàng)目堕花,如一個(gè)列表或者一個(gè)字符串
fruits = ['banana', 'apple', 'mango']
for fruit in fruits: # 第二個(gè)實(shí)例
print '當(dāng)前水果 :', fruit
for index in range(len(fruits)): #通過(guò)序列索引迭代
print '當(dāng)前水果 :', fruits[index]
print "Good bye!"
- Python 的 pass 語(yǔ)句
占位符文狱,湊格式
Python 模塊導(dǎo)入
- cmath
import math
cmath 模塊的函數(shù)跟 math 模塊函數(shù)基本一致,區(qū)別是 cmath 模塊運(yùn)算的是復(fù)數(shù)缘挽,math 模塊運(yùn)算的是數(shù)學(xué)運(yùn)算瞄崇。
>>> import cmath
>>> dir(cmath)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e', 'exp', 'inf', 'infj', 'isclose', 'isfinite', 'isinf', 'isnan', 'log', 'log10', 'nan', 'nanj', 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau']
>>> cmath.sqrt(-1)
1j
>>> cmath.sqrt(9)
(3+0j)
>>> cmath.sin(1)
(0.8414709848078965+0j)
>>> cmath.log10(100)
(2+0j)
>>>
- Python隨機(jī)數(shù)函數(shù)
- 三角函數(shù)
- 數(shù)學(xué)常量 pi e
Python字符串
- "hello world" 'hello world' 單引號(hào)雙引號(hào)都行
- 字符串運(yùn)算符 + * 索引[] 截取 [ : ] in
not in
r"haha\n" % -
字符串格式化
print "My name is %s and weight is %d kg!" % ('Zara', 21)
-
Python 三引號(hào)
實(shí)現(xiàn)WYSIWYG,所見(jiàn)即所得
Python 變量沒(méi)有類(lèi)型
a=[1,2,3]
a="Runoob"
[1,2,3] 是 List 類(lèi)型壕曼,"Runoob" 是 String 類(lèi)型苏研,而變量 a 是沒(méi)有類(lèi)型,她僅僅是一個(gè)對(duì)象的引用(一個(gè)指針)腮郊,可以是 List 類(lèi)型對(duì)象摹蘑,也可以指向 String 類(lèi)型對(duì)象。
Python文件操作
- 打開(kāi)文件
語(yǔ)法:file object = open(file_name [, access_mode = "r" ][, buffering])
完整語(yǔ)法:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
例子:fo=open("foo.txt","a+")
access_mode參數(shù)
默認(rèn)為文本模式轧飞,如果要以二進(jìn)制模式打開(kāi)衅鹿,加上 b,如 ab+,rb+,wb
- 關(guān)閉文件方法
fo.close()是一個(gè)好習(xí)慣
避免遺漏以及繁瑣操作,Python引入了with
語(yǔ)句來(lái)自動(dòng)調(diào)用close()
with open("foo.txt","a") as fo:
fo.write("Don't scoff at others\n")
print (fo.read())
pass
- File對(duì)象的屬性
屬性 | 描述 |
---|---|
file.closed | 文件是否已關(guān)閉 |
file.mode | 文件的打開(kāi)方式 |
file.name | 文件的名稱(chēng) |
- 文件讀寫(xiě)方法
方法(函數(shù)) | 描述 |
---|---|
fo.read([count]) | 讀字節(jié)數(shù)过咬,不帶參數(shù)讀整個(gè)文件塘安,可讀二進(jìn)制文件 |
fo.readline() | 讀一行 |
fo.readlines() | 讀所有行,存入一個(gè)列表中 可用for line in fo.readlines 遍歷 ['Hello, world!\n','I love you \n'] 利用 len(fo.readlines()) 可以獲取文本文件的行數(shù)
|
file.write(str) | - 在文件關(guān)閉前或緩沖區(qū)刷新前援奢,字符串內(nèi)容存儲(chǔ)在緩沖區(qū)中,這時(shí)你在文件中是看不到寫(xiě)入的內(nèi)容的忍捡。 - 如果文件打開(kāi)模式帶 b集漾,那寫(xiě)入文件內(nèi)容時(shí)切黔,str (參數(shù))要用 encode 方法轉(zhuǎn)為 bytes 形式,否則報(bào)錯(cuò):TypeError: a bytes-like object is required, not 'str'具篇。 |
file.writelines(sequence) | 向文件寫(xiě)入字符串列表序列 |
- 文件定位
方法(函數(shù)) | 描述 |
---|---|
file.tell() | 返回文件當(dāng)前讀寫(xiě)指針位置 |
file.seek(offset[, whence]) | 設(shè)置文件當(dāng)前位置 whence 何處默認(rèn)值為0纬霞,從文件開(kāi)頭開(kāi)始算起,whence=1 從當(dāng)前位置算起(即tell()返回值)驱显,2表示從文件末尾算起诗芜。 |
-
file.next() 方法
方法在文件使用迭代器時(shí)會(huì)使用到,在循環(huán)中埃疫,next()方法會(huì)在每次循環(huán)中調(diào)用伏恐,該方法返回文件的下一行,如果到達(dá)結(jié)尾(EOF),則觸發(fā) StopIteration
fo=open("foo.txt","r")
print ("文件名為:",fo.name)
for index in range(5):
line = fo.__next__()
print ("第 %d 行 - %s" % (index,line))
fo.close()
file.flush()
把輸出緩存區(qū)的內(nèi)容flush到文件系統(tǒng)的文件中栓霜,輸出緩沖區(qū)因此被清空(flushed翠桦,沖掉了)file.truncate( [ size = 0 ] )
從文件當(dāng)前位置保留size個(gè)字節(jié)后面的全部truncate(剪)掉Python os 模塊
os 文件/目錄 方法一覽表
import os
os.rename(current_file_name, new_file_name)
os.remove(file_name)
- 目錄操作
os.getcwd()
os.mkdir("newdir")
os.chdir("newdir")
os.rmdir("newdir")
Python 內(nèi)置函數(shù)(常用)
- 數(shù)學(xué)相關(guān)
Input | Output |
---|---|
abs(-1) | 1 |
max([1,2,3]) min([1,2,3]) |
3 1 |
序列長(zhǎng)度 len('abc')、len([1,2,3])胳蛮、len((1,2,3)) | 3 |
返回(商,余數(shù))的tupple的除法 divmod(10,3) |
(3,1) |
pow(9,1/2) | 3.0 |
四舍五入round(1.6) | 2 |
- range()
輸出0~9
for index in range(10):
print (index)
pass
打印單字符不換行
x='linshuo'
for i in range(len(x)):
print(x[i],end=" ")
____
l i n s h u o
range常用法
>>>range(10) # 從 0 開(kāi)始到 10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11) # 從 1 開(kāi)始到 11
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5) # 步長(zhǎng)為 5
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3) # 步長(zhǎng)為 3
[0, 3, 6, 9]
>>> range(0, -10, -1) # 負(fù)數(shù)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]
Python 面向?qū)ο?類(lèi)
對(duì)象包括兩個(gè)數(shù)據(jù)成員销凑,類(lèi)變量和實(shí)例變量
-
類(lèi)變量:類(lèi)變量在整個(gè)實(shí)例化的對(duì)象中是公用的。類(lèi)變量定義在類(lèi)中且在函數(shù)體之外仅炊。類(lèi)變量通常不作為實(shí)例變量使用斗幼。
書(shū)寫(xiě)方式類(lèi)名.類(lèi)變量名 Teacher.teacherCount
- 實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類(lèi)抚垄。
- 類(lèi)的定義
class Employee:
'所有員工的基類(lèi)'
empCount=0 #類(lèi)變量
def __init__(self,name,salary):
self.name=name
self.salary=salary
Employee.empCount += 1
def __del__(self):
class_name = self.__class__.__name__
print (class_name,"銷(xiāo)毀")
def displayCount(self):
print ("Total Employee: %d" % Employee.empCount)
def displayEmployee(self):
print ("Name: %s ,Salary: %d " % (self.name,self.salary))
self 代表類(lèi)的實(shí)例蜕窿,而非類(lèi)
類(lèi)的方法與普通的函數(shù)只有一個(gè)特別的區(qū)別——它們必須有一個(gè)額外的第一個(gè)參數(shù)名稱(chēng), 按照慣例它的名稱(chēng)是 self。
(self 不是 python 關(guān)鍵字督勺,我們把他換成 runoob 也是可以正常執(zhí)行的)
類(lèi)的私有屬性與私有方法
__secretAttr = 0
兩個(gè)下劃線(xiàn)開(kāi)頭渠羞,聲明該屬性為私有,不能在類(lèi)的外部被使用或直接訪(fǎng)問(wèn)智哀。在類(lèi)內(nèi)部的方法中使用時(shí) self.__private_attrs
__private_method
兩個(gè)下劃線(xiàn)開(kāi)頭次询,聲明該方法為私有方法,不能在類(lèi)的外部調(diào)用瓷叫。在類(lèi)的內(nèi)部調(diào)用 self.__private_methods
實(shí)例化的類(lèi)訪(fǎng)問(wèn)私有屬性的方式
foo._Foo__.__privateAttr
Python不允許實(shí)例化的類(lèi)訪(fǎng)問(wèn)私有數(shù)據(jù)屯吊,但你可以使用object._className__attrName( 對(duì)象名._類(lèi)名__私有屬性名 )
訪(fǎng)問(wèn)屬性類(lèi)方法
實(shí)例方法、類(lèi)方法與靜態(tài)方法的區(qū)別
@classmethod
def displayCount(cls):
print ("Total Employee: %d" % Employee.empCount)
print ("Total Teachers: %d" % Teacher.teacherCount)
___
調(diào)用時(shí)用 Teacher.displayCount()
對(duì)象的屬性操作
getattr(obj, name[, default]) : 訪(fǎng)問(wèn)對(duì)象的屬性摹菠。
hasattr(obj,name) : 檢查是否存在一個(gè)屬性盒卸。
setattr(obj,name,value) : 設(shè)置一個(gè)屬性。如果屬性不存在次氨,會(huì)創(chuàng)建一個(gè)新屬性蔽介。
delattr(obj, name) : 刪除屬性。
hasattr(emp1,'age') ; setattr(emp1,'age',11) ; getattr(emp1,'age') ; delattr(emp1,'age')
或者
emp1.age = 7 # 添加一個(gè) 'age' 屬性
emp1.age = 8 # 修改 'age' 屬性
del emp1.age # 刪除 'age' 屬性類(lèi)的內(nèi)置屬性
Employee.__doc__ # '所有員工的基類(lèi)'
Employee.__name__ # 'Employee'
Employee.__module__ # __main__
Employee.__bases__ # ()
Employee.__dict__
- 類(lèi)的繼承
class SubClassName (ParentClass1[, ParentClass2, ...]):
pass
class Teacher(Employee):
'這個(gè)是老師類(lèi),職員的派生類(lèi)'
teacherCount = 0 #類(lèi)變量
def __init__(self,name,salary):
Employee.__init__(self,name,salary)
Teacher.teacherCount += 1
@classmethod #類(lèi)方法
def displayCount(cls):
print ("Total Employee: %d" % Employee.empCount)
print ("Total Teachers: %d" % Teacher.teacherCount)
def displayEmployee(self):#方法override
print("Teacher- Name: %s ,Salary: %d " % (self.name,self.salary))
def __del__(self):
Teacher.teacherCount -= 1
print ("Teacher類(lèi)的析構(gòu)方法")
Employee.__del__(self)
-
子類(lèi)構(gòu)造方法和父類(lèi)構(gòu)造方法的重寫(xiě)
如果在子類(lèi)中需要父類(lèi)的構(gòu)造方法就需要顯示的調(diào)用父類(lèi)的構(gòu)造方法虹蓄,或者不重寫(xiě)父類(lèi)的構(gòu)造方法犀呼。
子類(lèi)不重寫(xiě)__init__
,實(shí)例化子類(lèi)時(shí)薇组,會(huì)自動(dòng)調(diào)用父類(lèi)定義的__init__
外臂。
如果重寫(xiě)了__init__
,實(shí)例化子類(lèi)時(shí)律胀,就不會(huì)調(diào)用父類(lèi)定義的__init__
宋光。
重寫(xiě)__init__
,如果要用到父類(lèi)的構(gòu)造方法,可以用父類(lèi)名稱(chēng).__init__(self,arg1,arg2,...)
的方式調(diào)用 - 運(yùn)算符重載
class Vector:
def __init__(self,a,b):
self.a=a
self.b=b
#obj->str方法重載
def __str__(self):
return '我重載了__str__函數(shù)\n Vector (%d,%d)' % (self.a,self.b)
# 運(yùn)算符重載
def __add__(self,other):
return Vector(self.a+other.a,self.b+other.b)
v1 = Vector(1,1)
v2=Vector(2,3)
print (v1+v2)
-----------------------------
輸出:
我重載了__str__函數(shù)
Vector (3,4)
- 單下劃線(xiàn)炭菌、雙下劃線(xiàn)罪佳、頭尾雙下劃線(xiàn)說(shuō)明
格式 | 說(shuō)明 |
---|---|
__foo__ |
特殊方法、系統(tǒng)定義的名字娃兽,如 __init__() __del__() __str__() __add__()
|
_foo |
protected variables 保護(hù)類(lèi)型 只允許本身與子類(lèi)進(jìn)行訪(fǎng)問(wèn)菇民,不能用于from module import *
|
__foo |
private variables 私有類(lèi)型 只允許這個(gè)類(lèi)本身進(jìn)行訪(fǎng)問(wèn) |