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:浮點型

 

Python之基本數據類型與數據結構

四.字符串

# \ 續行符

# 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 遍歷

 

 

 

八.集合

資料:Python中集合(set)類型詳解

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多個值,返回的多個值是以元祖形式返回

 

#變量作用域 作用范圍

①.局部變量

函數內部的變量屬于局部變量,作用范圍是函數內部。

 

②.全局變量

 

#高級參數

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

 

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

 Python中的*args和**kwargs

 

二.文件讀寫

 1.寫文件

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

追加寫入

 

 

2.讀文件

 

#讀取行

 

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

 

 

#指定讀取某一行

 

三.文件修改

#首先讀取數據,再修改數據,最后寫入數據

 

四.二進制文件讀取寫入

 

獲取當前文件夾所在路徑:

import  os

basepath = os.path.dirname(__file__)

拼接路徑:

filepath = os.path.join(basepath,"data.txt",filename)

 

函數體內部的語句在執行時,一旦執行到return時,函數就執行完畢,并將結果返回

列表生成式:

 

map()函數接收兩個參數,一個是函數,一個是Iterablemap將傳入的函數依次作用到序列的每個元素,并把結果作為新的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. 方法中的數據是隱式傳遞的;
  2. 方法可以操作類內部的數據(請記住,對象是類的實例化–類定義了一個數據類型,而對象是該數據類型的一個實例化)

以上只是簡略的解釋,忽略了作用域之類的問題。

 

Python raise用法(超級詳細,看了無師自通)

 

********************************************************************************************************************************************************************

一.面向對象編程

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小記] 通俗的理解閉包 閉包能幫我們做什么?

Python裝飾器的通俗理解