Python基礎筆記

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
  • 強制縮進的壞處是複製粘貼不好用
  • 變量命名規則:大小寫字母、數字、下劃線和漢字等字符組合,大小寫敏感、首字符不能是數字、不與保留字相同

數據類型

  1. 整數可正可負,沒有取值範圍限制
    四種表示形式:十進制,二進制0b或0B開頭
    八進制以0o或0O開頭
    十六進制以0x或0X開頭
  2. 浮點數取值範圍和小數精度存在限制,取值範圍數量級爲-10^308~10^308,
    精度數量級爲10^-16,inf表示無限大。
    浮點數間計算存在不確定尾數,不是bug,可以round()函數四捨五入處理
    科學計數法使用字母e或E作爲冪表示,以10爲基數,如<a>e<b>表示a10b
  3. 複數類型 c=a+bj 其中實部用c.real獲得,虛部用c.imag獲得
  4. 布爾值:True False
  5. 空值:None
  6. 數值運算符 /(精確除法) ,//(地板除), %(取餘數),**(冪次方)
  7. 數值運算函數
    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變爲浮點數,增加小數部分

字符串

  1. 索引 :返回字符串中單個字符 <字符串>[M]
    切片:返回字符串中一段字符子串 <字符串>[M:N(:步長)]
  2. 字符串 轉義字符 \,r’ ’ 示不能轉義,”’…”’多行內容
    “\b” 回退 “\n”換行(光標移動到下行首) “\r”回車(光標移動到本行首)
  3. 字符串操作符
    x+y 連接兩個字符串
    n*xx*n 複製n次字符串x
    x in s 如果x是s的子串,返回True,否則返回False
  4. 字符串處理函數
    len(x) 返回字符串x的長度
    str(x)eval(x) 相反,將x加上引號變爲字符串
    hex(x)oct(x) 整數x的十六進制或八進制
    chr(u)ord(x) Unicode與單字符的互相轉換
    十二星座:ch(9800) ~chr(9812) =>♈♉♊♋♌♍♎♏♐♑♒♓
  5. 字符串處理方法
    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


  1. 字符串格式化

用法:<模板>.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<=TS<T 返回True/False,判斷S和T的子集關係
S>=TS>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 Sx 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.序列類型定義

  • 序列是具有先後關係的一組元素
  • 序列是一維元素向量,元素類型可以不同
  • 類似熟悉元素序列:S0,S1,...,Sn1
  • 元素間由序號引導,通過下表

序列是一個基類類型

包含字符串類型/元組類型/列表類型

序號的定義

2.序列處理函數及方法

  • 序列類型通用操作符
    x in sx not in s 判斷x是否爲s序列的元素
    s+t 連接兩個序列s和t
    s*nn*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'

文件的打開關閉
步驟:打開 –>操作–>關閉

Created with Raphaël 2.1.2文件的存儲狀態文件的存儲狀態文件的佔用狀態文件的佔用狀態a=open(,)a=close(,)

<變量名> =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數據存儲格式

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開發工具的批量安裝

Anaconda

  • 支持近800個第三方庫
  • 包含多個主流工具
  • 適合數據計算領域開發

3.文件安裝方法

  • 某些第三方庫pip下載後,需要編譯後再安裝
  • 如果操作系統沒有編譯環境,則能下載但不能安裝
  • 可以直接下載編譯後的版本進行安裝
  • 在UCI頁面上搜索第三方庫,下載對應版本編譯好的文件,使用pip install <文件名>安裝
    Windows系統第三方庫編譯後的版本 UCI頁面

Python計算生態概覽

從數據處理到人工智能

  • 數據表示 採用合適方式用程序表達數據
  • 數據清理 數據歸一化、數據轉換、異常值處理
  • 數據統計 數據的概要理解,數量、分佈、中位數等
  • 數據可視化 直觀展示數據內涵的方式
  • 數據挖掘 從數據分析獲得知識,產生數據外的價值
  • 人工智能 數據/語言/圖像/視覺等方面深度分析與決策

1.Python庫之數據分析

Numpy 表達N維數組的最基礎庫

  • Python接口使用,C語言實現,計算速度優異
  • Python數據分析及科學計算的基礎庫,支撐Pandas等
  • 提供直接的矩陣運算、廣播函數、線性代數等功能

Numpy

Pandas Python數據分析高層次應用庫

  • 提供了簡單易用的數據結構和數據分析工具
  • 理解數據類型與索引的關係,操作索引即操作數據
  • Python最主要的數據分析功能庫,基於Numpy開發

pandas

Scipy 數學、科學和工程計算功能庫

  • 提供了一批數學算法及工程數據運算功能
  • 類似Matlab,可用於如傅里葉變換、信號處理等應用
  • Python最主要的科學計算功能庫,基於Numpy開發

Scipy

2.Python庫之數據可視化

Matplotlib 高質量的二維數據可視化功能庫

  • 提供了超過100種數據可視化展示效果
  • 通過matplotlib.pyplot子庫調用各可視化效果
  • Python最主要的數據可視化功能庫,基於Numpy開發

