參考教程:菜鳥教程
https://www.runoob.com/python3/python3-tutorial.html
使用的開發工具是Jupyter Notebook(Anaconda)
下面我主要是介紹一些需要注意的點和練習過程:
說在前面:動手很重要
一、python基本語法
1.標識符規則:
在 Python 里,標識符由字母、數字、下划線組成。
在 Python 中,所有標識符可以包括英文、數字以及下划線(_),但不能以數字開頭。
Python 中的標識符是區分大小寫的。
注意:
以下划線開頭的標識符是有特殊意義的。
以單下划線開頭 _foo 的代表不能直接訪問的類屬性,需通過類提供的接口進行訪問,不能用 from xxx import * 而導入。
以雙下划線開頭的 __foo 代表類的私有成員,以雙下划線開頭和結尾的 __foo__ 代表 Python 里特殊方法專用的標識,如 __init__() 代表類的構造函數。
2.行和縮進
python中的代碼塊不適應大括號{ } 來控制類、函數以及其他邏輯判斷。python對縮進是很敏感的,它通過縮進來判斷函數或者模塊。
if True:
print("true")
else:
print("false")
若出現: IndentationError: unindent does not match any outer indentation level錯誤表明是縮進錯誤
3.多行語句在行尾使用 \ 來接下一行
句中包含 [], {} 或 () 括號就不需要使用多行連接符。
4.字符串表示 ‘’,“”,“““,三引號可以由多行組成。單行注釋用 # 多行注釋用三個單引號或三個雙引號。
5.input、print表示輸入、輸出,python中的命令-h可以查看各參數的幫助信息。
6.import 與 from...import
二、Python變量類型
1.變量賦值
Python中變量名賦值不需要進行類型聲明,變量名也不需要提前創建,變量賦值以后才會被創建(這一點和R語言類似)
2.多變量賦值
可以同時給三個變量賦相同的值,也可以將三個變量同時分別賦值。
3.標准數據類型
Python中有五個標准數據類型:Numbers(數字)、String(字符串)、List(列表)、Tuple(元組)、Dictionary(字典)
詳細內容看下面的第九條
三、Python的基本數據類型
用於存儲數據
1.Number數字
Python3 支持 int、float、bool、complex(復數)。
(1)內置的 type() 函數可以用來查詢變量所指的對象類型。
(2)此外還可以用 isinstance 來判斷
(1)(2)的區別在於:
(3)Python3 中,把 True 和 False 定義成關鍵字了,但它們的值還是 1 和 0,它們可以和數字相加。
(4)del語句可以刪除一些對象引用。也可以刪除單個或多個對象。
(5)Python還支持復數,復數由實數部分和虛數部分構成,可以用a + bj,或者complex(a,b)表示, 復數的實部a和虛部b都是浮點型。
2.字符串
Python中的字符串用單引號 ' 或雙引號 " 括起來,同時使用反斜杠 \ 轉義特殊字符。
(1)字符串截取:
變量[頭下標:尾下標],字符串第一個字符索引是0;
從左往右以0開始,從右往左以-1開始。
(2)字符串操作
注意不能使用索引來改變字符串內的字符。
(3)對轉義字符的說明
反斜杠(\)轉義特殊字符,如果你不想讓反斜杠發生轉義,可以在字符串前面添加一個 r,表示原始字符串:
3.列表List(Python內還有一些對列表操作的函數)
(1)列表是寫在方括號 [] 之間、用逗號分隔開的元素列表, 列表中元素的類型可以不相同。
(2)列表中元素的截取
①當只截取一個時,返回值是這個元素;當截取多個時,返回的是一個新的列表。
②注意選取范圍是左閉右開區間
索引值以 0 為開始值,-1 為從末尾的開始位置。
可以直接通過索引來更改列表內元素,也可以通過列表內置方法來更改。
③注意:
list可以用+進行拼接
和字符串一樣,list可以被索引和切片
python截取列表數據時,可以接收第三個參數,實現按步數截取。
當第三個參數為負數時逆向讀取,可以用來翻轉字符串。
4.元組Tuple
(1)特點:操作元組與列表類似,不同之處在於,元組內的元組不能修改,元組寫在小括號()里,元組之間用逗號隔開,元組內的元組類型也可以不同。元組之間也可以通過+直接合並。
(2)雖然tuple的元素不可變,但是他可以包含可變的對象,比如說list列表。
(3)特別注意:構造包含0或1個元素的元組有着特殊的語法規則
5.集合set
是由一個或數個形態各異的大小整體組成的,構成集合的事物或對象稱作元素或是成員。
基本功能是進行成員關系測試和刪除重復元素。set里的內容位置是隨意的,所以不能用索引列出
(1)set的創建
①可以使用大括號{}或者set()函數來創建
②在用set函數的時候,注意,set函數最多只能接收一個參數
那么怎樣用它來創建含有多個元素的集合呢?
向set函數的參數里,傳入含有多個元素的列表或元組均可;如果只傳入一個字符串,他會將字符串拆成一個個的字符,那么創建的集合就全是一個個的字母的集合啦
③空的集合必須通過set()函數來創建;{}是用來創建空的字典的。
(2)集合之間可以進行運算,差、交、並、補等
(3)set的使用:
①去重,set自動完成
②判斷元素是否在集合中
6.字典dictionary(具體字典內置函數,可以百度一下)
列表是有序的對象集合,字典是無序的對象集合。兩者之間的區別在於:字典當中的元素是通過鍵來存取的,而不是通過偏移存取。
(1)字典的實質:字典是一種映射類型,字典用 { } 標識,它是一個無序的 鍵(key) : 值(value) 的集合。
(2)注意: 鍵(key)必須使用不可變類型, 在同一個字典中,鍵(key)必須是唯一的。
(3)創建字典:三種方式對比
創建空字典用{}。
(4)對字典的讀取操作
7.Python數據轉換
下面介紹幾個內置函數可以執行數據類型之間轉換,這些函數返回一個新的對象值,表示轉換的值。
函數 |
描述 |
int(x) |
將x轉化為一個整數 |
float(x) |
將x轉化為浮點數 |
comlext(real,imag) |
創建復數 |
str(x) |
將對象x轉化為字符串 |
repe(x) |
將對象x轉化為表達式字符串 |
tuple(s) |
將序列s轉化為元組 |
list(s) |
將序列s轉化為列表 |
set(s) |
將s轉化為可變集合 |
frozenset(s) |
轉化為不可變集合 |
dict(d) |
將d轉化為字典;d必須是一個(key,value)的元組序列 |
chr(x) |
將一個整數轉化為字符 |
ord(x) |
將一個字符轉化為整數 |
hex(x) |
將x轉化為16進制形式字符串 |
oct(x) |
轉化為八進制形式字符串 |
四、Python解釋器
現在Python的集成開發工具多種多樣,我現在使用的是Jupyter notebook,網頁版,高效方便。
也可以使用python自帶的IDE,有腳本編程和交互式編程兩種。
還有pycharm、Ipython等工具都很方便。
五、Python運算符(這里只講一些常用的)
1.算術運算符
運算符 | 描述 |
+,-,*,/ |
加減乘除 |
% |
取模,返回除法的余數 |
x**y |
返回x的y次方結果 |
// |
向下取接近除數的整數,9//2=4;-5//2=-3;得到的是更小的整數 |
2.比較運算符(返回的是真值)
運算符 |
描述 |
==、!= |
等於、不等 |
>、<、>=、<= |
大於、小於、大於等於、小於等於 |
3.賦值運算符
運算符 |
描述 |
= |
簡單賦值符 c = a + b 將 a + b 的運算結果賦值為 c |
+=、-=、*=、/= |
加減乘除賦值符 c += a 等效於 c = c + a |
%= |
取模賦值符 c %= a 等效於 c = c % a |
**= |
冪賦值符 c **= a 等效於 c = c ** a |
//= |
取整除賦值符 c //= a 等效於 c = c// a |
:= |
海象運算符(和R語言中的有點類似) 可在表達式內部為變量賦值。 |
4.位運算符
運算符 |
描述 |
& |
按位與運算符:參與運算的兩個值,如果兩個相應位都為1,則該位的結果為1,否則為0 |
| |
按位或運算符:只要對應的二個二進位有一個為1時,結果位就為1。 |
^ |
按位異或運算符:當兩對應的二進位相異時,結果為1 |
~ |
按位取反運算符:對數據的每個二進制位取反,即把1變為0,把0變為1。~x 類似於 -x-1 |
<< |
左移動運算符:運算數的各二進位全部左移若干位,由"<<"右邊的數指定移動的位數,高位丟棄,低位補0。 |
>> |
右移動運算符:把">>"左邊的運算數的各二進位全部右移若干位,">>"右邊的數指定移動的位數 |
5.邏輯運算符(看X的真值)
運算符 |
描述 |
and |
與運算符:如果x為False,x and y 返回 False,否則返回y的計算值 |
or |
或運算符:如果x是True,返回x的值,否則返回y的值 |
not |
非運算符,如果x為True,則返回False,否則返回True |
6.成員運算符
in、not in
7.身份運算符(判斷)
is 判斷兩個標識符是否引用自同一個對象
is not 判斷兩個標識符是否引自不同的對象
8.Python運算符的優先級
"**" > "~ +@ -@" > "*/%//" > "+-" > "<< >>"
注意:python3已經不支持<>(不等)運算符,被!=替代了。
六、Python條件控制
1.if判斷
(1)小例子:
(2)if嵌套
if 表達式1:
語句
if 表達式2:
語句
elif 表達式3:
語句
else:
語句
elif 表達式4:
語句
else:
語句
七、Python循環語句
1.while循環語句
while(condition):
statement
例子:
當條件永真時,會無限循環
當條件不成立時跳出循環,也可以用break來終止循環
2.for循環語句
(1)一般格式
for var in sequence:
statemnet1
else:
statement2
(2)小例子(range函數也可以指定步數,默認是整數 1)
3.continue關鍵字
從例子中就可以看出,continue是執行到該語句時,下面的語句不再執行,繼續執行下一個循環過程。
八、Python 迭代器和生成器
1.迭代器: 可以記住遍歷的位置的對象。
迭代是Python最強大的功能之一,是訪問集合元素的一種方式。
迭代器有兩個基本的方法:iter() 和 next()。
(1)使用Python內置迭代器
例子:
(2)迭代
(3)對自定義的類使用迭代器
把一個類作為一個迭代器使用需要在類中實現兩個方法:__iter__(),__next__() ※注意是雙下划線!!!!
① __iter__() 方法返回一個特殊的迭代器對象, 這個迭代器對象實現了 __next__() 方法並通過觸發 StopIteration 異常標識迭代的完成(目的就是識別循環結束的情況,防止出現無限循環的情況)。
② __next__() 方法會返回下一個迭代器對象。
③小例子:
更加合理的指定迭代范圍的方式:
2.生成器generator:生成器就是一個迭代器
(1)定義:使用了yield的函數被稱為生成器
調用一個生成器函數,返回的是一個迭代器對象。
(2)生成器的工作流程:
在調用生成器運行的過程中,每次遇到 yield 時函數會暫停並保存當前所有的運行信息,返回 yield 的值(相當於一個斷點), 並在下一次執行 next() 方法時從當前位置繼續運行。
小例子:使用yield實現斐波那契數列:
九、Python函數
1.定義一個函數
函數代碼塊以 def 關鍵詞開頭,后接函數標識符名稱和圓括號 ()。
任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
函數內容以冒號起始,並且縮進。
return [表達式] 語句用於退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None。
2.調用函數
直接使用函數標識符(加需要傳遞的參數)進行調用
3.參數傳遞
(1)明確一下Python里的可更改和不可更改對象
string、tuple、number都是不可更改對象;而list、dict是可更改對象
下面的概念好好理解:
不可變類型: 變量賦值 a=5 后再賦值 a=10,這里實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當於新生成了a。
可變類型: 變量賦值 la=[1,2,3,4] 后再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了。
(2)對於不可變類型、可變類型對象在調用函數中作為參數傳遞:
不可變類型( string、tuple、number等):類似於C++的值傳遞;如func(a),a傳入的只是a的值,並不影響原來a對象本身。比如在函數內部對a的值改變,改變的只是這個對象的復制對象,對象a本身是不變的。
可變類型(list、dict等):類似於C++的引用傳遞,如func(la),la傳入的是這個對象本身,函數內部對這個對象修改后,外部的對象是會被改變的。
4.參數類型
調用參數時可使用的正式參數類型:
必需參數、關鍵字參數、默認參數、不定長參數
(1)必需參數: 必需參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣。
(2)關鍵字參數: 使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因為 Python 解釋器能夠用參數名匹配參數值。
例:
(3)默認參數
調用函數時,如果沒有傳遞參數,則會使用默認參數。以下實例中如果沒有傳入 age 參數,則使用默認值:
接上面例子:
(4)不定長參數
你可能需要一個函數能處理比當初聲明時更多的參數。
①第一種形式:使用加*的參數,表示輸入一個元組,這個元組的長度是不定的,由調用函數時,自動讀取。
例:
②第二種形式:使用加**的參數,表示輸入形式為字典形式,長度不定
例:
5.匿名函數
python 使用 lambda 來創建匿名函數。 lambda的主體是一個表達式,而不是一個代碼塊。
所謂匿名,意即不再使用 def 語句這樣標准的形式定義一個函數。
lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間里的參數。
(1)語法:注意寫lambda表達式時參數部分不要加 [ ] 這個符號只是代表可以省略 ,不然會報錯
(2)例:
可以看出,也可以不指定參數
十、Python數據結構
1.列表
2.列表——>堆棧
3. 元組和序列
4.集合
5.字典