01html
Pythonpython
簡介git
Python 是一種高層次的結合瞭解釋性、編譯性、互動性和麪向對象的腳本語言。Python 由 Guido van Rossum 於 1989 年末在荷蘭國家數學和計算機科學研究所發明,第一個公開發行版發行於 1991 年。算法
''' 做者:韭白 源自: https://www.cnblogs.com/shockerli/p/python-study-note.html '''
特色數據庫
易於學習:Python 有相對較少的關鍵字,結構簡單,和一個明肯定義的語法,學習起來更加簡單。express
易於閱讀:Python 代碼定義的更清晰。編程
易於維護:Python 的成功在於它的源代碼是至關容易維護的。api
一個普遍的標準庫:Python 的最大的優點之一是豐富的庫,跨平臺的,在 UNIX,Windows 和 macOS 兼容很好。網絡
互動模式:互動模式的支持,您能夠從終端輸入執行代碼並得到結果的語言,互動的測試和調試代碼片段。app
可移植:基於其開放源代碼的特性,Python 已經被移植(也就是使其工做)到許多平臺。
可擴展:若是你須要一段運行很快的關鍵代碼,或者是想要編寫一些不肯開放的算法,你可使用 C 或 C++ 完成那部分程序,而後從你的 Python 程序中調用。
數據庫:Python 提供全部主要的商業數據庫的接口。
GUI 編程:Python 支持 GUI 能夠建立和移植到許多系統調用。
可嵌入:你能夠將 Python 嵌入到 C/C++ 程序,讓你的程序的用戶得到"腳本化"的能力。
面向對象:Python 是強面向對象的語言,程序中任何內容統稱爲對象,包括數字、字符串、函數等。
02
Python
基礎語法
運行 Python
交互式解釋器
在命令行窗口執行python後,進入 Python 的交互式解釋器。exit() 或 Ctrl + D 組合鍵退出交互式解釋器。
命令行腳本
在命令行窗口執行python script-file.py,以執行 Python 腳本文件。
指定解釋器
若是在 Python 腳本文件首行輸入#!/usr/bin/env python,那麼能夠在命令行窗口中執行/path/to/script-file.py以執行該腳本文件。
注:該方法不支持 Windows 環境。
編碼
默認狀況下,3.x 源碼文件都是 UTF-8 編碼,字符串都是 Unicode 字符。也能夠手動指定文件編碼:
# -*- coding: utf-8 -*-
或者
# encoding: utf-8
注意: 該行標註必須位於文件第一行
標識符
第一個字符必須是英文字母或下劃線 _ 。
標識符的其餘的部分由字母、數字和下劃線組成。
標識符對大小寫敏感。
注:從 3.x 開始,非 ASCII 標識符也是容許的,但不建議。
保留字
保留字即關鍵字,咱們不能把它們用做任何標識符名稱。Python 的標準庫提供了一個 keyword 模塊,能夠輸出當前版本的全部關鍵字:
>>> import keyword >>> keyword.kwlist ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
(左右滑動可查看完整代碼)
註釋
單行註釋採用#,多行註釋採用'''或"""。
# 這是單行註釋 ''' 這是多行註釋 這是多行註釋 ''' """ 這也是多行註釋 這也是多行註釋 """
行與縮進
Python 最具特點的就是使用縮進來表示代碼塊,不須要使用大括號 {}。 縮進的空格數是可變的,可是同一個代碼塊的語句必須包含相同的縮進空格數。縮進不一致,會致使運行錯誤。
多行語句
Python 一般是一行寫完一條語句,但若是語句很長,咱們可使用反斜槓\來實現多行語句。
total = item_one + \ item_two + \ item_three
在 [], {}, 或 () 中的多行語句,不須要使用反斜槓\。
空行
函數之間或類的方法之間用空行分隔,表示一段新的代碼的開始。類和函數入口之間也用一行空行分隔,以突出函數入口的開始。
空行與代碼縮進不一樣,空行並非 Python 語法的一部分。書寫時不插入空行,Python 解釋器運行也不會出錯。可是空行的做用在於分隔兩段不一樣功能或含義的代碼,便於往後代碼的維護或重構。
記住:空行也是程序代碼的一部分。
等待用戶輸入
input函數能夠實現等待並接收命令行中的用戶輸入。
content = input("\n\n請輸入點東西並按 Enter 鍵\n") print(content)
同一行寫多條語句
Python 能夠在同一行中使用多條語句,語句之間使用分號;分割。
import sys; x = 'hello world'; sys.stdout.write(x + '\n')
多個語句構成代碼組
縮進相同的一組語句構成一個代碼塊,咱們稱之代碼組。
像if、while、def和class這樣的複合語句,首行以關鍵字開始,以冒號:結束,該行以後的一行或多行代碼構成代碼組。
咱們將首行及後面的代碼組稱爲一個子句(clause)。
print 輸出
print 默認輸出是換行的,若是要實現不換行須要在變量末尾加上end=""或別的非換行符字符串:
print('123') # 默認換行 print('123', end = "") # 不換行
import 與 from...import
在 Python 用 import 或者 from...import 來導入相應的模塊。
將整個模塊導入,格式爲:import module_name
從某個模塊中導入某個函數,格式爲:from module_name import func1
從某個模塊中導入多個函數,格式爲:from module_name import func1, func2, func3
將某個模塊中的所有函數導入,格式爲:from module_name import *
運算符
算術運算符
運算符描述+加-減*乘/除%取模**冪//取整除
比較運算符
運算符描述==等於!=不等於>大於<小於>=大於等於<=小於等於
賦值運算符
運算符描述=簡單的賦值運算符+=加法賦值運算符-=減法賦值運算符*=乘法賦值運算符/=除法賦值運算符%=取模賦值運算符**=冪賦值運算符//=取整除賦值運算符
位運算符
運算符描述&按位與運算符:參與運算的兩個值,若是兩個相應位都爲1,則該位的結果爲1,不然爲0|按位或運算符:只要對應的二個二進位有一個爲1時,結果位就爲1^按位異或運算符:當兩對應的二進位相異時,結果爲1~按位取反運算符:對數據的每一個二進制位取反,即把1變爲0,把0變爲1。~x 相似於 -x-1<<左移動運算符:運算數的各二進位所有左移若干位,由"<<"右邊的數指定移動的位數,高位丟棄,低位補0>>右移動運算符:把">>"左邊的運算數的各二進位所有右移若干位,">>"右邊的數指定移動的位數
邏輯運算符
運算符邏輯表達式描述andx and y布爾"與" - 若是 x 爲 False,x and y 返回 False,不然它返回 y 的計算值orx or y布爾"或" - 若是 x 是 True,它返回 x 的值,不然它返回 y 的計算值notnot x布爾"非" - 若是 x 爲 True,返回 False 。若是 x 爲 False,它返回 True
成員運算符
運算符描述in若是在指定的序列中找到值返回 True,不然返回 Falsenot in若是在指定的序列中沒有找到值返回 True,不然返回 False
身份運算符
運算符描述實例isis 是判斷兩個標識符是否是引用自一個對象x is y, 相似 id(x) == id(y) , 若是引用的是同一個對象則返回 True,不然返回 Falseis notis not 是判斷兩個標識符是否是引用自不一樣對象x is not y , 相似 id(a) != id(b)。若是引用的不是同一個對象則返回結果 True,不然返回 False
運算符優先級
運算符描述(expressions...), [expressions...], {key: value...}, {expressions...}表示綁定或元組、表示列表、表示字典、表示集合x[index], x[index:index], x(arguments...), x.attribute下標、切片、調用、屬性引用**指數 (最高優先級)~+-按位翻轉, 一元加號和減號 (最後兩個的方法名爲 +@ 和 -@)*/%//乘,除,取模和取整除+-加法減法>><<右移,左移運算符&位 'AND'^|位運算符<=<>>=比較運算符<>==!=等於運算符=%=/=//=-=+=*=**=賦值運算符isis not身份運算符innot in成員運算符andornot邏輯運算符if - else條件表達式lambdaLambda 表達式
具備相同優先級的運算符將從左至右的方式依次進行。用小括號()能夠改變運算順序。
變量
變量在使用前必須先"定義"(即賦予變量一個值),不然會報錯:
>>> name Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'name' is not defined
數據類型
布爾(bool)
只有 True 和 False 兩個值,表示真或假。
數字(number)
整型(int)
整數值,可正數亦可複數,無小數。 3.x 整型是沒有限制大小的,能夠看成 Long 類型使用,因此 3.x 沒有 2.x 的 Long 類型。
浮點型(float)
浮點型由整數部分與小數部分組成,浮點型也可使用科學計數法表示(2.5e2 = 2.5 x 10^2 = 250)
複數(complex)
複數由實數部分和虛數部分構成,能夠用a + bj,或者complex(a,b)表示,複數的實部 a 和虛部 b 都是浮點型。
數字運算
不一樣類型的數字混合運算時會將整數轉換爲浮點數
在不一樣的機器上浮點運算的結果可能會不同
在整數除法中,除法 / 老是返回一個浮點數,若是隻想獲得整數的結果,丟棄可能的分數部分,可使用運算符 //。
// 獲得的並不必定是整數類型的數,它與分母分子的數據類型有關係
在交互模式中,最後被輸出的表達式結果被賦值給變量 _,_ 是個只讀變量
數學函數
注:如下函數的使用,需先導入 math 包。
函數描述abs(x)返回數字的整型絕對值,如 abs(-10) 返回 10ceil(x)返回數字的上入整數,如 math.ceil(4.1) 返回 5cmp(x, y)若是 x < y 返回 -1,若是 x == y 返回 0,若是 x > y 返回 1。Python 3 已廢棄 。使用 使用 (x>y)-(x<y) 替換。exp(x)返回 e 的 x 次冪(ex),如 math.exp(1) 返回2.718281828459045fabs(x)返回數字的浮點數絕對值,如 math.fabs(-10) 返回10.0floor(x)返回數字的下舍整數,如 math.floor(4.9) 返回 4log(x)如 math.log(math.e) 返回 1.0,math.log(100,10) 返回 2.0log10(x)返回以 10 爲基數的 x 的對數,如 math.log10(100) 返回 2.0max(x1, x2,...)返回給定參數的最大值,參數能夠爲序列min(x1, x2,...)返回給定參數的最小值,參數能夠爲序列modf(x)返回 x 的整數部分與小數部分,兩部分的數值符號與 x 相同,整數部分以浮點型表示pow(x, y)冪等函數, x**y 運算後的值round(x [,n])返回浮點數 x 的四捨五入值,如給出 n 值,則表明舍入到小數點後的位數sqrt(x)返回數字 x 的平方根
隨機數函數
注:如下函數的使用,需先導入 random 包。
函數描述choice(seq)從序列的元素中隨機挑選一個元素,好比random.choice(range(10)),從0到9中隨機挑選一個整數randrange ([start,] stop [,step])從指定範圍內,按指定基數遞增的集合中獲取一個隨機數,基數缺省值爲1random()隨機生成下一個實數,它在[0,1)範圍內seed([x])改變隨機數生成器的種子seed。若是你不瞭解其原理,你沒必要特別去設定seed,Python會幫你選擇seedshuffle(lst)將序列的全部元素隨機排序uniform(x, y)隨機生成下一個實數,它在[x,y]範圍內
三角函數
注:如下函數的使用,需先導入 math 包。
函數描述acos(x)返回 x 的反餘弦弧度值asin(x)返回 x 的反正弦弧度值atan(x)返回 x 的反正切弧度值atan2(y, x)返回給定的 X 及 Y 座標值的反正切值cos(x)返回 x 的弧度的餘弦值hypot(x, y)返回歐幾里德範數 sqrt(x*x + y*y)sin(x)返回的 x 弧度的正弦值tan(x)返回 x 弧度的正切值degrees(x)將弧度轉換爲角度,如 degrees(math.pi/2) 返回 90.0radians(x)將角度轉換爲弧度
數學常量
常量描述pi數學常量 pi(圓周率,通常以π來表示)e數學常量 e,e 即天然常數(天然常數)
字符串(string)
單引號和雙引號使用徹底相同
使用三引號('''或""")能夠指定一個多行字符串
轉義符(反斜槓\)能夠用來轉義,使用r可讓反斜槓不發生轉義,如r"this is a line with \n",則\n會顯示,並非換行
按字面意義級聯字符串,如"this " "is " "string"會被自動轉換爲this is string
字符串能夠用 + 運算符鏈接在一塊兒,用 * 運算符重複
字符串有兩種索引方式,從左往右以 0 開始,從右往左以 -1 開始
字符串不能改變
沒有單獨的字符類型,一個字符就是長度爲 1 的字符串
字符串的截取的語法格式以下:變量[頭下標:尾下標]
轉義字符
轉義字符描述\在行尾時,續行符\\反斜槓符號\'單引號\"雙引號\a響鈴\b退格(Backspace)\e轉義\000空\n換行\v縱向製表符\t橫向製表符\r回車\f換頁\oyy八進制數,yy表明字符,例如:\o12表明換行\xyy十六進制數,yy表明字符,例如:\x0a表明換行\other其它的字符以普通格式輸出
字符串運算符
操做符描述實例+字符串鏈接'Hello' + 'Python' 輸出結果:'HelloPython'*重複輸出字符串'Hello' * 2 輸出結果:'HelloHello'[]經過索引獲取字符串中字符'Hello'[1] 輸出結果 e[ : ]截取字符串中的一部分'Hello'[1:4] 輸出結果 ellin成員運算符,若是字符串中包含給定的字符返回 True'H' in 'Hello' 輸出結果 Truenot in成員運算符,若是字符串中不包含給定的字符返回 True'M' not in 'Hello' 輸出結果 Truer/R原始字符串,全部的字符串都是直接按照字面的意思來使用,沒有轉義特殊或不能打印的字符。原始字符串除在字符串的第一個引號前加上字母 r(能夠大小寫)之外,與普通字符串有着幾乎徹底相同的語法print(r'\n') 或 print(R'\n')%格式化字符串
字符串格式化
在 Python 中,字符串格式化不是 sprintf 函數,而是用 % 符號。例如:
print("我叫%s, 今年 %d 歲!" % ('小明', 10)) // 輸出: 我叫小明, 今年 10 歲!
格式化符號:
符號描述%c格式化字符及其 ASCII 碼%s格式化字符串%d格式化整數%u格式化無符號整型%o格式化無符號八進制數%x格式化無符號十六進制數%X格式化無符號十六進制數(大寫)%f格式化浮點數字,可指定小數點後的精度%e用科學計數法格式化浮點數%E做用同 %e,用科學計數法格式化浮點數%g%f 和 %e 的簡寫%G%f 和 %E 的簡寫%p用十六進制數格式化變量的地址
輔助指令:
指令描述*定義寬度或者小數點精度-用作左對齊+在正數前面顯示加號
在正數前面顯示空格#在八進制數前面顯示零('0'),在十六進制前面顯示'0x'或者'0X'(取決於用的是'x'仍是'X')0顯示的數字前面填充'0'而不是默認的空格%'%%'輸出一個單一的'%'(var)映射變量(字典參數)m.n.m 是顯示的最小總寬度,n 是小數點後的位數(若是可用的話)
Python 2.6 開始,新增了一種格式化字符串的函數 str.format(),它加強了字符串格式化的功能。
多行字符串
用三引號(''' 或 """)包裹字符串內容
多行字符串內容支持轉義符,用法與單雙引號同樣
三引號包裹的內容,有變量接收或操做即字符串,不然就是多行註釋
實例:
string = ''' print(\tmath.fabs(-10)) print(\nrandom.choice(li)) ''' print(string)
輸出:
print( math.fabs(-10)) print( random.choice(li))
Unicode
在 2.x 中,普通字符串是以 8 位 ASCII 碼進行存儲的,而 Unicode 字符串則存儲爲 16 位 Unicode 字符串,這樣可以表示更多的字符集。使用的語法是在字符串前面加上前綴 u。
在 3.x 中,全部的字符串都是 Unicode 字符串。
字符串函數
方法名描述str.capitalize()首字母大寫,其他字符小寫str.center(width[, fillchar])返回一個指定的寬度 width 居中的字符串,fillchar 爲填充的字符,默認爲空格str.count(sub, start= 0,end=len(string))統計子字符串在字符串中出現的次數str.encode(encoding='UTF-8',errors='strict')以指定的編碼格式編碼字符串,返回 bytes 對象bytes.decode(encoding="utf-8", errors="strict")以指定的編碼格式解碼 bytes 對象,返回字符串str.endswith(suffix[, start[, end]])判斷字符串是否以指定後綴結尾str.expandtabs(tabsize=8)把字符串中的 tab 符號(\t)轉爲空格str.find(str, beg=0, end=len(string))若是包含子字符串返回開始的索引值,不然返回-1str.index(str, beg=0, end=len(string))若是包含子字符串返回開始的索引值,不然拋出異常str.isalnum()檢測字符串是否只由字母和數字組成str.isalpha()檢測字符串是否只由字母組成str.isdigit()檢測字符串是否只由數字組成str.islower()若是字符串中包含至少一個區分大小寫的字符,而且全部這些(區分大小寫的)字符都是小寫,則返回 True,不然返回 Falsestr.isupper()檢測字符串中全部的字母是否都爲大寫str.isspace()若是字符串中只包含空格,則返回 True,不然返回 Falsestr.istitle()檢測字符串中全部的單詞拼寫首字母是否爲大寫,且其餘字母爲小寫str.join(sequence)將序列的元素以指定的字符鏈接生成一個新的字符串len(s)返回對象(字符串、列表、元組等)長度或項目個數str.ljust(width[, fillchar])返回一個原字符串左對齊,並使用空格填充至指定長度的新字符串。若是指定的長度小於原字符串的長度則返回原字符串str.lower()轉換字符串中全部大寫字符爲小寫str.upper()轉換字符串中全部小寫字符爲大寫str.strip([chars])移除字符串頭尾指定的字符(默認爲空格)或字符序列str.maketrans(intab, outtab)用於建立字符映射的轉換表,對於接受兩個參數的最簡單的調用方式,第一個參數是字符串,表示須要轉換的字符,第二個參數也是字符串表示轉換的目標。兩個字符串的長度必須相同,爲一一對應的關係。str.translate(table)根據參數table給出的錶轉換字符串的字符max(str)返回字符串中最大的字符min(str)返回字符串中最小的字符str.replace(old, new[, max])把字符串中的 old(舊字符串) 替換成 new(新字符串),若是指定第三個參數max,則替換不超過 max 次str.split(str="", num=string.count(str))經過指定分隔符對字符串進行切片,若是參數 num 有指定值,則僅分隔 num 個子字符串str.splitlines([keepends])按照行('\r', '\r\n', \n')分隔,返回一個包含各行做爲元素的列表,若是參數 keepends 爲 False,不包含換行符,若是爲 True,則保留換行符str.startswith(str, beg=0,end=len(string))檢查字符串是不是以指定子字符串開頭str.swapcase()對字符串的大小寫字母進行互換str.title()返回"標題化"的字符串,即全部單詞都是以大寫開始,其他字母均爲小寫str.zfill(width)返回指定長度的字符串,原字符串右對齊,前面填充0str.isdecimal()檢查字符串是否只包含十進制字符,只適用於 Unicode 對象
字節(bytes)
在 3.x 中,字符串和二進制數據徹底區分開。文本老是 Unicode,由 str 類型表示,二進制數據則由 bytes 類型表示。Python 3 不會以任意隱式的方式混用 str 和 bytes,你不能拼接字符串和字節流,也沒法在字節流裏搜索字符串(反之亦然),也不能將字符串傳入參數爲字節流的函數(反之亦然)。
bytes 類型與 str 類型,兩者的方法僅有 encode() 和 decode() 不一樣。
bytes 類型數據需在常規的 str 類型前加個 b 以示區分,例如 b'abc'。
只有在須要將 str 編碼(encode)成 bytes 的時候,好比:經過網絡傳輸數據;或者須要將 bytes 解碼(decode)成 str 的時候,咱們纔會關注 str 和 bytes 的區別。
bytes 轉 str:
b'abc'.decode() str(b'abc') str(b'abc', encoding='utf-8')
str 轉 bytes:
'中國'.encode() bytes('中國', encoding='utf-8'