簡介
Python是一種解釋型、面向對象、動態數據類型的程序設計語言
Python 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。
- 解釋型語言: 這意味着開發過程中沒有編譯這個環節。類似於PHP和Perl語言。
- 交互式語言: 這意味着,您可以在一個 Python 提示符 >>> 后直接執行代碼。
- 面向對象語言: 這意味着Python支持面向對象的風格或代碼封裝在對象的編程技術。
——————————————————————————————————————————
Python 特點
1.易於學習:Python有相對較少的關鍵字,結構簡單,和一個明確定義的語法,學習起來更加簡單。
2.易於閱讀:Python代碼定義的更清晰,偽代碼本質。
3.易於維護:Python的成功在於它的源代碼(開源免費)是相當容易維護的。
4.一個廣泛的標准庫:Python的最大的優勢之一是豐富的庫,跨平台的,在UNIX,Windows和Macintosh兼容很好。
5.互動模式:互動模式的支持,您可以從終端輸入執行代碼並獲得結果的語言,互動的測試和調試代碼片斷。
6.可移植:基於其開放源代碼的特性,Python已經被移植(也就是使其工作)到許多平台。
7.可擴展:如果你需要一段運行很快的關鍵代碼,或者是想要編寫一些不願開放的算法,你可以使用C或C++完成那部分程序,然后從你的Python程序中調用。
8.數據庫:Python提供所有主要的商業數據庫的接口。
9.GUI編程:即用戶圖形界面,Python支持GUI可以創建和移植到許多系統調用。
10.可嵌入: 你可以將Python嵌入到C/C++程序,讓你的程序的用戶獲得"腳本化"的能力。
———————————————————————————————————————————
一、環境搭建
- 使用Anaconda3的jupyter notebook進行開發,官網下載,安裝配置環境,打開cmd或prompt,輸入jupyter notebook。
注:IE瀏覽器進入WebUI需要token,token只有通過prompt命令行啟動時才有——其他瀏覽器不需要
anaconda-navigator #導航視窗
jupyter notebook #開發本本
- 默認的工作空間是用戶目錄,現在進行修改
#生成jupyter的配置文件
jupyter notebook --generate-config
#打開生成的jupyter_notebook_config.py,配置工作空間位置
c.NotebookApp.notebook_dir = 'D:\JupyterProject'
- 確保中文不亂碼
# coding=utf-8 指定編碼支持中文,3.x無需
工程結構:
-
Python工程結構
-
模塊(module)
-
一個Python文件就是一個模塊
- .py source code
- .pyc compiled bytecode
- .pyo optimized bytecode
-
-
包(package)
-
包含多個Python文件
- __init__.py ——必須要由,不然就是一個普通目錄而不是py包
-
部分導入
- from xx import path
二、一般特性
!!!編程規范:PEP8
變量:
- _或字母開頭,_ 、字母和數字組成
- 弱類型,類型不是必須指定、類型不固定
- 大小寫敏感
- 不能使用關鍵字
import keyword
keyword.kwlist #查看關鍵字列表
注釋:
- 單行注釋:#號
- 多行注釋:三個單或雙引號 ,字符串賦值。也可做為注釋
內置函數:
- type() :返回對象類型
- dir() :函數不帶參數時,返回當前范圍內的變量、方法和定義的類型列表;帶參數時,返回參數的屬性、方法列表
- input()/print() : 輸入/打印 輸出
- id() :返回對象的地址 ,一般用來判斷兩個變量是否引用了同一個值
———————————————————————————————————————————
三、數據類型
1、數值類型
a)數值類型:int 、float、complex復數
- int型式沒有大數限制的
- 可以用下划線來標記位數,但是在小數點前后不能使用_

