date:2018414+2018415 day1+2
一.python基礎
#coding=utf-8
#注釋
#算數運算 +(加) -(減) *(乘) /(除) //(取整) %(取余)
#比較運算 <(小于) >(大于) ==(等于) !=(不等于)
#邏輯運算 and or not
#查看變量類型 type()
#raw_input 使用raw_input方法去輸入時,變量里面存的數據都是字符串類型
#逗號是不換行打印,把所有的變量強制顯示在一行
#input 只接受0-9 .的輸入(python3還如此?)
二.if、for、while
#if
單分支

雙分支

多分支

#for



#break 結束循環,多個嵌套時break只對最近的一層循環起作用 continue 結束本次循環
#while

三.格式化輸出
# %d:整型 %s:字符串 %f:浮點型

四.字符串
# \ 續行符
# len(x)=x.__len__()
#從前往后數,0開始;從后往前數,-1開始
#獲取多個字符

#字符串拼接

#字符串切割

#字符串查找

#字符串計數+字符串轉大小寫

#字符串遍歷+字符串判斷

#在utf-8模式下,中文占3位 其他編碼占2位
# print x[::-1] 逆序輸出
#字符串替換

#總結 字符串是不能夠增加 不能刪除 不能修改 不能存儲其他類型的數據
五.列表 list [a,d,"ASD"]
#列表具有 增加 刪除 修改 查詢功能
增加:

插入:

刪除:

修改:

#正序、倒序
正序:

倒序:

#獲取索引 index()

六.元祖 tuple ()
#元組不能增加 不能修改 不能刪除
#元祖嵌套

七.字典 dict {}
#字典是映射關系,一一對應
#字典由key和value組成;兩兩一對,逗號隔開
#字典可以存儲任意長度 任意類型
#字典的key必須是不可變類型(元組 數字 字符串),value任意類型
#字典是無序的,沒有下標
#字典所有的操作 都是去操作key
#增加 修改 刪除 取value 遍歷


八.集合
set是一個無序且不重復的元素集合。
set和dict一樣,只是沒有value,相當于dict的key集合,由于dict的key是不重復的,且key是不可變對象因此set也有如下特性:
1. 不重復
2. 元素為不可變對象
創建set:
本身使用 {} 進行創建,如果 {}里面沒有元素,默認表示 dict類型,也就是創建空元素的set集合,不能用{};
如果要創建一個空元素的set,使用 set();
使用{} 里面可以數值型、字符串、元組, 不可以用字典和集合,里面可以放多個元素.
如果使用 set,因為set需要對里面的元素做遍歷循環,做去重操作,做無序排列,所以要求元素必須可遍歷,所以里面可以使用字符串、元組、集合、字典
{}里面不能用 list集合、set里面不能用數值型
九.Tips
可更改對象:list dict
不可更改對象:Int String tuple
可變/不可變類型,指的是:內存id不變,type也不變的前提下,value是否是可變的。
不可變:只要改變變量的值,如果變量的地址發生了改變,則認為是不可變 int,str,float,bool,tuple
可變:變量的內部無論發生怎樣的改變,地址都不發生改變,則認為是允許改變,(可變) list set dict
&&&&&&&&&&&&&&&&&&&&&&&&xxxxx·xx&&&&&&&&&&&&&&&&&&&&&&&&
date:2018422 day4
一.模塊
模塊是函數方法的集合,在python中,一個py文件也是模塊
python模塊有兩種:第一種是安裝python自帶的內置模塊,比如time,os,urllib2 路徑為c:\python27\lib;
第二種是需要安裝的第三方模塊,路徑為c:\python27\lib\site-packages
①.excel讀寫
寫(cmd→【pip install xlwt】)

讀(cmd→【pip install xlrd】)

UTF-8解碼(decode)→Unicode→編碼gbk
Unicode→編碼(decode)gbk
Unicode→編碼(decode)UTF-8
②.讀寫二進制

