Python基礎筆記
聲明:本文內容主要來源於中國大學MOOC嵩天老師的課程Python語言程序設計
計算機與程序設計
計算機是根據指令操作數據的設備
- 功能性 對數據的操作表現爲數據計算、輸入輸出處理和結果存儲等
- 可編程性 根據一系列指令自動地、可預測地、準確地完成操作者的意圖
計算機的發展 參照摩爾定律,表現爲指數方式
- 計算機硬件所依賴的集成電路規模參照摩爾定律
- 運行速度因此也接近幾何級數快速增長
- 高效支撐的各類運算功能不斷豐富發展
摩爾定律 計算機發展歷史上最重要的預測法則
- Intel公司創始人之一 戈登摩爾在1965年提出
- 單位面積集成電路上可容納晶體管的數量約每兩年翻一番
- CPU/GPU、內存、硬盤、電子產品價格等都遵循摩爾定律
- 當今世界唯一長達50年有效且按照指數發展的技術領域
- 計算機深刻改變人類社會,甚至可能改變人類本身
程序設計 計算機可編程性的體現
- 深度應用計算機的主要手段
- 當今社會需求量最大的職業技能之一,許多崗位都將被計算機程序接管
- 程序設計將是生存技能
程序設計語言 一種用於人類與計算機之間交互的人造語言,亦稱編程語言,比自然語言更簡單、更嚴謹、更精確
- 編程語言超過了600種,絕大部分不再被使用
- C語言誕生於1972年,是第一個被廣泛使用的編程語言
- Python語言誕生於1990年,是最流行最好用的編程語言
編程語言的執行方式 編譯和解釋
- 源代碼:採用某種編程語言編寫的計算機程序,人類可讀 如
result = 1+1
- 目標代碼:計算機可直接執行,人類不可讀,專家除外。如
11010010 00111011
編譯 將源代碼一次性轉換成目標代碼的過程,執行編譯過程的程序叫作編譯器
解釋 將源代碼逐條轉換成目標代碼同時逐條運行的過程,執行解釋過程的程序叫作解釋器
編譯: 一次性翻譯,之後不再需要源代碼,類似英文翻譯
解釋:每次程序運行時隨翻譯隨執行,類似實時同聲傳譯
靜態語言
- 使用編譯器執行的編程語言,如C/C++語言、Java語言
- 編譯器一次性生成目標代碼,優化更充分,程序運行速度快
動態語言
- 使用解釋器執行的編程語言,如Python語言、JavaScript語言、PHP語言
- 執行程序時需要源代碼,維護更靈活
程序的基本編寫方法 IPO
- I :Input 輸入,程序的輸入
文件輸入、網絡輸入、控制檯輸入、交互界面輸入、內部參數輸入等 - P:Process處理,程序的主要邏輯
程序最重要的部分,處理的方法統稱爲算法,是一個程序的靈魂 - O:Output輸出,程序的輸出
控制檯輸出、圖形輸出、文件輸出、網絡輸出、操作系統內部變量輸出等
Python語言誕生 創立者 Guido van Rossum
- python 蟒蛇,命名來源於喜劇組合 Python Monkey
- 2002年,Python2.x
- 2008年,Python3.x
- Python 語言是一個有開放、開源精神的編程語言
保留字
and | elif | if | or | with |
---|---|---|---|---|
as | else | import | pass | yield |
assert | except | in | raise | del |
break | finally | lambda | return | False |
class | for | not | try | |
continue | from | nonlocal | True | |
def | global | None | while |
基礎
- python大小寫敏感
- python註釋語句以#號開頭,使用’” ”’進行註釋塊
- : 後是代碼塊,縮進4個空格或1個Tab
- 強制縮進的壞處是複製粘貼不好用
- 變量命名規則:大小寫字母、數字、下劃線和漢字等字符組合,大小寫敏感、首字符不能是數字、不與保留字相同
數據類型
- 整數可正可負,沒有取值範圍限制
四種表示形式:十進制,二進制0b或0B開頭
八進制以0o或0O開頭
十六進制以0x或0X開頭 - 浮點數取值範圍和小數精度存在限制,取值範圍數量級爲-10^308~10^308,
精度數量級爲10^-16,inf表示無限大。
浮點數間計算存在不確定尾數,不是bug,可以round()
函數四捨五入處理
科學計數法使用字母e或E作爲冪表示,以10爲基數,如<a>e<b>
表示 - 複數類型 其中實部用
c.real
獲得,虛部用c.imag
獲得 - 布爾值:True False
- 空值:None
- 數值運算符 /(精確除法) ,//(地板除), %(取餘數),**(冪次方)
- 數值運算函數
abs(x)
x的絕對值divmod(x,y)
商餘,如divmod(10,3) 結果爲(3,1)
pow(x,y[,z])
冪餘, 表示(x**y)%z
round(x,y)
四捨五入
max(x1,x2,...,xn)
返回最大值
min(x1,x2,...,xn)
返回最小值
int(x)
將x變爲整數,捨棄小數部分,如int(123.45) int("123")
float(x)
將x變爲浮點數,增加小數部分
字符串
- 索引 :返回字符串中單個字符 <字符串>[M]
切片:返回字符串中一段字符子串 <字符串>[M:N(:步長)] - 字符串 轉義字符 \,r’ ’ 示不能轉義,”’…”’多行內容
“\b” 回退 “\n”換行(光標移動到下行首) “\r”回車(光標移動到本行首) - 字符串操作符
x+y
連接兩個字符串
n*x
或x*n
複製n次字符串x
x in s
如果x是s的子串,返回True,否則返回False - 字符串處理函數
len(x)
返回字符串x的長度
str(x)
與eval(x)
相反,將x加上引號變爲字符串
hex(x)
或oct(x)
整數x的十六進制或八進制
chr(u)
或ord(x)
Unicode與單字符的互相轉換
十二星座:ch(9800)
~chr(9812)
=>♈♉♊♋♌♍♎♏♐♑♒♓
- 字符串處理方法
str.lower(),str.upper()
返回字符串的副本,全部字符小寫/大寫
str.split(seq=None)
返回一個列表,由str根據sep被分隔的部分組成
str.count(sub)
返回子串sub在str中出現的次數
str.replace(old,new)
返回字符串副本,所有old子串被替換成new
str.center(width[,fillchar])
字符串str根據寬度width居中,fillchar可選
如"python".center(20,"=") 結果爲 '======python======='
str.strip(chars)
從str中去掉在其左側和右側chars中列出的字符
如"= python =".strip(" =np") 結果爲 "ytho"
str.join(iter)
在iter變量除最後元素外每個元素後增加一個str,主要用於字符串分隔
如",".join("12345") 結果爲"1,2,3,4,5"
str1.index(str2[,begin[,end]])
從字符串str1的begin到end位置時搜索到字符串str2時返回在str1的索引。
str2 = "exam"
print (str1.index(str2))
print (str1.index(str2, 10))
print (str1.index(str2, 40))
結果爲
15
15
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
print(str1.index(str2, 16))
ValueError: substring not found
- 字符串格式化
用法:<模板>.format(<逗號分隔的參數>)
注意槽的變化
"{}:計算機{}的CPU佔用率爲{}%".format("2018-10-10","C",10)
0 1 2 0 1 2
結果爲:"2018-10-10:計算機C的CPU佔用率爲10%"
"{1}:計算機{0}的CPU佔用率爲{2}%".format("2018-10-10","C",10)
結果爲:"C:計算機2018-10-10的CPU佔用率爲10%"
槽內部對格式化的配置方式
{<參數序號>:<格式控制標記>}
: | <填充> | <對齊> | <寬度> | <,> | <.精度> | <類型> |
---|---|---|---|---|---|---|
引導符號 | 用於填充的單個字符 | <爲左對齊 >爲右對齊 ^居中對齊 | 槽設定的輸出寬度 | 數字的千位分隔符 | 浮點數小數精度或字符串最大輸出長度 | 整數類型b,c,d,o,x,X浮點數類型e,E,f,% |
程序的分支結構
- 單分支 if 二分支 if-else 及 適用於簡單表達式的二分支緊湊形式
"對" if guess==99 else "錯"
- 多分支 if-elif-else 及條件之間關係
- not and or > >= == <= < !=
- 異常處理 try-except-else-finally
異常處理一
try:
<語句塊1>
except <異常類型,可針對響應>:
<語句塊2>
異常處理二,直接拋出
raise <異常名稱>
三、異常發生,finally中語句正常執行
try:
<語句塊1>
(except (<異常類型,可針對響應>):
<語句塊>)
finally:
<語句塊2>
四、異常不發生時會執行else中語句
try:
<語句塊1>
except <異常類型>:
<語句塊2>
else:
<語句塊3>
finally:
<語句塊4>
五、自定義異常
自定義一個MyException類,繼承Exception。
class MyException(Exception):
def __init__(self,message):
Exception.__init__(self)
self.message=message
如果輸入的數字小於10,就引發一個MyException異常:
a=input("please input a num:")
if a<10:
try:
raise MyException("my excepition is raised ")
except MyException,e:
print e.message
異常名稱 | 描述 |
---|---|
BaseException | 所有異常的基類 |
SystemExit | 解釋器請求退出 |
KeyboardInterrupt | 用戶中斷執行(通常是輸入^C) |
Exception | 常規錯誤的基類 |
StopIteration | 迭代器沒有更多的值 |
GeneratorExit | 生成器(generator)發生異常來通知退出 |
SystemExit | Python 解釋器請求退出 |
StandardError | 所有的內建標準異常的基類 |
ArithmeticError | 所有數值計算錯誤的基類 |
FloatingPointError | 浮點計算錯誤 |
OverflowError | 數值運算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有數據類型) |
AssertionError | 斷言語句失敗 |
AttributeError | 對象沒有這個屬性 |
EOFError | 沒有內建輸入,到達EOF 標記 |
EnvironmentError | 操作系統錯誤的基類 |
IOError | 輸入/輸出操作失敗 |
OSError | 操作系統錯誤 |
WindowsError | 系統調用失敗 |
ImportError | 導入模塊/對象失敗 |
KeyboardInterrupt | 用戶中斷執行(通常是輸入^C) |
LookupError | 無效數據查詢的基類 |
IndexError | 序列中沒有沒有此索引(index) |
KeyError | 映射中沒有這個鍵 |
MemoryError | 內存溢出錯誤(對於Python 解釋器不是致命的) |
NameError | 未聲明/初始化對象 (沒有屬性) |
UnboundLocalError | 訪問未初始化的本地變量 |
ReferenceError | 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象 |
RuntimeError | 一般的運行時錯誤 |
NotImplementedError | 尚未實現的方法 |
SyntaxError | Python 語法錯誤 |
IndentationError | 縮進錯誤 |
TabError | Tab 和空格混用 |
SystemError | 一般的解釋器系統錯誤 |
TypeError | 對類型無效的操作 |
ValueError | 傳入無效的參數 |
UnicodeError | Unicode 相關的錯誤 |
UnicodeDecodeError | Unicode 解碼時的錯誤 |
UnicodeEncodeError | Unicode 編碼時錯誤 |
UnicodeTranslateError | Unicode 轉換時錯誤 |
Warning | 警告的基類 |
DeprecationWarning | 關於被棄用的特徵的警告 |
FutureWarning | 關於構造將來語義會有改變的警告 |
OverflowWarning | 舊的關於自動提升爲長整型(long)的警告 |
PendingDeprecationWarning | 關於特性將會被廢棄的警告 |
RuntimeWarning | 可疑的運行時行爲(runtime behavior)的警告 |
SyntaxWarning | 可疑的語法的警告 |
UserWarning | 用戶代碼生成的警告 |
程序的循環結構
- for … in 遍歷循環:計數、字符串、列表、文件
- while 無限循環
- continue 和 break 保留字:中止和退出當前循環層次
- 循環else 的高級用法:與break有關
當循環沒有被break語句退出時,執行else語句,視作”正常“完成循環的獎勵
用法與異常處理中else用法類似
for <變量> in <遍歷結構>:
<語句塊1>
else:
<語句塊2>
--------------------------
while <條件>:
<語句塊1>
else:
<語句塊2>
函數與代碼複用
- 函數是一段具有特定功能的、可重用的語句組
- 函數是一種功能的抽象,一般函數表達特定功能
函數的兩個作用:降低編程難度和代碼複用
函數定義
def <函數名>(<參數(0個或多個)>): <函數體> return <返回值>
- 函數定義時,所指定參數是一種佔位符
- 函數定義後,如果不經調用,不會被執行
- 函數定義時,參數是輸入、函數體是處理、結果是輸出(IPO)
函數調用
- 參數傳遞 函數可以有參數,也可以沒有,但必須保留括號
- 可選參數 函數定義時可以爲某些參數指定默認值,構成可選參數
如:
def fact(n,m=1):
s=1
for i in range(1,n+1):
s *=i
return s//m
>>>fact(10)
3628800
>>>fact(10,5)
725760
- 可變參數傳遞 函數定義時可設計可變數量參數,即不確定參數總數量
如:
def fact(n,*b):
s=1
for i in range(1,n+1):
s*=i
for item in b:
s*=item
return s
>>>fact(10,3)
10886400
>>>fact(10,3,5,8)
435456000
- 函數調用時,參數可以按照位置或名稱傳遞
函數的返回值,可以有也可以沒有,可傳遞0個返回值,也可傳遞任意多個返回值
多個返回值會以元組類型返回局部變量和全局變量
- 局部變量是函數內部的佔位符,與全局變量可能重名但不同
- 函數運算結束後,局部變量被釋放
- 可以使用
global
保留字在函數內部使用全局變量 - 局部變量爲組合數據類型且未創建,等同於全局變量
ls =['F','f'] #全局變量列表ls
def func(a):
ls.append(a) #此處ls是列表類型,未真實創建,等同於全局變量
return
func('C')
print(ls)
>>>
['F','f','C']
組合數據類型之集合類型
1.集合定義
- 集合是多個元素的無序組合,與數學中的集合概念一致
- 元素之間無序,每個元素唯一,不存在相同元素
- 集合元素不可更改,不能是可變數據類型
2.集合表示
- 用大括號{}表示,元素間用逗號分隔
- 建立集合類型用{}或set(),建立空集合類型必須使用set()
>>> A={"python",123,('python',123)}
>>> A
{123, 'python', ('python', 123)}
>>> B=set("pypy1233")
>>> B
{'3', 'y', '1', '2', 'p'}
>>> C={"python",123,"python",123}
>>> C
{123, 'python'}
3.集合間操作
S|T
並集 包括在集合S和T中的所有元素
S-T
差集 包括在S但不在T中的元素
S&T
交集 包括同時在S和T中的元素
S^T
補集 包括S和T的非相同元素
S<=T
或 S<T
返回True/False,判斷S和T的子集關係
S>=T
或 S>T
返回True/False,判斷S和T的包含關係
- 增強操作符
S|=T S&=T S^=T S-=T
>>> A={'p','y',123}
>>> B=set("pypy123")
>>> A-B
{123}
>>> B-A
{'3', '1', '2'}
>>> A&B
{'p', 'y'}
>>> A^B
{'3', '1', 123, '2'}
>>> A|B
{'3', 'y', '1', '2', 'p', 123}
4.集合處理方法
S.add(x)
如果x不在集合S中,將x增加到S
S.discard(x)
移除S中元素x,如果x不在集合S中,不報錯
S.remove(x)
移除S中元素x,如果x不在集合S中,產生KeyError異常
S.clear()
移除S中所有元素
S.pop()
隨機取出S的一個元素,更新S,若S爲空產生KeyError異常
S.copy()
返回S的一個副本
len(S)
返回集合S的元素個數
x in S
與 x not in
判斷S中元素x是否存在,返回True/False
set(x)
將其他類型變量x轉變爲集合類型
try:
while True:
print(A.pop(),end="")
except:
pass
p123y
>>>A
set()
#此方法等價於for...in
5.集合類型應用場景
- 包含關係比較
- 數據去重 利用集合無重複元素特點
>>> A
set()
>>> "p" in {'p','y',123}
True
>>> {'p','y'} >={'y',123}
False
>>> ls=['p','p','y',231,'y']
>>> s=set(ls)
>>> s
{231, 'p', 'y'}
>>> lt=list(s)
>>> lt
[231, 'p', 'y']
組合類型之序列類型
1.序列類型定義
- 序列是具有先後關係的一組元素
- 序列是一維元素向量,元素類型可以不同
- 類似熟悉元素序列:
- 元素間由序號引導,通過下表
序列是一個基類類型
包含字符串類型/元組類型/列表類型
2.序列處理函數及方法
序列類型通用操作符
x in s
和x not in s
判斷x是否爲s序列的元素
s+t
連接兩個序列s和t
s*n
或n*s
將序列複製n次
s[i]
索引,返回s中第i個元素
s[i:j]
或s[i:j:k]
切片,返回序列s中第i到j以k爲步長的元素子序列序列類型通用函數和方法
len(s)
返回序列s的長度
min(s)
或max(s)
返回序列s的最小或最大值,s中元素需可比較
s.index(x)
或s.index(X,i,j)
返回序列s從i開始到j位置中第一次出現元素X的位置
s.count(x)
返回序列中出現x的總次數
3.元組類型及操作
元組是序列類型的一種擴展
- 元組是一種序列類型,一旦創建就不能被修改
- 使用小括號()或tuple()
創建,元素間用逗號,分隔
- 可以使用或不使用小括號
def func():
return 1,2
- 元組繼承了序列類型 的全部通用操作
- 因爲創建後不能修改,因此沒有特殊操作
>>> creature='cat','dog','tiger','human'
>>> creature[::-1]
('human', 'tiger', 'dog', 'cat')
>>> color=(0x001100,'blue',creature)
>>> color
(4352, 'blue', ('cat', 'dog', 'tiger', 'human'))
>>> color[-1][2]
'tiger'
4.列表類型定義
- 列表是一種序列類型,創建後可以隨意被修改
- 使用方括號[]會list() 創建,元素間用逗號,分隔
- 列表中各元素類型可以不同,無長度限制
>>> ls=['cat','dog','tiger',1024]
>>> ls
['cat', 'dog', 'tiger', 1024]
>>> lt=ls
>>> lt
['cat', 'dog', 'tiger', 1024]#方括號[]真正創建一個列表,賦值僅傳遞引用
- 列表類型操作函數和方法
ls[i]=x
替換列表ls第i元素爲x
ls[i:j:k]=lt
用列表lt替換切片後所對應元素子列表
del ls[i]
刪除列表ls中第i元素
del ls[i:j:k]
刪除列表ls中第i到j以k爲步長的元素
ls +=lt
更新列表ls,將列表lt元素增加到列表ls中
ls *=n
更新列表ls,其元素重複n次
>>> ls=['cat','dog','tiger',1024]
>>> ls[1:2]=[1,2,3,4]
>>> ls
['cat', 1, 2, 3, 4, 'tiger', 1024]
>>> del ls[::3]
>>> ls
[1, 2, 4, 'tiger']
>>> ls*2
[1, 2, 4, 'tiger', 1, 2, 4, 'tiger']
ls.append(x)
在列表ls最後增加一個元素
ls.clear()
刪除列表ls中所有元素
ls.copy()
生成一個新列表,賦值ls中所有元素
ls.insert(i,x)
在列表ls的第i位置增加元素x
ls.pop(i)
將列表元素ls中的第i位置元素取出並刪除元素
ls.remove(x)
將列表ls中出現的第一個元素x刪除
ls.reverse()
將列表ls中的元素反轉
5.序列類型應用場景
- 表示一組有序數據,進而操作他們
- 元素遍歷
- 數據保護
lt=tuple(ls)
組合類型之字典類型
1.字典類型定義
- 映射是一種鍵(索引)和值(數據)的對應
- 內部顏色藍色,外部顏色紅色
- 序列類型由0…N整數作爲數據默認索引,映射類型則由用戶爲數據定義索引,鍵是數據索引的擴展
- 字典類型是“映射”的體現,字典是鍵值對的集合,鍵值對之間無序
- 採用大括號{}和
dict()
創建,鍵值對用冒號:表示
"streetAddr":"中關村南大街1號"
"City":"北京市"
{<鍵1>:<值1>,<鍵2>:<值2>,...}
2.字典類型的用法
- [] 用來向字典變量中索引或增加元素
type(x)
返回變量x的類型
>>> d={"中國":"北京","美國":"華盛頓","法國":"巴黎"}
>>> d
{'中國': '北京', '美國': '華盛頓', '法國': '巴黎'}
>>> d['中國']
'北京'
>>> de={}
>>> de
{}
>>> type(de)
<class 'dict'>
>>> d
{'中國': '北京', '美國': '華盛頓', '法國': '巴黎', '日本': '東京'}
3.字典處理函數及方法
- del d[k]
刪除字典d中鍵k對應的數據
- k in d
判斷鍵k是否在字典d中,如果在返回True,否則False
- d.keys()
返回字典d中所有的鍵信息
- d.values()
返回字典d 中所有的值信息
- d.items()
返回字典d中所有鍵值對信息
>>> '中國' in d
True
>>> d.keys()
dict_keys(['中國', '美國', '法國', '日本'])
>>> d.values()
dict_values(['北京', '華盛頓', '巴黎', '東京'])
>>> d.items()
dict_items([('中國', '北京'), ('美國', '華盛頓'), ('法國', '巴黎'), ('日本', '東京')])
d.get(k,<default>)
鍵k存在,則返回相應值,不在則返回值d.pop(k,<default>)
鍵k存在,則取出相應值,不在則返回值d.popitem()
隨機從字典d中取出一個鍵值對,以元組形式返回d.clear()
刪除所有鍵值對len(d)
返回字典d中元素的個數
>>> d.get('中國','上海')
'北京'
>>> d.get('韓國','上海')
'上海'
>>> d.popitem()
('日本', '東京')
>>> d
{'中國': '北京', '美國': '華盛頓', '法國': '巴黎'}
4.字典類型應用場景
- 映射無處不在,鍵值對無處不在
例如:統計數據出現的次數,數據是鍵,次數是值 - 主要他們鍵值對數據,進而操作他們
文件和數據格式化
- 字符串格式化
“{}{}{}”.format()
將字符串按照一定規格和式樣進行規範 - 數據格式化 將一組數據按照一定規格和式樣進行規範:表示、存儲、運算等
文件的使用
文件類型
- 文件是數據的抽象和集合
- 文件是存儲在輔助存儲器上的數據序列,是數據存儲的一種形式
- 文件展現形態:文本文件和二進制文件
文本文件 VS 二進制文件
- 文本文件和二進制文件只是文件的展示形式
- 本質上,所有文件都是二進制形式存儲
形式上,所有文件採用兩種方式展示
文本文件由單一特定編碼組成的文件,如UTF-8編碼,由於存在編碼,也被看成是存儲着的長字符串,適用於例如:.txt文件、.py文件等
二進制文件直接有比特0和1組成,沒有統一字符編碼,一般存在二進制0和1的組織結構,即文件格式,適用於如:.png文件、.avi文件等
#f.txt文件保存:“中國是個偉大的國家!”
>>>
tf=open("f.txt","rt") # 文本形式打開文件
print(tf.readline())
tf.close()
>>>
中國是個偉大的國家!
>>>
bf=open("f.txt","rb") # 二進制形式打開文件
print(bf.readline())
bf.close()
>>>
b'\xd6\xd0\xb9\xfa\xca\xc7\xb8\xf6\xce\xb0\xb4\xf3\xb5\xc4\xb9\xfa\xbc\xd2\xa3\xa1'
文件的打開關閉
步驟:打開 –>操作–>關閉
<變量名> =open(<文件名>,<打開模式>)
- 變量名 文件句柄
- 文件名 源文件同目錄可省路徑
D:\\PYE\\f.txt
f.txt
<=> ‘./PYE/f.txt’
- 打開模式 文本 or 二進制 讀 or 寫
<變量名>.close()
打開模式 | 描述 |
---|---|
‘r’ | 只讀模式,默認值,如果文件不存在,返回FileNotError |
‘w’ | 覆蓋寫模式,文件不存在則創建,存在則完全覆蓋 |
‘x’ | 創建寫模式,文件不存在則創建,存在則返回FileExistError |
‘a’ | 追加寫模式,文件不存在則創建,存在則在文件最後追加內容 |
‘b’ | 二進制文件模式 |
‘t’ | 文本文件模式,默認值 |
‘+’ | 與r/w/x/a一同使用,在原功能基礎上增加,使其同時具備讀寫功能 |
f=open('f.txt') -文本形式、只讀模式、默認值
f=open('f.txt','rt') -文本形式、只讀模式、默認值
f=open('f.txt','w') -文本形式、覆蓋寫模式
f=open('f.txt','a+') - 文本形式、追加寫模式+讀文件
f=open('f.txt','x') - 文本形式、創建寫模式
f=open('f.txt','b') - 二進制形式、只讀模式
f=open('f.txt','wb') - 二進制形式、覆蓋寫模式
文件內容的讀取
操作方法 | 描述 |
---|---|
f.read(size=-1) |
讀取全部內容,如果給出參數,讀入前size長度>>>s=f.read(2) 中國 |
f.readline(size=-1) |
讀入一行內容,如果給出參數,讀入該行前size長度>>>s=f.readline() 中國是個偉大的國家 |
f.readlines(hint=-1) |
讀入文件所有行,以每行爲元素形成列表,如果給出參數,讀入前hint行>>>s=f.readlines() ['中國是個偉大的國家'] |
文件的全文本操作
- 遍歷全文本: 一次讀入,統一處理
按數量讀入,逐步處理
fname = input('請輸入要打開的文件名稱:')
fo = open(fname,'r')
txt = fo.read()
#對全文txt進行處理 -一次讀入,統一處理,弊端是大文件佔用內存,耗資源,代價很大
fo.close()
fname = input('請輸入要打開的文件名稱:')
fo = open(fname,'r')
txt = fo.read(2)
while txt != "":
#對txt進行處理 - 按數量讀入,逐步處理
txt=fo.read(2)
fo.close()
- 逐行遍歷文本:一次讀入,分行處理
分行讀入,逐行處理
fname = input('請輸入要打開的文件名稱:')
fo = open(fname,'r')
for line in fo.readlines():
print(line)
fo.close()
fname = input('請輸入要打開的文件名稱:')
fo = open(fname,'r')
for line in fo:
print(line)
fo.close()
數據的寫入
操作方法 | 描述 |
---|---|
f.write(s) |
向文件寫入一個字符串或字節流>>>f.write("中國是一個偉大的國家") |
f.writelines(lines) |
將一個元素全爲字符串的列表寫入文件,寫入的數據爲列表所有元素拼接成字符串後大字符串>>>ls=['中國','德國','美國'] >>>f.writelines(s) 中國德國美國 |
f.seek(offset) |
改變當前文件操作指針的位置,offset含義如下:0-文件開頭;1-當前位置 2-文件結尾>>>f.seek(0) #回到文件開頭 |
fo=open('output.txt','w+')
ls=['中國','法國','美國']
fo.writelines(ls)
fo.seek(0)//沒有seek回到文件開頭的話,輸出爲空
for line in fo:
print(line);
fo.close()
一維數據的格式化和處理
一維數據 由對等關係的有序或無序數據構成,採用線性方式組織
- 對於列表、數組和集合概念
二維數據 由多個一維數據構成,是一維數據的組合形式
- 表格是典型的二維數據
- 其中,表頭是二維數據的一部分
多維數據 由一維或二維數據在新維度上擴展形成
高維數據 僅利用最基本的二元關係展示數據間的複雜結構
{
"firstName" : "Mingzi" ,
"lastName" : "Xingshi" ,
"address" :{
"streeAddr" : "某某村某某街",
"city" : "Beijing",
"zipcode" : "10081"
}
"professsional" : ["Computer Networking","Security"]
}
數據的操作週期
存儲 <-> 表示 <-> 操作
一維數據的表示
- 如果數據間有序:使用列表類型
- 如果數據間無序:使用集合類型
一維數據的存儲
空格分隔
- 使用一個或多個空格分隔進行存儲,不換行
- 缺點:數據本身不能存在空格
逗號分隔
- 使用英文半角逗號分隔數據進行存儲,不換行
- 缺點:數據本身不能存在英文逗號
*特殊符號分隔
- 使用其他符合組合分隔,建議採用特殊符號
- 缺點:需要根據數據特點定義,通用性較差
一維數據的處理
空格分隔
讀取 txt=open(fname).read();ls=txt.split()
寫入 f.write(' '.join(ls))
逗號分隔
讀取 txt=open(fname).read();ls=txt.split(',')
寫入 f.write(','.join(ls))
二維數據的格式化和處理
二維數據的表示
- 列表類型可以表達二維數據
- 使用二維列表
- 使用兩層for循環遍歷每個元素
- 外層列表中每個元素可以對應一行,也可以對應一列
CSV格式與二維數據存儲
CSV :Comma-Separated Values
- 國際通用的一二維數據存儲格式,一般.csv擴展名
- 每行一個一維數據,採用逗號分隔,無空行
- Excel軟件可讀入輸出,一般編輯軟件都可以生成
CSV數據存儲格式
- 如果某個元素確實,逗號仍要保留
- 二維數據的表頭可以作爲數據存儲,也可另行存儲
- 逗號爲英文半角逗號,逗號和數據之間無額外空格
二維數據的存儲
- 按行存或者按列存都可以,具體由程序決定
- 一般索引習慣:ls[row][column],先行後列
- 根據一般習慣,外層列表每個元素是一行,按行存
二維數據的處理
- 讀取
fo =open(fname)
ls =[]
for line in fo:
line=line.replace('\n','')
ls.append(line.split(','))
fo.close()
- 寫入
ls =[[],[],[]]
f= open(fname,'w')
for item in ls:
f.write(','.join(item)+'\n')
f.close()
- 逐一
ls =[[],[],[]]
for row in ls:
for column in row:
print(ls[row][column])
程序設計方法
設計方法
自頂向下 解決複雜問題的有效方法
- 將一個總問題分解爲若干個小問題組成的形式
- 使用同樣方法進一步分解小問題
- 直至,小問題可以用計算機簡單明瞭的解決
自底向上 逐步組建複雜系統的有效測試方法
- 分單元測試,逐步組裝
- 按照自頂向下相反的路徑操作
- 直至,系統各部分以組裝的思路都經過測試和驗證
設計思維
邏輯思維 推理和演繹,數學爲代表,A->B B->C A->C
實證思維 實驗和驗證,物理爲代表,引力波<- 實驗
計算思維 設計和構造,計算機爲代表,漢諾塔遞歸
計算思維 Computational Thinking
- 特徵 抽象和自動化
- 抽象問題的計算過程,利用計算機自動化求解
- 計算思維基於計算機強大的算力和海量數據
- 抽象計算過程,關注設計和構造,而非因果
- 編程是將計算思維變爲現實的手段
計算生態
計算生態 以開源項目爲組織形式,充分利用“共識原則”和“社會利他”組織人員,在競爭發展、相互依存和迅速更迭中完成信息技術的更新換代,形成技術的自我演化路徑。
計算生態 沒有頂層設計、以功能爲單位、具備三個特點
- 競爭發展
- 相互依存
- 迅速更迭
計算生態的價值在於創新,跟隨創新,集成創新和原始創新
Python語言與計算生態
- 以開源項目爲代表的大量第三方庫
python語言提供>14萬個第三方庫 - 庫的建設經過野蠻生長和自然選擇 同一個功能,python語言提供了2個以上的第三方庫
- 庫之間相互關聯使用,依存發展 python庫間廣泛聯繫,逐級封裝
- 社區龐大,新技術更迭迅速 AlphaGa深度學習算法採用Python語言開源
計算生態的運用
- 編程的起點不是算法而是系統
- 編程如同搭積木,利用計算生態位主要模式
- 編程的目標是快速解決問題
刀耕火種 -> 站在巨人的肩膀上
用戶體驗與軟件產品
實現功能 -> 關注用戶體驗
- 用戶體驗指用戶對產品建立的主觀感受和認識
- 關注功能的實現,更要關心用戶體驗,才能做出好產品
- 編程只是手段,不是目的,程序最終爲人類服務
提高用戶體驗的方法
進度展示
- 如果程序需要計算時間,可能產生等待,請增加進度展示
- 如果程序有若干步驟,需要提示用戶,請增加進度展示
- 如果程序可能存在大量次數循環,請增加進度展示
異常處理
- 當獲得用戶輸入,對合規性需要檢查
- 當讀寫文件時,對結果進行判斷
- 當進行輸入輸出時,對運算結果進行判斷
其他類方法
- 打印輸出:特定位置,輸出程序運行的過程信息
- 日誌文件: 對程序異常及用戶使用進行定期記錄
- 幫助信息:給用戶多種方式提供幫助信息
軟件程序->軟件產品:用戶體驗是程序到產品的關鍵環節
程序設計模式
- IPO :Input,Process,Output
- 自頂向下
- 模塊化設計
通過函數或對象封裝和將程序劃分爲模塊及模塊間的表達,具體包括:主程序、子程序和子程序之間的關係,體現了一種分而治之,分層抽象、體系化的設計思想。
模塊內部緊耦合、模塊之間鬆耦合。緊耦合:相互間交流多,無法獨立存在;鬆耦合則相反。 - 配置化設計
引擎+配置:程序執行和配置分離,將可選參數配置化,將程序開發變成配置文件編寫,擴展功能而不修改程序。關鍵在於接口設計,需清晰明瞭、靈活可擴展
應用開發的四個步驟
- 產品定義 對應用需求充分理解和明確定義
產品定義,而不僅是功能定義,要考慮商業模式 - 系統架構 以系統方式思考產品的技術實現
系統架構,關注數據流、模塊化、體系架構 - 設計與實現 結合架構完成關鍵設計及系統實現
結合可擴展性、靈活性等進行設計優化 - 用戶體驗 從用戶角度思考應用效果,用戶至上,體驗優先,以用戶爲中心
Python第三方庫安裝
Python社區
- 14萬個第三方庫
- PyPI Python Package Index
- PSF維護的展示全球Python計算生態的主站
- 學會檢索並利用PyPI,找到合適的第三方庫開發程序
安裝第三方庫
1.pip安裝方法 主要方法,適合99%以上情況,適合windows、Mac和linux等操作系統
常用的pip命令
D:\>pip install <第三方庫名>
- 安裝指定的第三方庫
D:\>pip install -U <第三方庫名>
- 使用-U標籤更新已安裝的指定第三方庫
D:\>pip uninstall <第三方庫名>
-卸載指定的第三方庫
D:\>pip download <第三方庫名>
-下載但不安裝指定的第三方庫
D:\>pip show <第三方庫名>
- 列出某個指定第三方庫的詳細信息
D:\>pip search <關鍵詞>
- 根據關鍵詞在名稱和介紹中搜索第三方庫
D:\>pip list
-列出當前系統已經安裝的第三方庫
2.集成安裝方法 結合特定Python開發工具的批量安裝
- 支持近800個第三方庫
- 包含多個主流工具
- 適合數據計算領域開發
3.文件安裝方法
- 某些第三方庫pip下載後,需要編譯後再安裝
- 如果操作系統沒有編譯環境,則能下載但不能安裝
- 可以直接下載編譯後的版本進行安裝
- 在UCI頁面上搜索第三方庫,下載對應版本編譯好的文件,使用pip install <文件名>安裝
Windows系統第三方庫編譯後的版本 UCI頁面
Python計算生態概覽
從數據處理到人工智能
- 數據表示 採用合適方式用程序表達數據
- 數據清理 數據歸一化、數據轉換、異常值處理
- 數據統計 數據的概要理解,數量、分佈、中位數等
- 數據可視化 直觀展示數據內涵的方式
- 數據挖掘 從數據分析獲得知識,產生數據外的價值
- 人工智能 數據/語言/圖像/視覺等方面深度分析與決策
1.Python庫之數據分析
Numpy 表達N維數組的最基礎庫
- Python接口使用,C語言實現,計算速度優異
- Python數據分析及科學計算的基礎庫,支撐Pandas等
- 提供直接的矩陣運算、廣播函數、線性代數等功能
Pandas Python數據分析高層次應用庫
- 提供了簡單易用的數據結構和數據分析工具
- 理解數據類型與索引的關係,操作索引即操作數據
- Python最主要的數據分析功能庫,基於Numpy開發
Scipy 數學、科學和工程計算功能庫
- 提供了一批數學算法及工程數據運算功能
- 類似Matlab,可用於如傅里葉變換、信號處理等應用
- Python最主要的科學計算功能庫,基於Numpy開發
2.Python庫之數據可視化
Matplotlib 高質量的二維數據可視化功能庫
- 提供了超過100種數據可視化展示效果
- 通過
matplotlib.pyplot
子庫調用各可視化效果 - Python最主要的數據可視化功能庫,基於Numpy開發
Seaborn 統計類數據可視化功能庫
- 提供了一批高層次的統計類數據可視化展示效果
- 主要展示數據間分佈、分類和線性關係等內容
- 基於Matplotlib開發,支持Numpy和Pandas
Mayavi 三維科學數據可視化功能庫
- 提供了一批簡單易用的3D科學計算數據可視化展示效果
- 目前版本是Mayavi2,三維可視化最主要的第三方庫
- 支持Numpy、TVTK、Traits、Envisage等第三方庫
3.Python庫之文本
PyPDF2 用來處理pdf文件的工具集
- 提供了一批處理PDF文件的計算功能
- 支持獲取信息、分隔、整合文件、加密解密等
- 完全Python語言實現,不需要額外依賴,功能穩定
from PyPDF2 import PdfFileReader, PdfFileMerger
merger = PdfFileMerger()
input1 = open("document1.pdf","rb")
input2 = open("document2.pdf","rb")
merger.append(fileobj = input1,pages = (0,3))
merger.merge(position = 2,fileodj = input2,pages = (0,1))
output = open("document-output.pdf","wb")
merger.write(output)
NLTK 自然語言文本處理第三方庫
- 提供了一批簡單易用的自然語言文本處理功能
- 支持語言文本分類、標記、語法句法、語義分析等
- 最優秀的Python自然語言處理庫
from nltk.corpus import treebank #將自然語言文本轉化爲樹形結構
t = treebank.parsed_sents('wsj_0001.mrg')[0]
t.draw()
Python-docx 創建或更新Microsoft Word文件的第三方庫
- 提供創建或更新.doc .docx等文件的計算功能
- 增加並配置段落、圖片、表格、文字等,功能全面
from docx import Document
document = Document()
document.add_heading('Document Title',0)
p = document.add_paragraph('A plain paragraph having some')
document.add_page_break()
document.save('demo.docx')
4.Python之機器學習
Scikit-learn 機器學習方法工具集
- 提供了一批統一化的機器學習方法功能接口
- 提供聚類、分類、迴歸、強化學習等計算功能
- 機器學習最基本且最優秀的Python第三方庫
Tensorflow AlphaGo背後的機器學習計算框架
- 谷歌公司推動的開源機器學習框架
- 將數據流圖作爲基礎,圖節點代表運算,邊代表張量
- 應用機器學習方法的一種方式,支撐谷歌人工智能應用
import tensorflow as tf
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
res=sess.run(result)
print('result:',res)
MXNet 基於神經網絡的深度學習計算框架
- 提供可擴展的神經網絡及深度學習計算功能
- 可用於自動駕駛、機器翻譯、語音識別等衆多領域
- Python最重要的深度學習計算框架
從Web解析到網絡空間
5.Python庫之網絡爬蟲
Requests 最友好的網絡爬蟲功能庫
- 提供了簡單易用的類HTTP協議網絡爬蟲協議
- 支持連接池、SSL、Cookies、HTTP(S)代理等
- Python最主要的頁面級網絡爬蟲功能庫
import requests
r = requests.get('https://api.github.com',auth=('user','pass'))
r.status_code
r.headers['content-type']
r.encoding
r.text
Scrapy 優秀的網絡爬蟲框架
- 提供了構建網絡爬蟲系統的框架功能,功能半成品
- 支持批量和定時網頁爬取、提供數據處理流程等
- Python最主要且最專業的網絡爬蟲框架
pyspider 強大的Web頁面爬取系統
- 提供了完整的網頁爬取系統構建功能
- 支持數據庫後端、消息隊列、優先級、分佈式架構等
- Python重要的網絡爬蟲類第三方庫
6.Python庫之Web信息提取
Beautiful Soup HTML和XML的解析庫
- 提供瞭解析HTML和XML等Web信息的功能
- 又名beautifulsoup4或bs4,可以加載多種解析引擎
- 常與網絡爬蟲庫搭配使用,如Scrapy、Requests等
Re 正則表達式解析和處理功能庫
- 提供了定義和解析正則表達式的一批通用功能
- 可用於各類場景,包括定點的Web信息提取
- Python最主要的標準庫之一,無需安裝
Python-Goose 提取文章類型Web頁面的功能庫
- 提供了對Web頁面中文章信息、視頻等元數據的提取功能
- 針對特定類型Web頁面,應用覆蓋面較廣
- Python最主要的Web信息提取庫
from goose import Goose
url = 'http://www.elmundo.es/elmundo/2012/10/28/espana1351388909.html'
g = Goose({'use_meta_language':False,'target_language':'es'})
article = g.extract(url=url)
article.cleaned_text[:150]
7.Python庫之Web網站開發
Django 最流行的Web應用框架
- 提供了構建Web系統的基本應用框架
- MTV模式:模型(model)/模板(template)/視圖(Views)
- Python 最重要的Web應用框架,略微複雜的應用框架
Pyramid 規模適中的Web應用框架
- 提供了簡單方便構建Web系統的應用框架
- 不大不小,規模適中,適合快速構建並適度擴展類應用
- Python產品級Web應用框架,起步簡單可擴展性好
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def hello_world(request):
return Response('Hello World!')
if _name_ =='_main_':
with Configurator() as config:
config.add_route('hello','/')
config.add_view(hello_world,route_name='hello')
app = config.make_wsgi_app()
server = make_server('0.0.0.0',6543,app)
server.serve_forever()
Flask Web應用開發微框架
- 提供了最簡單構建Web系統的應用框架
- 特點:簡單、規模小、快速
- Django > Pyramid > Flask
from flask import Flask
app = Flask(_name_)
@app.route('/')
def hello_world():
return 'Hell0,World!'
8.Python庫之網絡應用開發
WeRoBot 微信公衆號開發框架
- 提供瞭解析微信服務器消息及反饋消息的功能
- 建立微信機器人的重要技術手段
import werobot
robot = werobot.WeRoBot(token='tokenhere')
@robot.handler
def hello(message):
return 'Hello World!'#對微信每個消息反饋一個Hello World
aip 百度AI開發平臺接口
- 提供了訪問百度AI服務的Python功能接口
- 語音、人臉、OCR、NLP、知識圖譜、圖像搜索等領域
- Python百度AI應用的最主要方式
MyQR 二維碼生成第三方庫
- 提供了生成二維碼的系列功能
- 基本二維碼、藝術二維碼和動態二維碼
從人機交互到藝術設計
9.Python庫之圖形用戶界面
PyQt5 Qt開發框架的Python接口
- 提供了創建Qt5程序的Python API接口
- Qt 是非常成熟的跨平臺桌面應用開發系統,完備GUI
- 推薦的Python GUI開發第三庫
wxPython 跨平臺GUI開發框架
- 提供了專用於Python的跨平臺GUI開發框架
- 理解數據類型與索引的關係,操作索引即操作數據
- Python最主要的數據分析功能庫,基於Numpy開發
import wx
app = wx.App(False)
frame = wx.Frame(None,wx.ID_ANY,"Hello World")
frame.show(True)
app.MainLoop()
PyGObject 使用GTK+開發GUI的功能庫
- 提供了整合GTK+、WebKitGTK+等庫的功能
- GTK+:跨平臺的一種用戶圖形界面GUI框架
- 實例:Anaconda採用該庫構建GUI
import gi
gi.require_version("Gtk","3.0")
from gi.repository import Gtk
window = Gtk.Window(title="Hello World")
window.show()
window.connect("destory",Gtk.main_quit)
Gtk.main()
10.Python庫之遊戲開發
PyGame 簡單的遊戲開發功能庫
- 提供了基於SDL的簡單遊戲開發功能及實現引擎
- 理解遊戲對外部輸入的響應機制及角色構建和交互機制
- Python遊戲入門最主要的第三方庫
Panda3D 開源、跨平臺的3D渲染和遊戲開發庫
- 一個3D遊戲引擎,提供Python和C++ 兩種接口
- 支持很多先進特性:法線貼圖、光澤貼圖、卡通渲染等
- 由迪士尼和卡尼基梅隆大學共同開發
cocos2d 構建2D遊戲和圖形界面交互式應用的框架
- 提供了基於OpenGL的遊戲開發圖形渲染功能
- 支持GPU加速,採用樹形結構分層管理遊戲對象類型
- 適用於2D專業級遊戲開發
11.Python庫之虛擬現實
VR Zero 在樹莓派上開發VR應用的Python庫
- 提供大量與VR開發相關的功能
- 針對樹莓派的VR開發庫,支持設備小型化,配置簡單化
- 非常適合初學者實踐VR開發及應用
pyovr Oculus Rift的Python開發接口
- 針對Oculus VR設備的Python開發庫
- 基於成熟的VR設備,提供全套文檔,工業級應用設備
- Python+虛擬現實領域探索的一種思路
Vizard 基於Python的通用VR開發引擎
- 專業的企業級虛擬現實開發引擎
- 提供詳細的官方文檔
- 支持多種主流的VR硬件設備,具有一定的通用性
12.Python庫之圖形藝術
Quads 迭代的藝術
- 對圖片進行四分迭代,形成像素風
- 可以生成動圖或靜圖圖像
- 簡單易用,具有很高展示度
ascii_art ASCII 藝術庫
- 將普通圖片轉爲ASCII藝術風格
- 輸出可以是純文本或彩色文本
- 可採用圖片格式輸出
turtle 海龜繪圖體系