b)操作符
| 操作符 | 說明 | 操作符 | 說明 |
|---|---|---|---|
| x + y | 加法 | int(x) | 轉換成整數 |
| x - y | 減法 | float(x) | 轉換成浮點數 |
| x * y | 乘法 | complex(re, im) | 創建一個復數 |
| x / y | 除法 | c.conjugate() | 返回復數的共軛復數 |
| x // y | 除后取整 | divmod(x, y) | 返回一個包含商和余數的元組 |
| x % y | 除后取余 | pow(x, y) | 返回x的y次方 |
| -x | 負數 | x y** | 返回x的y次方 |
| abs(x) | 取絕對值 | round(x[, n]) | 方法返回浮點數x的四舍五入值 |
序列Seq
2、列表 list[]
a)特點
- 有序,可使用位置索引
- 表長度和元素都是可變的
- 可儲存不同類型的數據
b)使用
- 創建:['one', 2, [3, 4], (5, 6)]
- 獲取:兩套下標,從0起始,從左往右下標為正,從右往左下標為負
- 判斷:in 和 not in
——————————————————————————————————————————
3、元組
a)特點
-
有序
-
長度和元素都不可變,安全級別較高的場景應用
- (元素的引用地址不能變,但地址內的值可變)
-
可以存儲不同類型
b)使用
- 創建 : (1,”box",3.62) 、1,”box",3.62、tuple([1,”box",3.62])
- 獲取:兩套下標,x[0], x[2], x[-1], x[-3]
- 判斷:in 和 not in
———————————————————————————————————————————
4、列表&元組的操作
a)切片
-
通過切片獲得子集
-
[start : end : step]
- start:起始索引,從0開始,-1表示結束,缺省則為0
- end:結束索引,不被包括,缺省則為長度,
- step:步長,end-start,步長為正時,從左向右取值。步長為負時,反向取值。缺省為1
-
-
正向取偶數下標子集:x[0::2]、x[::2]
-
反向取間隔下標子集:x[-1:0:-2]
b)遍歷
#使用縮進代表子代碼塊
for x in list:
print(x)
c)混合
將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的對象
//zip 拉鏈
matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11]]
//最短原則
list(zip(*matrix)) # result: [(1, 5, 9), (2, 6, 10), (3, 7, 11)]
//元組補空
t = (1,2,3,4)
list(zip(t))
———————————————————————————————————————————
5、range類型
a)特性
- 一段不可變的數字序列
- 經常被用作for里面來指定循環次數
b)使用
-
創建:range(start, stop, step)
- start 起始值,默認為0
- stop 終止值,不包括在內
- step 步長,默認為1,可為負,從右往左
-
切片:
x[1:-1:1],中括號[]代替小括號,語法規則同創建。 -
遍歷:
for v in range(0,10,1):print(v)
———————————————————————————————————————————
6、列表、元組、range轉換
- 列表元組可以互轉:
tuple(lst) | list(tup) - range到列表元組:
list(r) | tuple(r)
———————————————————————————————————————————
7、pack & unpack
a)pack ——打包
-
變量轉序列
t=1,2,3 #t=(1,2,3) s='x','y','z' #s=('x','y','z')
b)unpack ——解包
-
序列轉變量
a,b,c=t #a=1,b=2,c=3 -
使用*號代表出現0次或多次
a,*b=t #a=1,b=[2,3] #超長時 *a,c,d,e=t #t中只有三個元素,因此a=[] -
swap交換:
a,b=b,a
8、常見序列操作
- 數據:s = [1,2,3] t = [4,5,6] n = 2
| 操作符 | 說明 |
|---|---|
| s+t | 拼接:[1,2,3,4,5,6] |
| s * n or n * s | 乘法:[1,2,3,1,2,3] ,重復序列 |
| len(s) | 計算序列的長度3 |
| min(s) | 獲得序列中的最小值:1 |
| max(s) | 獲得序列中的最大值:1 |
| s.index(x[, i[, j]]) | 獲得第1個x元素的索引 (索引值在i和j之間),指定范圍內搜索元素值的下標 |
| s.count(x) | 序列x元素出現的次數 |
- 可變序列支持的操作(List) ——元組和range都不支持
| 操作符 | 說明 |
|---|---|
| s[i] = x | 更新指定索引的值 |
| s[i:j] = t | 使用序列t替換s中的i到j的值 |
| del s[i:j] | 等同於s[i:j] = [] |
| s[i:j:k] = t | 使用序列t中的值替換s[i:j:k]的值 |
| del s[i:j:k] | 刪除s[i:j:k]的值 |
| s.append(x) | 將值x添加到序列的末尾 |
| s.clear() | 清空序列,相當於del s[:] |
| s.copy() | 創建一個s的淺拷貝 |
| s.extend(t) | 使用序列t擴展序列s |
| s.insert(i, x) | 在序列s的i索引處插入值x |
| s.pop(i) | 返回序列s中索引為i的值,並將該值從序列中移除 |
| s.remove(x) | 將序列中<第一個>值為x的元素移除 |
| s.reverse() | 將序列s倒序排列 |
9、集合 Set
a)特性
- 數據唯一不重復
- 無序,沒有索引下標
b)創建 :
空集合 s=set()
非空集合 s={1,2,3,4,5}
c)操作:
並集:s1|s2|s3
交集:s1&s2&s3
差集:s1-s2-s3
對等差分 :s1^s2^s3 並集減交集
d)判斷
超集:issupperset()
子集:issubset()
相交: isdisjoint()
10、字典(Dict)
性質類似於Map映射
a)特性
- 通過鍵值對(key-value)來儲存數據
- 儲存的數據是無序的,可使用鍵索引
- 鍵是必須唯一,但值可以不唯一
- 鍵的類型只能是字符串、數字或元組,值可以是任何
b)創建
#空Dict
empty_dict = {}
#鍵值對
dict_1 = {1:'one', 2:'two', 3:'three'}
#構造函數
dict_2 = dict(one=1, two=2, three=3)
c)獲取
x=d[1]
x=d['one']
x=d.get(1,"缺省值") #當get的key值不存在時,返回缺省值
d)遍歷
#遍歷字典的鍵
for k in x: #默認是Dict的鍵值集合,x.keys()
print(k)
#遍歷字典的值
for v in x.values():
print(v)
#遍歷字典的鍵和值
for k,v in x.items():
print(k,v)
11、字符串
a )定義 :
單引號 雙引號 三引號(允許字符串換行)
#單引號
str1 = 'allows embedded "double" quotes'
#雙引號
str2 = "allows embedded 'single' quotes"
#三引號
str3= '''Three single quotes,
span multiple lines'''
str4="""Three double quotes,
span multiple lines"""
b)操作
| 字符串操作 | 說明 | 舉例 |
|---|---|---|
| string[n:m] | 字符串切片 | string='Hello World\n' string[0] string[:-1] string[3:5] |
| int() | 字符串轉數值類型 | int("123") float("123") |
| str() | 數值類型轉字符串 | str(123)str(123.456) |
| ord() | 字符轉Unicode碼 | ord('A') |
| chr() | Unicode碼轉字符 | chr(65) |
| lower() | 轉成小寫字符串 | "WELCOME".lower() |
| upper() | 轉成大寫字符串 | "welcome".upper() |
| split() | 分割字符串 | N'] words = "WELCOME TO PYTHON".split(' TO ') print(words)# ['WELCOME', 'PYTHON'] |
|---|---|---|
| join() | 將序列中的元素以指定的字符連接生成一個新的字符串 | s = '++' list=['1', '2', '3'] s.join(list) #result is '1++2++3' s.join('why') #result is 'w++h++y' |
| strip()lstrip()rstrip() | 用於移除字符串頭尾/頭/尾指定的字符(默認為空格或換行符)或字符序列 | s = ' "hi\\ \n\tPython" ' s.strip()# result is '"hi\ \n\tPython"' s.strip(' "no') # result is 'hi\ \n\tPyth' |
| in | 判斷是否為子串 | 'or' in 'toronto or orlando' # True |
|---|---|---|
| find() | 返回子串開始的索引值,找不到子串時返回-1 | s = 'toronto or orlando's.find('or') # return index 1 s.find('or', 2, 8) # return -1, meaning not found |
| index() | 返回子串開始的索引值,找不到子串時拋出異常 | s = 'toronto or orlando's.index('or') # return index 1 s.index('or', 2, 8) # throw ValueError: substring not found |
| count() | 統計字符串里某個字符出現的次數 | s = 'toronto or orlando' s.count('or') # return 3 s.count('or', 2) # return 2 s.count('or', 2, 9) # return 0 |
| replace() | 方法把字符串中的 舊字符串替換成新字符串 | s = 'toronto or orlando's.replace('or', '/x\')# result: t/x\onto /x\ /x\lando s.replace('or', '/x\', 2)# result: t/x\onto /x\ orlando |
| startswith() | 檢查字符串是否是以指定子字符串開頭 | s = 'toronto or orlando' s.startswith('or') # return False s.startswith('or', 1) # return True s.startswith(('or', 'tor')) # return True |
|---|---|---|
| endswith() | 檢查字符串是否是以指定子字符串結尾 | s = 'toronto or orlando' s.endswith('and') # return False s.endswith('and', 1, -1) # return True s.endswith(('and', 'do')) # return True |
| maketrans() translate() | 字符串轉換,maketrans() 設置轉換模式,一一替換,translate()執行轉換操作。可以一次定義多個模式 | s = 'toronto or orlando' # define a translation table: table=s.maketrans('on', '.N') # o change to . # n change to N # translate using above table s.translate(table) # result: 't.r.Nt. .r .rlaNd.' |
12、布爾值與空值
空值: None ,特殊常量,表示空值,注意大小寫
布爾值:True or False
- 有多種表示形式,只有字典和集合時以空集為True
| True | False |
|---|---|
| 不為0的數值 | 0, 0.0, 0+0j |
| 非空字符串 | 空字符串 |
| 非空列表 | 空列表 |
| 空字典 | 非空字典 |
| 空集合 | 非空集合 |
| - | None |
布爾操作:or 、and、not
13、比較操作符
| 操作符 | 解釋 |
|---|---|
| < | 小於 |
| <= | 小於等於 |
| > | 大於 |
| >= | 大於等於 |
| == | 等於 |
| != | 不等於 |
| is | 判斷兩個標識符是不是引用自一個對象 |
| is not | 判斷兩個標識符是不是引用自不同對象 |
14、流程控制語句
- 條件選擇語句 if
if guess > secret :
print("too large")
elif guess < secret : # elif is optional
print("too small")
else : # else is optional
print("equals")
-
循環語句
- Python中循環也有else語句,當循環條件不再滿足時即循環結束時執行
while guessed != secret :
guessed = int(input("Guess a number: "))
else : # else is optional
print("Congratulation!")
for i in range(0, 8, 2) :
print(i)
else : # else is optional
print("Done!")
-
break\continue\pass
- break 將跳出循環語句,else也不會被執行
- continue,同
- pass ,占位語句,啥也不干
-
三元表達式: val1 if bool else val2 ,bool為真時返回val1,為假時返回val2
15、列表生成式 (重點)
- 列表生成式 : 輸出表達式 循環條件 判斷語句
[x**2 for x in range(10) ] #1~10的數平方列表
[x for x in range(2,100) if x % 2 == 0] #2~100的偶數列表
from math import pi
[str(round(pi, i)) for i in range(1, 10)] #Π的位數梯級表
[[1 if r==c or r+c==3 else 0 for c in range(4)]for r in range(4)] #矩陣列表
sentence = 'what is this'
{ c for c in sentence if c != ' ' } #生成集合
sentence = 'what is this'
(w for w in sentence.split() if 'i' in w) #生成生成器
sentence = 'what is this'
{ w:{c for c in w if c not in 'aeiou'} for w in sentence.split() } #生成字典
16、enumerate函數
將可遍歷的有序對象(列表,元組,字符串)組合為一個有索引號的序列,同時返回下標和數據
for i, v in enumerate('ABCDEFG') :
print(i, v)
四、變量作用域
1、全局變量:
- 定義在模塊中的變量,全局變量在整個模塊中可見
- globals()函數:返回所有定義在改模塊中的全局變量
- 修改全局變量時,要先使用global關鍵字聲明變量
msg = 'created in module'
def outer() :
def inner() :
global msg
msg = 'changed in inner'
inner()
outer()
print(msg)
2、局部變量
-
定義在函數中的變量
-
局部變量僅在定義的函數中中可見
-
locals()函數:返回所有定義在函數中的局部變量
-
自由變量:在函數中使用,但未定義在該函數中的非全局變量。
- 自由變量:修改時要先使用nonlocal關鍵字聲明變量
def outer_1() :
msg = 'created in outer'
def inner() :
print(msg) # msg is a Free variable
inner()
outer_1()
3、作用域規則LEGB
- 使用 LEGB 的順序來查找一個符號對應的對象
- Local -> Enclosed -> Global -> Built-in
- Local:一個函數或者類方法內部
- Enclosed:嵌套函數內
- Global:模塊層級
- Built-in:Python內置符號
