1、Python初識(IDE環境及基本語法,Spyder快捷方式)
Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言,沒有編譯過程,可移植,可嵌入,可擴展。python
IDE
1.檢查Python版本:算法
運行應用程序Terminal(win+R),輸入cmd,進入界面後輸入python,查看是否安裝,未安裝前往https://www.python.org/網址安裝對應版本python。express
2.IDE集成環境編程
(1)Anaconda spyder官網下載連接:https://www.anaconda.com/download/json
百度雲盤: Anaconda2 python2.7 連接:https://pan.baidu.com/s/1UNLhUlpW04y0AuZlglyQJA 密碼:axd1數據結構
(2)Pycharm:下載連接https://www.jetbrains.com/pycharm/download/ 在安裝完PyCharm後,還須要再安裝python,不然在PyCharm的project interpreter中就沒有可選項。Python (Windows環境配置),以下閉包
a.在環境變量path中添加Python目錄:"個人電腦"右鍵點擊「屬性」,進入「高級系統設置」點擊「環境變量」,找到PATH,添加「;%python安裝路徑」,保存便可。app
b.在命令提示框中(cmd) : 輸入path=%path%;C:\Python,按下"Enter"。 注意:C:\Python 是Python的安裝目錄。dom
中文編碼
首行代碼敲入# -*- coding: UTF-8 -*-或者#coding=utf-8才能夠正確顯示中文python2.7
spyder快捷方式:
- python -V 查看快捷方式
- Ctrl + 1 註釋/反註釋
- Ctrl + 4/5 塊註釋/塊反註釋
- Ctrl + L 跳轉到行號
- F12 斷點設置
- F5 運行
- Ctrl + Y 反撤銷
- Ctrl + Z 反撤銷
- SHIFT + F12 條件斷點
- Ctrl + Shift + W 關閉全部
- Ctrl +空格鍵 代碼完成
- Tab/Shift + Tab 代碼縮進/反縮進
- Ctrl +I 顯示幫助
- python script.py 調用python腳本#!/usr/bin/python 被忽略,等同於註釋。
- ./script.py 調用python腳本#!/usr/bin/python指定解釋器的路徑。
- reset 後得Once deleted... 輸入y回車便可清除IPython變量。
- reset in/out 刪除全部以前輸入輸入輸出結果記錄,同上操做。
- Ctrl+L 清空IPython控制檯的記錄便可。
- clear 清空控制檯
代碼格式
- 縮進:建議縮進適應四個空格,提升可讀性。在程序中混合使用製表符和空格均可能致使難以解決的問題,可將文件中全部製表符轉換爲空格。注意:python對代碼縮進要求十分嚴格,是一門很是優秀的語言,要配置好IDE的縮進。
- 行長: 建議每行不超過79字符。
- 空行:空行將程序的不一樣部分分開,組織程序文件。
2、Python變量和簡單數據類型、列表、元組、字典、集合
變量
- 命名:不能包含空格,只能由字母、數字(不可做爲開頭)和下劃線組成。
- 不要將Python關鍵字和函數名用做變量名,即不要使用Python保留字用於特殊用途的單詞。
- 要簡短且具備描述性,慎用小寫字母l(像數字1)和大寫字母O(像數字0)。
數據類型
- 整數執行加(+)減(-)乘(*)除(/)運算。注意:在Python2中,整數除法的結果只包含整數部分,小數部分直接被刪除(沒有四捨五入,直接刪除),要避免這種狀況,務必確保至少有一個操做數爲浮點數,這樣結果也將爲浮點數。
- 字符串:用引號括起來的一系列字符。(引號可單可雙,單不可含撇號)
- str.title() 以首字母大寫的方式顯示每一個單詞。
- str.upper() 所有大寫
- str.lower() 所有小寫
- str() 轉字符串函數,避免類型錯誤
- + 合併字符串
- str.rstrip() 刪除字符串末尾空白
- str.lstrip() 刪除字符串開頭空白
- str.strip() 刪除字符串兩端空白
列表
由一系列按特定順序排列的元素組成,用方括號([])來表示列表,並用逗號來分割其中的元素。
- 訪問:列表名[下標],第一個列表元素下標爲0,最後一個列表元素爲-1。
- 修改:列表名[下標] = xxx。
- append(xxx),將元素xxx添加到列表末尾,而不影響列表中的其餘全部元素。
- insert(num,xxx),將元素xxx插入列表第num個位置,剩下元素右移。
- del(num),刪除第num個位置的元素,沒法再使用。
- pop(),刪除列表末尾的元素,並讓你可以接着使用它,也可使用pop()來刪除列表中任何位置的元素,只須要在括號中指定要刪除的元素的索引便可。
- remove(),能夠從列表中刪除元素,也可接着使用它的值。
- sort(),對列表進行永久性排序,若需按與字母順序相反的順序排列列表元素,向sort()方法傳遞參數reverse=True。
- reverse(),反轉列表元素的排列順序,可再次調用後恢復到原來的排列順序。
- len(),列表的長度。
- for循環對列表的每一個元素訪問或者執行相同的操做。
- list(),方法range()生成一系列數字,建立數字列表時,可以使用函數list()將range()結果直接轉換爲列表,若將range()做爲函數list()的參數,輸出將爲一個數字列表。使用range()可指定步長,eg,range(2,11,2)從2開始數,而後不斷地加2,直到達到或超過終值(11)。
- 列表統計函數:min(),max(),sum()。
- 對列表進行切片使用,可指定要使用的第一個元素的索引和最後一個元素的索引加1,負數索引可返回離列表末尾相應距離的元素。
元組
(,,,,)不能修改的值,不可變的列表成爲元組,不能修改元組的元素,能夠給存儲元祖的變量賦值。任意無符號的對象,以逗號隔開,默認爲元組。
- 元組[下標],訪問。下標1開始,-1取最後。
- 元組+元組,鏈接操做。
- del 元組,刪除整個元組,沒法刪除元組元素。
- len(),元組元素個數。還有min(),max()方法。
- 元組*n,將元組複製n次。
- for x in 元組:,迭代。
- cmp(),比較兩個元組元素。
- tuple(),將列表轉爲元組。
字典
字典式一系列鍵-值對{key:value,key:value,……},每一個鍵都與一個值相關,使用鍵來訪問與值相關聯的值,與鍵相關聯的值能夠是數字、字符串、列表乃至字典。
- 字典名['鍵名'],進行訪問。
- 字典名['鍵名'] = xxx,添加或修改鍵對值。
- 字典名 = {},建立控字典。
- del 字典名['鍵對值'],刪除字典中鍵對值。
- for 鍵,值 in 字典.items():,返回一個鍵-值對列表。即使遍歷字典時,鍵-值對的返回順序也與存儲順序不一樣。Python不關心鍵-值對的存儲順序,而只跟蹤鍵和值之間的關係。
- keys(),此方法並非只能用於遍歷,它返回一個列表,其中包含字典中的全部鍵。按順序遍歷字典中的全部鍵:對方法keys()的結果調用函數sorted()。
- values(),遍歷字典中的全部值,返回一個值列表,而不包含任何鍵。經過對包含重複元素的列表調用set(),可以讓Python找到列表中獨一無二的元素,並使用這些元素來建立一個集合。
- 嵌套:將一系列字典存儲在列表中,或將列表做爲值存儲在字典中。字典列表型:多個字典放在一個列表;在字典中存儲列表:在字典中將一個鍵關聯到多個值時 ,均可以在字典中嵌套一個列表;在字典中存儲字典:嵌套的字典結構但願都相同時。
集合
{...,...,...},一個無序的不重複元素序列,建立一個空集合必須用 set() 而不是 { },由於 { } 是用來建立一個空字典。
- add()/update(),添加元素,參數能夠是列表,元組,字典等,自動合併重複。
- remove(xxx),將xxx元素從集合中移除。
- len(),集合元素個數。
- clear(),清除集合。
- xxx in 集合,判斷xxx是否存在於集合中。
- union(),兩個集合的並集。
- pop(),隨機移除集合元素。
- intersection()/intersection_update(),集合交集。
- difference(),集合差集。
- difference——update(),移除集合中的元素,該元素在指定的集合也存在。
3、if語句、for和while循環(python無switch語句)
if語句
if語句的核心都是一個值爲True或False的表達式。若是條件測試的值爲True,Python就執行緊跟在if語句後面的代碼;若是爲False,Python就忽略這些代碼。
- ==,檢查值是否相等(檢查是否相等時不考慮大小寫)。
- !=,檢查是否不相等。
- <、>、≥、≤,比較數字。
- and,檢查多個條件。
- in,檢查特定值是否(不)包含在列表中。
- 布爾表達式(True/False)。
- 簡單:一個測試一個操做。
- #if-else語句:else指定條件測試未經過時要執行的操做。
- #if-elif-else結構:依次檢查每一個條件測試,指導遇到經過了的條件測試,執行緊跟的代碼,並跳過餘下的測試。
- #使用多個elif代碼塊也可省略else代碼塊。
- is 用來判斷是否指向相同。
for循環
對列表中的每一個元素都執行相同的操做,編寫是,對於用於存儲列表中每一個值得臨時變量,可指定任何名稱。
while循環
使用while sth循環進行數數或者條件測試,不斷運行直到條件不知足或者終止。
- 標誌:定義一個變量,用於判斷整個程序是否處於活動狀態。
- 使用break退出循環。
- 在循環中使用continue:要返回到循環開頭,並根據條件測試結果決定是否繼續執行循環。
- 避免無限循環:Ctrl+C,也可關閉顯示程序輸出的終端窗口。
- pass 不作任何事情,通常用作佔位語句。
python沒有switch語句,通常用if...elif...else語句替換
4、函數、異常處理
函數
帶名字的代碼塊。def name:定義一個函數name,定義以冒號結尾。
- 三引號括起的文檔字符串,Python用它來生成有關程序中函數的文檔。
- 匿名函數lambda [arg1[,arg2,...,argn]]:expression,不能訪問自有參數列表以外或全局命名空間裏的參數。
- 全局變量(定義在函數外,能夠在整個程序範圍內訪問)與局部變量(定義在函數內部的變量,只能在其被聲明的函數內部訪問)。調用函數時,全部在函數內聲明的變量名稱都將被加入到做用域中。
- 向函數傳遞信息:
- 實參——調用函數是傳遞給函數的信息。
- 形參——函數完成其工做所需的一項信息。
- 位置實參——要求實參的順序與形參的順序相同(由於調用函數時,Python必須將函數調用中的每一個實參都關聯到函數定義中的一個形參)。
- 關鍵字實參——傳遞給函數的名稱——值對,在實參中將名稱和值關聯起來了,無需考慮函數調用中的實參順序,清楚地指明瞭函數調用中各個值得用途。
- 默認值——給每一個形參指定默認值,在調用函數中給形參提供了實參時,Python將使用指定的實參值;不然,將使用形參的默認值。
- return [表達式]——返回值語句將值(任何類型的值,包括列表和字典等較複雜的數據結構。)返回到調用函數的代碼行。
- 傳遞列表時,若要禁止函數修改列表,可函數傳遞列表的副本而不是原件,list_name[:]。
- 傳遞任意數量的實參:函數使用一個形參*toppings,無論調用語句提供了多少實參,這個形參都將它們通通收入囊中。
- import——可將函數存儲在模塊的獨立文件中,用import導入到主程序,import容許在當前運行的程序文件中使用模塊中的代碼,使用as sth給模塊指定別名。也可以使用from sth import sth,導入模塊中的特定函數,使用as sth給函數指定別名。from sth import *導入模塊中的全部函數。全部的import語句都應放在文件開頭,除非在文件開頭使用了註釋來描述整個程序。
異常
異常:即一個事件的發生,該事件將會在程序執行過程當中發生,影響程序的正常執行。
- 處理方式:try...except...else,try後的語句執行時發生異常,跳回try並執行第一個匹配該異常的except子句,異常處理完畢後經過整個try語句,執行else語句後的語句,finally語句是不論有無異常都將執行。
- 觸發異常:raise[Exception[,args[,traceback]]],也能夠觸發用戶自定義的異常。
5、用戶輸入、文件
用戶輸入:
- input(「sth」),獲取用戶輸入字符串,即讓程序暫停運行,等待用戶輸入一些文本,獲取後,能夠將其存儲在一個變量中,以方便使用。可將該提示存儲在一個變量中,再將該變量傳遞給函數input()。
- 函數int()可將用戶輸入的數字字符串轉換爲數值表示。
- 求模運算符(%)將兩個數相除並返回餘數,不會指出一個數是另外一個數的多少倍,而只指出餘數是多少。
- raw_input([prompt]) ,函數從標準輸入讀取一個行,並返回一個字符串(去掉結尾的換行符)。
- print(''),標準輸出打印。
文件
讀
- open(),讀取整個文件數據,返回一個表示文件的對象。函數接受一個參數:要打開的文件的名稱。Python在當前執行的文件所在的目錄中查找指定的文件。指定一個變量將這個對象存儲。
- 關鍵字with,在不須要訪問文件後將其關閉。也能夠調用open()和close()來打開和關閉文件。但這樣作時,若是程序存在bug,致使close()語句未執行,文件將不會關閉。未妥善地關閉文件可能會致使數據丟失或受損。若是在程序中過早地調用close(),會發現須要使用文件時它已關閉。因此讓Python去肯定:只管打開文件,並在須要時使用它,Python自會在合適的時候自動將其關閉。
- 方法read(),讀取這個文件的所有內容,並將其做爲一個長長的字符串存儲,read()到達文件末尾時返回一個空字符串,而這個空字符串顯示出來時就是一個空行。要刪除末尾的空行,可以使用rstrip()。
- 在Windows系統中,在文件路徑中使用反斜槓(\)而不是斜槓(/),將絕對文件路徑(將文件在計算機中的準確位置)。爲確保在Windows中萬無一失,應以原始字符串的方式指定路徑,即在開頭的單引號前加上r。
- 要以每次一行的方式讀取文件,可對文件對象使用for循環。消除空白行使用rstrip()。
- 建立一個包含文件各行內容的列表:readlines()從文件中讀取每一行,並將其存儲在一個列表中。
- 讀取文本文件時將其中的全部文本都解讀爲字符串。若是讀取的是數字,並要將其做爲數值使用,就必須使用函數int()將其轉換爲整數,或使用float()將其轉換爲浮點數。
寫
- 調用open()時提供了兩個實參,第一個實參也是要打開的文件的名稱;第二個實參(’w’)告訴Python,要以寫入模式打開這個文件。打開文件時,可指定讀取模式(’r’)、寫入模式(’w’)、附加模式(’a’)——給文件添加內容而不是覆蓋原有的內容和讀取和寫入文件的模式(’r+’),若省略了模式實參,Python將以默認的只讀模式打開文件。
- Python只能將字符串寫入文本文件,要將數值數據存儲到文本文件中,必須先使用函數str()將其轉換爲字符串格式。
- 寫入多行,函數write()不會在你寫入的文本末尾添加換行符,要讓每一個字符串都單獨佔一行,須要在write()語句中包含換行符。
- split()以空格爲分隔符將字符串分拆成多個部分,並將這些部分都存儲到一個列表中。
- 使用模塊json來存儲數據,可以將簡單的Python數據結構轉儲到文件中,並在程序再次運行時加載該文件中的數據。JSON(JavaScript Object Notation),json.dump接受兩個實參:要存儲的數據以及可用於存儲數據的文件對象。使用json.load()加載存儲在xxx.json中,並將其存儲到變量xxx中。
- 將代碼劃分爲一系列完成具體工做的函數,稱爲重構。
- 建立、刪除、更改目錄:os.mkdir("newdir")——在當前目錄下建立新的目錄;os.chdir("newdir")——改變當前目錄;od.getcwd()獲取當前目錄;os.rmdir("dirname")——刪除目錄,刪除以前,該目錄下的全部內容應該被刪除。
6、面向對象
類:用來描述具備相同的屬性和方法的對象的集合。
對象:經過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
基本概念
- 實例化:根據類來建立對象,可按需求根據類建立任意數量的實例。
- 在Python中,類——首字母大寫的駝峯命名法且定義括號爲控,實例——小寫的名稱,在類中可用一個空行來分隔方法,在模塊中,使用兩個空行來分隔類。
- 類中的函數稱爲方法;_init_()是一個特殊的方法,每當你根據類建立新實例時,Python都會自動運行,在這個方法的定義中,形參self必不可少,還必須位於其餘形參的前面,由於調用這個方法來建立實例時,將自動傳入實參self。每一個與類相關聯的方法調用都自動傳遞實參self,它是一個指向實例自己的引用,讓實例可以訪問類中的屬性和方法。
- 訪問屬性與調用方法:句點表示法。eg.dog.name,dog.sit()
- 類中的每一個屬性都必須有初始值,哪怕這個值是0或字符串,但設置默認值時,在方法_init_()內指定這種初始值是可行的,若是對某個屬性這樣作了,就無需包含爲它提供初始值的形參。
- 內置屬性:__dict__(類的屬性,有類的數據屬性組成),__doc__(類的文檔字符串),__name__(類名),__module__(類定義所在的模塊),__bases__(類的全部父類構成元素,包含一個由全部父類組成的元素)。
- 銷燬(垃圾回收):對象一旦被建立就建立一個引用計數器,這個引用計數變爲0時,適當時候被回收。__del__析構函數在對象銷燬時調用。
垃圾回收
1.小整數[-5,256)對象池將整數對象提早建立好,位於該區間的對象不會被回收。但定義2個相同的字符串時,引用計數爲0,觸發垃圾回收。
2.每個大整數,均建立一個對象。
3.單個單詞,不可修改,默認開啓intern機制,共用對象,引用計數爲0,則銷燬。
GC垃圾回收——發現並處理不可達的垃圾對象
垃圾回收 = 垃圾檢查+垃圾回收
import gc後is_enable() = True啓動自動垃圾回收。
經常使用函數:
1.gc.set_debug(flags)設置gc的debug日誌,通常設置爲gc.DEBUG_LEAK
2.gc.collect(generation)顯式進行垃圾回收,能夠輸入參數,0表明只檢查第一代的對象,1表明檢查一,二代的對象,2表明檢查一,二,三代的對象,若是不傳參數,執行一個full collection,也就是等於傳2,返回不可達對象的數目
3.gc.gwt_threshold()獲取的gc模塊中自動執行垃圾回收的頻率。
4.gc.set_threshold(threshold0[,threshold1,[,threshold2]])設置自動執行垃圾回收頻率。
5.gc.get_count()獲取當前自動執行垃圾回收的計數器,返回一個長度爲3的列表。
引用計數機制(因爲解決不了循環引用問題)爲主,分代收集兩種機制爲輔的策略。
分代:對象在建立的時候,放在一代中,若是在一次一代的垃圾檢查中,該對象存活下來,放到第二代,同理,二代進入三代。
1.引用計數+1:對象被建立;對象被引用;對象被看成參數傳入到一個函數中;對象做爲一個元素,存儲在容器中。
2.引用計數-1:對象的別名被顯示銷燬;對象的別名被賦予新的對象;一個對象離開它的做用域;對象所在的容器被銷燬,或從容器中刪除對象。
3.查看一個對象的引用計數:sys.getrefcount(xxx)
- 重寫:父類方法的功能不知足需求,可在子類重寫父類的方法。__init__(self[,args])、__del__(self)、__repr__(self)、__str__(self)、__cmp__(self,x)。
- __foo__: 定義的是特殊方法,通常是系統定義名字 ,相似 __init__() 之類的。_foo: 以單下劃線開頭的表示的是 protected 類型的變量,即保護類型只能容許其自己與子類進行訪問,不能用於 from module import *。__foo: 雙下劃線的表示的是私有類型(private)的變量, 只能是容許這個類自己進行訪問了。
- 類屬性與方法:
***xx:公有變量
***_x:單前置下劃線,私有化屬性或方法,from somemodule import *禁止導入,類對象和子類能夠訪問。
***__xx:雙前置下劃線,避免與子類中的屬性命名衝突,沒法在外部直接訪問。
***__xx__:雙先後下劃線,用戶名字空間的魔法對象或屬性。
***xx_:單後置下劃線,用於避免與Python關鍵詞的衝突。
***經過 name mangling(名字重整)如:_Class__object機制就能夠訪問private了。
屬性property
1.私有屬性添加getter和setter方法
2.使用property升級setter和getter方法,至關於把方法進行了封裝,開發者在對屬性設置數據的時候更方便。
3.直接在第一個get類方法前面@property,再在set方法前面@get類方法名的屬性setter方法。
- 傳遞對象:可更改(mutable):list、dict和不可更改(immutable):strings、tuples、numbers。
- 繼承
- 一個類繼承另外一個類時,它將自動得到另外一個類的全部屬性和方法;原有的類稱爲父類,而新類稱爲子類。子類繼承了其父類的全部屬性和方法,同時還能夠定義本身的屬性和方法。不容許實例化的類訪問私有數據,但可使用 object._className__attrName( 對象名._類名__私有屬性名 )訪問屬性。
- 建立子類的實例時,Python首先須要完成的任務是給父類的全部屬性賦值,子類的_init_()須要父類施以援手。
- 定義子類時,必須在括號內指定父類的名稱。
- super()是一個特殊函數,幫助Python將父類和子類關聯起來,父類也稱爲超類(superclass)。
- 讓一個類繼承另外一個類後,可添加區分子類和父類所需的新屬性和方法。
- 可將類的一部分做爲一個獨立的類提取出來,將大型類拆分紅多個協同工做的小類。
核心編程
1.迭代器:迭代訪問集合元素並記住遍歷位置的對象,只前不退。
1)可迭代的對象(可直接做用於for循環的對象)
一類是集合數據類型:int、tuple、dict、set、str等。
二是generator,包括生成器和帶yield的generator function。
2)使用collections模塊的Iterable對象放在isinstance(對象,Iterable)中,判斷一個對象是不是Iterator對象。
3)迭代器:能夠被next()函數調用並不斷返回下一個值的對象。
4)iter()函數,生成器都是Iterator對向,但list、dict、str可迭代,但不是Iterator。用iter()函數能夠將其變爲Iterator。
2.閉包:有權訪問另外一個函數做用域中變量的函數。
1)函數引用
2)函數內部在定義一個函數,而且這個函數用到了外邊函數的變量,那麼將這個函數以及用到的一些變量稱爲閉包。
3.裝飾器:自己是一個函數,目的是在不改變待裝飾函數代碼的狀況下,增長額外的功能,裝飾新的返回值是已裝飾的函數對象。
1)@函數名錶示,必定會執行裝飾,不是等到調用時才裝飾。裝飾先裝飾最裏層即代碼最後的裝飾器先裝,調用則相反。
2)有參數的函數裝飾要注意裝飾器內部定義的方法必須帶有一樣數量的形參。多參使用(*args, **kwargs)接收。
3)有返回值的函數裝飾要在裝飾函數調用中用接收值返回。
4)帶有參數的裝飾器,可以在運行時有不一樣的功能。
4.python動態添加屬性和方法
1)使用types.MethodType(method, type)綁定後賦值給屬性再調用該屬性方法便可。
2)靜態方法或者類方法直接賦值給對象屬性便可調用無需綁定。
3)對屬性採用__slots__定義,實例只能對這些屬性進行賦值,不能對其餘屬性賦值。但只對當前類實例起做用,對集成的子類是不起做用的。
5.生成器:一邊循環一邊計算的機制——generator
1)生成方式:將列表生成方式的[]改成()。
2)在函數中用yield語句能夠將函數變爲生成器。將該函數變爲生成器對象後進行迭代取出。
3)可使用next(xx)方法或者xx.__next__()獲取值,只要yield語句不從新調用其值就不會改變。
4)xx.send(some)發送值做爲yield的值(可是必須是生成器已經啓動的狀況下)。
6.類裝飾器:把類當成裝飾器放在函數前進行裝飾。裝飾時調用類的__init__方法,裝飾完的函數被調用時調用類的__call__方法。
元類(魔法,較難用到):
1.class建立的類也是一個對象,能夠在運行時動態的建立它們,就像其餘任何對象同樣。
2.type(「類名」,由父類名稱組成的元組(針對繼承的狀況,能夠爲空),包含屬性的字典(名稱和值))
3.使用xxx.__class__能夠查看建立者。
4.定義類時添加__metaclass__屬性,就選定了系統建立該類的元類。
7.經常使用的標準庫builtins 內建函數默認加載os 操做系統接口sys Python自身的運行環境functools 經常使用的工具json 編碼和解碼JSON對象logging 記錄日誌和調試multiprocessing 多進程threading 多進程copy 拷貝time 時間datetime 時間和日期calendar 日曆hashlib 加密算法random 生成隨機數re 字符串正則匹配socket 標準的BSD Socket APIshutil 文件和目錄管理glob 基於文件通配符搜索