③.導入
1.導入模塊

2.導入模塊方法

3.導入多個

4.自定義模塊
當自定義模塊想被別人調用時,需在當前目錄下創建一個__init__.py(自定義模塊能被導入時,文件夾上會有一個空心圓出現,如下圖)

不同層級目錄的模塊導入要從包開始

④.系統模塊(如os,time 不需要pip)

taskkill /f /im chrome* >nul 2>nul
/f force強制性 /im imagename 進程名稱 *通配符
>nul 正確執行指令不打印日志 2>nul 不正確執行命令不打印日志
二.異常

************************************************************************************************************************
date:2018421 day3
一.函數定義
def 函數名(首字母大寫)
增加程序可讀性
#直接寫函數名即可調用函數
#參數
①.形參

②.實參

③.缺省參數
如果有默認值,調用的時候沒有傳遞參數,就會使用默認值;如果傳遞了參數,就使用新的數據

#函數定義了幾個參數,調用的時候就要傳遞幾個參數;函數的參數傳遞是有順序的(如果按照賦值表達式來傳遞,就不需要按照順序,如【 Fun(a=1,b=2)/ Fun(b=2,a=1)】)
#函數必須要return,而不是print
#一個函數可能有多個return;一次return多個值,返回的多個值是以元祖形式返回
#變量作用域 作用范圍
①.局部變量
函數內部的變量屬于局部變量,作用范圍是函數內部。

②.全局變量

#高級參數
①.可選參數,定義函數不清楚需要多少參數 返回的是元祖數據

②.**接受賦值表達式,返回字典

二.文件讀寫
1.寫文件
#寫了文件名,那么文件創建在 腳本的同級目錄
#.代表當前目錄,那么文件創建在 腳本的同級目錄
#..代表上級目錄

追加寫入

2.讀文件

#讀取行

#讀取多行,不讀取換行符

#指定讀取某一行

三.文件修改
#首先讀取數據,再修改數據,最后寫入數據

四.二進制文件讀取寫入


獲取當前文件夾所在路徑:
import os
basepath = os.path.dirname(__file__)
拼接路徑:
filepath = os.path.join(basepath,"data.txt",filename)
函數體內部的語句在執行時,一旦執行到return時,函數就執行完畢,并將結果返回
列表生成式:

map()函數接收兩個參數,一個是函數,一個是Iterable,map將傳入的函數依次作用到序列的每個元素,并把結果作為新的Iterator返回。
a=[1,2,3,4,5,6]
list(map(lambda x:x+1,a))
reduce把一個函數作用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算
from functools import reduce
reduce(lambda x,y:x+y,[2,3,4],1)
filter()把傳入的函數依次作用于每個元素,然后根據返回值是True還是False決定保留還是丟棄該元素。da
a=[1,2,3,4,5,6]
list(filter(lambda x:x>2,a))
sorted()函數就可以對list進行排序
關鍵字lambda表示匿名函數,冒號前面的x表示函數參數。
匿名函數有個限制,就是只能有一個表達式,不用寫return,返回值就是該表達式的結果。
lambda x,y:x+y
在面向對象(OOP)的設計模式中,decorator被稱為裝飾模式。OOP的裝飾模式需要通過繼承和組合來實現,而Python除了能支持OOP的decorator外,直接從語法層次支持decorator。Python的decorator可以用函數實現,也可以用類實現。decorator可以增強函數的功能,定義起來雖然有點復雜,但使用起來非常靈活和方便。
Python允許在定義class的時候,定義一個特殊的__slots__變量,來限制該class實例能添加的屬性
把一個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又創建了另一個裝飾器@score.setter,負責把一個setter方法變成屬性賦值
裝飾器(decorator)可以給函數動態加上功能。對于類的方法,裝飾器一樣起作用。Python內置的@property裝飾器就是負責把一個方法變成屬性調用的
五、爬蟲相關
1.爬蟲 WHAT
通過程序模擬瀏覽器請求站點的行為,把站點返回的HTML代碼/JSON數據/二進制數據(圖片/視頻)爬到本地,進而提取自己所需的數據,存放起來使用。
2.爬蟲 WAY
獲取網絡數據的方式:
①.瀏覽器提交請求→下載網頁代碼→解析成網頁
②.模擬瀏覽器發送請求(獲取網頁代碼)→提取有用的數據→存放在數據庫或文件中 [爬蟲所要做的]
發送請求→獲取響應內容→解析內容→保存數據
發送請求
使用http庫向目標站點發起請求,即發送一個Request
Request包含:請求頭、請求體等
Request模塊缺陷:不能執行JS和CSS代碼
獲取響應內容
服務器正常響應,則會得到一個Responce
Response包含:html,json,圖片,視屏等
解析內容
解析html數據:正則表達式(RE模塊),第三方解析庫如Beautifulsoup,pyquery等
解析json數據:json模塊
解析二進制數據:以wb的方式寫入文件
保存數據
數據庫(MySQL,Mongdb,Redis)
3.爬蟲 WHY
Request:用戶將自己的信息通過瀏覽器(socket client)發送給服務器(socket sever)
Response:服務器接收請求,分析用戶發來的請求信息,然后返回數據
瀏覽器在接收到Responce后,會解析其內容來顯示給用戶,而爬蟲程序在模擬瀏覽器發送請求然后接收Response后,是要提取其中有用的數據。
Request{
①.請求方式(常見的):GET/POST
②.請求的URL:url全球統一資源定位符,用來定義互聯網上的一個唯一的資源,如一張圖片、一個文件、一段視頻都可以用url唯一確定
網頁加載過程:加載一個網頁,通常都是先加載document文檔,在解析document文檔的時候,遇到鏈接,則針對超鏈接發起下載圖片的請求
③.請求頭(一般爬蟲都會加上請求頭):
User-agent:請求頭中如果沒有user-agent客戶端配置,服務器可能將你當作一個非法用戶host;
cookies:cookies用來保存登錄信息
請求頭需要注意的參數:
1.Referrer:訪問源哪里來的(一些大型網站,會通過Referrer做防盜鏈策略,所有爬蟲也要注意模擬)
2.User-agent:訪問的瀏覽器(要加上否則會被當成爬蟲程序)
3.cookie:請求頭注意攜帶
④.請求體
如果是get方式,請求體沒有內容(get請求的請求體放在url后面參數中,直接能看到)
如果是post方式,請求體是format data
ps:登錄窗口、文件上傳等,信息都會被附加到請求體內;登錄,輸入錯誤的用戶密碼,然后提交,就可以看到post,正確登錄后頁面通常會跳轉,無法捕捉到post
⑤.響應Response
1.響應狀態碼:
202:代表成功
301:代表跳轉
404:文件不存在
403:無權限訪問
502:服務器錯誤
2.response header
響應頭需要注意的參數:
Set-Cookies:BDSVRTM=0;path=/:可能有多個,是來告訴瀏覽器,把cookie保存下來
Content-Location:服務端響應頭中包含Location返回瀏覽器之后,瀏覽器就會重新訪問另一個頁面
Preview就是網頁源代碼 JSON數據 如網頁html,圖片 二進制數據等
}
4.爬蟲 總結
爬蟲流程:爬取→解析→存儲
爬蟲所需工具:
請求庫:request,selenium
解析庫:正則,beautifulsoup,pyquery
存儲庫:文件,MySQL,Mongdb,Redis
Python數據庫操作:
一.mysql操作
1.數據庫的連接
前置條件:服務器ip 端口號 用戶名 密碼 數據庫名
安裝第三方庫:MySQLdb(運行MySQL-python-1.2.5.win32-py2.7.exe)
2.創建數據庫
a.連接數據庫,創建數據庫庫名

b.創建表,插入數據(插入數據要有commit)