Matplotlib

Seaborn 統計類數據可視化功能庫

  • 提供了一批高層次的統計類數據可視化展示效果
  • 主要展示數據間分佈、分類和線性關係等內容
  • 基於Matplotlib開發,支持Numpy和Pandas

Seaborn

Mayavi 三維科學數據可視化功能庫

  • 提供了一批簡單易用的3D科學計算數據可視化展示效果
  • 目前版本是Mayavi2,三維可視化最主要的第三方庫
  • 支持Numpy、TVTK、Traits、Envisage等第三方庫

Mayavi

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()

NLTK

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第三方庫

Scikit-learn

Tensorflow AlphaGo背後的機器學習計算框架

  • 谷歌公司推動的開源機器學習框架
  • 將數據流圖作爲基礎,圖節點代表運算,邊代表張量
  • 應用機器學習方法的一種方式,支撐谷歌人工智能應用
import tensorflow as tf
init =  tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
res=sess.run(result)
print('result:',res)

tensorflow

MXNet 基於神經網絡的深度學習計算框架

  • 提供可擴展的神經網絡及深度學習計算功能
  • 可用於自動駕駛、機器翻譯、語音識別等衆多領域
  • Python最重要的深度學習計算框架

MXNet

從Web解析到網絡空間

5.Python庫之網絡爬蟲

Requests 最友好的網絡爬蟲功能庫

  • 提供了簡單易用的類HTTP協議網絡爬蟲協議
  • 支持連接池、SSL、Cookies、HTTP(S)代理等
  • Python最主要的頁面級網絡爬蟲功能庫

Requests

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最主要且最專業的網絡爬蟲框架

Scrapy

pyspider 強大的Web頁面爬取系統

  • 提供了完整的網頁爬取系統構建功能
  • 支持數據庫後端、消息隊列、優先級、分佈式架構等
  • Python重要的網絡爬蟲類第三方庫

pyspider

6.Python庫之Web信息提取

Beautiful Soup HTML和XML的解析庫

  • 提供瞭解析HTML和XML等Web信息的功能
  • 又名beautifulsoup4或bs4,可以加載多種解析引擎
  • 常與網絡爬蟲庫搭配使用,如Scrapy、Requests等

Beautiful Soup

Re 正則表達式解析和處理功能庫

  • 提供了定義和解析正則表達式的一批通用功能
  • 可用於各類場景,包括定點的Web信息提取
  • Python最主要的標準庫之一,無需安裝

Re

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應用框架,略微複雜的應用框架

Django

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!'

Flask

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應用的最主要方式

aip

MyQR 二維碼生成第三方庫

  • 提供了生成二維碼的系列功能
  • 基本二維碼、藝術二維碼和動態二維碼

MyQR

從人機交互到藝術設計

9.Python庫之圖形用戶界面

PyQt5 Qt開發框架的Python接口

  • 提供了創建Qt5程序的Python API接口
  • Qt 是非常成熟的跨平臺桌面應用開發系統,完備GUI
  • 推薦的Python GUI開發第三庫

PyQt5

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()

wxPython

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遊戲入門最主要的第三方庫

PyGame

Panda3D 開源、跨平臺的3D渲染和遊戲開發庫

  • 一個3D遊戲引擎,提供Python和C++ 兩種接口
  • 支持很多先進特性:法線貼圖、光澤貼圖、卡通渲染等
  • 由迪士尼和卡尼基梅隆大學共同開發

Panda3D

cocos2d 構建2D遊戲和圖形界面交互式應用的框架

  • 提供了基於OpenGL的遊戲開發圖形渲染功能
  • 支持GPU加速,採用樹形結構分層管理遊戲對象類型
  • 適用於2D專業級遊戲開發

cocos2d

11.Python庫之虛擬現實

VR Zero 在樹莓派上開發VR應用的Python庫

  • 提供大量與VR開發相關的功能
  • 針對樹莓派的VR開發庫,支持設備小型化,配置簡單化
  • 非常適合初學者實踐VR開發及應用

VR Zero

pyovr Oculus Rift的Python開發接口

  • 針對Oculus VR設備的Python開發庫
  • 基於成熟的VR設備,提供全套文檔,工業級應用設備
  • Python+虛擬現實領域探索的一種思路

pyovr

Vizard 基於Python的通用VR開發引擎

  • 專業的企業級虛擬現實開發引擎
  • 提供詳細的官方文檔
  • 支持多種主流的VR硬件設備,具有一定的通用性

Vizard

12.Python庫之圖形藝術

Quads 迭代的藝術

  • 對圖片進行四分迭代,形成像素風
  • 可以生成動圖或靜圖圖像
  • 簡單易用,具有很高展示度

Quads

ascii_art ASCII 藝術庫

  • 將普通圖片轉爲ASCII藝術風格
  • 輸出可以是純文本或彩色文本
  • 可採用圖片格式輸出

ascii_art

turtle 海龜繪圖體系

turtle

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章