c.查詢數據、修改數據(修改數據也要commit)

d.刪除數據庫 drop database db1
e.以函數形式操作數據庫

二.oracle操作
1.安裝第三方庫cx_oracle
運行msi文件(cx_Oracle-5.1.2-11g.win32-py2.7.msi);然后將instantclient_11_1.rar解壓,將文件夾內的8個以dll為后綴的文件復制粘貼至X:\Python27\Lib\site-packages內
2.操作數據庫(oracle沒有database)

三.Tips
1.各種端口號
mysql:3306
oracle:1521
apache:80
ftp:21
telnet:23
tomcat:8080
ssh:22
什么是“堆”,"棧","堆棧","隊列",它們的區別
堆、棧、隊列之間的區別是?
①堆是在程序運行時,而不是在程序編譯時,申請某個大小的內存空間。即動態分配內存,對其訪問和對一般內存的訪問沒有區別。
②棧就是一個桶,后放進去的先拿出來,它下面本來有的東西要等它出來之后才能出來。(后進先出)
③隊列只能在隊頭做刪除操作,在隊尾做插入操作.而棧只能在棧頂做插入和刪除操作。(先進先出)
函數與方法的區別
函數(function)是可以執行的javascript代碼塊,由javascript程序定義或javascript實現預定義。函數可以帶有實際參數或者形式參數,用于指定這個函數執行計算要使用的一個或多個值,而且還可以返回值,以表示計算的結果。【函數名(參)】
方法(method)是通過對象調用的javascript函數。也就是說,方法也是函數,只是比較特殊的函數。假設有一個函數是fn,一個對象是obj,那么就可以定義一個method【對象名.方法名()】
類中的函數稱為方法。
函數是一段代碼,通過名字來進行調用。它能將一些數據(參數)傳遞進去進行處理,然后返回一些數據(返回值),也可以沒有返回值。
所有傳遞給函數的數據都是顯式傳遞的。
方法也是一段代碼,也通過名字來進行調用,但它跟一個對象相關聯。方法和函數大致上是相同的,但有兩個主要的不同之處:
- 方法中的數據是隱式傳遞的;
- 方法可以操作類內部的數據(請記住,對象是類的實例化–類定義了一個數據類型,而對象是該數據類型的一個實例化)
以上只是簡略的解釋,忽略了作用域之類的問題。
********************************************************************************************************************************************************************
一.面向對象編程
1.定義類,類的繼承
ps:與普通函數相比,在類中定義的函數第一個參數必須是類的本身實例變量self,在調用時,該參數不用傳值

2.__init__方法+私有方法
__init__存在的意義:類中有必須要綁定的屬性,可以使用python的內置方法__init__
__init__方法無需調用,創建類的實例時自動調用
__init__方法和類中函數一樣,第一個參數必須是self,創建類的實例在__init__方法體內,可以將外部傳參傳遞綁定到self,self.name指的是類的變量。需要在實例化的時候傳參。
私有方法(方法前有兩個下劃線,只能類的方法調用,外面對象無法調用);類中私有方法調用,前面要加self

3.if __name__ == '__main__'
通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');在你自己眼中,你是你自己(__name__ == '__main__')。
if __name__ == '__main__'的意思是:當.py文件被自己直接運行時,if __name__ == '__main__'之下的代碼塊將被運行;當.py文件以模塊形式被導入時,if __name__ == '__main__'之下的代碼塊不被運行。
如果模塊是被導入的,代碼塊(__name__ == '__main__')下的代碼不會被運行;
如果模塊是直接運行,代碼塊(__name__ == '__main__')下的代碼會被運行。
參考鏈接:http://blog.konghy.cn/2017/04/24/python-entry-program/
閉包理解為一種特殊的函數,這種函數由兩個函數的嵌套組成,且稱之為外函數和內函數,外函數返回值是內函數的引用,此時就構成了閉包。
[Python小記] 通俗的理解閉包 閉包能幫我們做什么?