# 這門課程是我最強烈推薦的python入門課程之一。緣由有三:其一,其更加關注編程的思想,極具備啓發性;其二,」小「但系統,可擴展性強;其三,有配套線上練習和測試。前端
# 本文將每次更新一個章節,直到課程結束。java
# 本文從5.28--6.7日,歷時11天,基本更新完畢,後面還有兩張不屬於python基礎,後續將以demo的方式進行詳細講解。python
計算機是根據指令操做數據的設備 計算機發展參照摩爾定律,表現爲指數形式
計算機執行源程序兩種方式:編譯和解釋
編譯:將源代碼一次性轉換成目標代碼的過程。執行編譯過程的程序叫編譯器(compiler)。
解釋:將原代碼逐條轉換成目標代碼同時逐條運行的過程。執行解釋過程的程序叫解釋器(interpreter)。
靜態語言:使用編譯執行的編程語言(C/C++,java)
腳本語言:使用解釋執行的編程語言(Python,JavaScript,PHP)
IPO:
input輸入:文件輸入、控制檯輸入、交互輸入、內部參數輸入等。
process處理(主要邏輯):算法(靈魂)
output輸出:控制檯、文件、網絡、操做系統內部變量等輸出。
編程體現一種抽象交互、自動化執行的思惟方式 計算思惟:區分邏輯思惟和實證思惟的第三種思惟模式。
略
題目自己簡單,但學會這種思惟,其餘常見的"轉換"問題解決方法同理。
python中用"縮進"表達程序的語法框架,表達代碼間包含關係的惟一手段
註釋:用於提升代碼可讀性的輔助文字,不被執行。
變量:用來保存和表示數據的佔位符號,變量採用標識符(名字)來表示。
命名:數字字母下劃線。
"注意":大小寫敏感,數字不能放開頭,不與保留字同。
python中共有33個保留字,查詢方法:
```
import keyword
print(keyword.kwlist)
```
字符串:由0個或多個字符組成的"有序"字符序列。# 有序-->能夠索引、切片
整數:數學中的整數
浮點數:數學中的實數,帶有小數點部分
列表:由0個或多個數據組成的"有序"序列
賦值語句 分支語句 函數
input()控制檯輸入
print()控制檯輸出,格式化
注:這兩兄弟,在控制檯顯示的時候,一個添加引號造成字符串,一個將字符串自動去掉引號。
補充:"eval()"去掉參數最外側引號並執行餘下語句的函數
略
1946-1981:計算機系統結構時代(35年):
1981-2008:網絡和視窗時代(27年)
2008-2016:複雜信息系統時代(8年)
2016- :人工智能時代
計算能力問題-->交互問題-->數據問題-->人類的問題
C: 性能
Java:跨平臺
C++: 大規模程序
VB: 桌面應用
Python:計算時代演進的選擇
通用語言 腳本語言 開源、跨平臺、多模型語言
C/C++:python歸python ,c歸c
Java:針對特定開發和崗位需求
HTML/CSS/JS:不可替代的前端技術,全棧能力
其餘語言: R/Go/Matlab等,特定領域
工具決定思惟:關注工具變革的力量!
機器語言 --> 代碼直接執行,與CPU有關
彙編語言 --> 助記符,彙編器,與CPU有關
高級語言 --> 編譯器,與CPU無關
超級語言 --> 整合已有程序,龐大計算生態
== python是惟一的超級語言! ==算法
== import turtle == 導入海歸繪圖庫編程
Python蟒蛇繪製問題是各種圖形繪製問題的表明
--圓形繪製、五角星繪製、國旗繪製、機器貓繪製...
--注:turtle庫是turtle繪圖體系的python實現 --1969年誕生,是python標準庫之一,入門級圖形繪製函數庫 --Python計算生態 = 標準庫 + 第三方庫 -庫Library、包Package、模快Module,統稱模塊
turltle.setup(width, height, startx, starty)
--注:4個參數後兩個可選,不選則默認在窗口的正中間,setup()不是必須的
--1)絕對座標:和數學中的座標系(象限)知識相同 --turtle.goto(x,y)
--2)海龜座標:後退<-->前進;左側<-->右側
--3)空間座標體系:turtle.bk(d),turtle.fd(d),burtle.circle(r,angle)
--1)絕對角度:0/360,90/-270,180/-180,270/-90 --turtle.seth(angle):改變海龜行進方向,angle爲絕對度數,只改變方向不前進。
--2)海龜角度:turtle.left(angle),turtle.right(angle)
--RGB指 紅 藍 綠 組合 --RGB整數值,小數值 --turtle.colormode(mode),默認小數值
import turtle
turtle. 格式:<a>.<b>()
<庫名>.<函數名>(<函數參數>)
或 <庫別名>.<函數名>(<函數參數>)
penup(),pendown(),pensize(),pencolor()
別名:pu(),pd()
pensize(width) --> 別名:width(width)
pencolor(color) 顏色字符串、rgb值(三個小數值,或 一個元組小數值)
fd(),circle(r,extent=None)
--r:默認圓心在海龜左側r距離的位置 --extent:繪製角度,默認是360度整圓
turtle.setheading(angle) 別名: seth(angle)
turtle.left(),turtle.right()
--3.1.1整數類型:與數學中概念一致,+|-都可,無範圍限制 --pow(x,y)函數 --3.1.2 4種進製表示形式: 十進制,二進制(0b,0B開頭),八進制(0o,0O開頭),十六進制(0x,0X)
--3.1.3浮點數類型:浮點數範圍和小數精度都存在限制,但常規計算能夠忽略 浮點數間運算存在不肯定尾數,發生在10E-16左右,不是bug
-- round(x,d):對x四捨五入,d是小數截取位數。用於浮點數間運算及比較。 -- 浮點數採用科學計數法表示<a>e<b>
--3.1.4複數類型:Z.real得到實部,Z.imag得到虛部
--3.1.5數值運算操做符:類型間能夠混合運算,生成結果爲「最寬」類型。
--數值運算函數: -- abs(x) 絕對值 -- divmod(x,y) => 同時輸出商和餘數 -- pow(x,y[,z]) => 冪餘,(x**y)%z -- round(x[,d]) => 四捨五入,d小數位數,默認爲0 -- max()最大值 -- min()最小值 -- int(x) -- float() -- complex(x)
略 - GRIT,堅毅,對長期目標的持續激情及持久耐力 - GRIT是得到成功最重要的因素之一,牢記每天向上的力量
-- 單引號,雙引號;三引號 -- 索引 [M] -- 切片 [M,N,K] -- 轉義字符:\b回退,\n換行,\r回車(光標移到本行行首)
-- + 字符串拼接 -- * 複製n次字符串 -- in
-- len(x) -- str(x) 任意類型所對應的字符串形式 -- hex(x)或oct(x) 整數x的十六進制或八進制小寫形式字符串 -- chr(u) u爲Unicode編碼,返回其對應的字符 -- ord(x) x爲字符,返回其對應的Unicode編碼
-- S.lower()或S.upper() 返回字符串副本,所有字符小寫/大寫 -- S.split(sep=None) 返回一個列表,由str根據sep被分隔部分組成 -- S.count(sub) 返回子字符串sub在str中出現的次數 -- S.replace(old,new) -- S.center(width[,fillchar]) -- S.strip(chars)從str中去掉在其左側和右側chars中列出的字符。 -- S.join(iter) 在iter變量除最後元素外每一個元素增長一個S。例如:','.join("12345") #主要用於字符串分割
"{<參數序號>:<格式控制標記>}"
:<填充><對齊><寬度><,><.精度><類型>
時間獲取:time() ctime() gmtime()
時間格式化: strftime() strptime()
程序計時:sleep(),perf_counter()
.time() 獲取當前時間戳,即計算計算機內部時間值,浮點數。
.ctime()獲取當前時間並以易讀方式表示,返回字符串
.gmtime()獲取當前時間,表示爲計算機可處理的時間格式
.strftime(tpl,ts) : tpl是格式化模板字符串,用來定義輸出效果,ts是計算機內部時間類型變量
t = time.gmtime()
time.strftime("%Y-%m-%d %H:%M:%S", t)
t = time.gmtime()
time.strftime("%Y-%m-%d %H:%M:%S", t)
timeStr = "2018-01-26 12:55:20"
time.strptime(timeStr,"%Y-%m-%d %H:%M:%S")
start = time.perf_counter()
end = time.perf_counter()
end - start
sleep(s) s擬休眠時間,單位是秒,能夠是浮點數
這裏理解一個重要的系統概念:刷新
本質:用後打印的字符串覆蓋以前的字符串。不能換行(end=),要能回退\r
# TextProBarV3.py
import time
scale = 50
print("執行開始")
start = time.perf_counter()
for i in range(scale + 1):
a = "*" * i
b = "." * (scale - i)
c = (i / scale) * 100
dur = time.perf_counter() - start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c, a, b, dur), end="")
time.sleep(0.1)
print("\n" + "執行結束".center(scale // 2, "-"))
「程序的控制結構」:順序結構、分支結構、循環結構
語法: if <條件>:
<語句塊>
語法: if <條件>:
<語句塊1>
else:
<語句塊2>
緊湊形式:適用於簡單表達式的二分支結構
<表達式1> if <條件> else <表達式2>
語法:if <條件1>:
<語句塊1>
elif <條件2>:
<語句2>
...
else:
<語句塊N>
注: 注意多條件之間的包含關係,注意變量取值範圍的覆蓋。 通俗點: 多分支結構中,若是一個分支判斷條件經過後,會執行對應的語句塊,以後結束分支程序。即便,後續的elif條件也知足,也不會執行對應的語句塊.因此這裏其實也有一個順序關係。windows
--條件判斷操做符:<,<=,>=,>,==,!=
--條件組合三個保留字:and,or,not
try:
<語句塊1>
except [<異常類型>]:
<語句塊2>
注:標註異常類型後,僅響應該異常,異常類型名字等同於變量。
高級使用:
try:
<語句塊1>
except:
<語句塊2>
else: # 不發生異常的時候執行(獎勵)
<語句塊3>
finally: # 必定會執行
<語句塊4>
BMI = 體重(Kg)/身高^2(m^2)
略
注:閱讀代碼的時候,快速的方法是:先搞懂分支的範圍關係,再深刻看每一個分支在作什麼。而不是從上到下的順序結構。
###4.3.1 遍歷循環設計模式
for <循環變量> in <遍歷結構>: <語句塊> --從遍歷結構中逐一提取元素,放在循環變量中。 --完整遍歷全部元素後結束 --每次循環,所得到元素放入循環變量,並執行一次語句塊 應用:計數循環、字符串遍歷循環、列表遍歷循環、文件遍歷循環、等等
while <條件>:
<語句塊>
-break 跳出並結束當前循環,執行循環後的語句
-continue 結束當次循環,繼續執行後續次數循環
--break和continue能夠與for和while循環搭配使用。
循環中增長else:
<語句塊2>
--當循環沒有被break語句退出時,執行else語句塊 --else語句塊做爲「正常」完成循環的獎勵 --這裏else的用法與異常處理中else用法類似
--僞隨機數:採用梅森旋轉算法生成的(僞)隨機序列中元素 --random庫主要用於生成隨機數
seed(a=None) --初始化給定的隨機數種子,默認爲當前系統時間
--random.seed(10) # 產生種子10對應的序列 --這個在實戰中用的比較多,「肯定」的僞隨機數便於對程序進行復現。
random()
--生成一個[0.0,1.0)之間的隨機小數 --random.random()
>1. randint(a,b) 生成[a,b]之間的整數
>2. randrange(m,n[,k]) 生成一個[m,n)之間以k爲步長的隨機整數
>3. getrandbits(k) 生成一個k比特長的隨機整數
>4. uniform(a,b) 生成一個[a,b]之間的隨機小數
>5. choice(seq) 從序列seq中隨機選擇一個元素
>6. shuffle(seq) 將序列seq中元素隨機排列,返回打亂後的序列
from random import random
from time import perf_counter
DARTS = 1000 * 1000
hits = 0.0
start = perf_counter()
for i in range(1, DARTS+1):
x, y = random(), random()
dist = pow(x ** 2 + y ** 2, 0.5)
if dist <= 1.0:
hits += 1
pi = 4 * (hits / DARTS)
print("圓周率是:{}".format(pi))
print("運行時間是:{:.5f}s".format(perf_counter() - start))
函數是一段具備特定功能、可重用的語句組
下降編程難度 和 代碼複用
def <函數名>(<參數(0個或多個)>):
<函數體>
return <返回值>
不調用不會被執行
調用是運行函數代碼的方式 -調用時給出實際參數,替代定義中的形式參數 -函數調用獲得返回值
-- 參數的個數:0,1,或多個。可是必須保留括號
-- 可變數量參數,既不肯定參數總數量
-- 傳遞參數兩種方式:位置參數,名稱傳遞
-- return 保留字用來傳遞返回值 -- 能夠傳,能夠不傳,能夠傳遞0個,也能夠傳多個
-- (通常函數外部是全局變量,函數內部的變量是局部變量) 規則一:局部變量和全局變量是不一樣變量 --局部變量是函數內部的佔位符,與全局變量可能重名但不一樣 --函數運算結束後,局部變量被釋放 --能夠用 global保留字在函數內部使用全局變量 (這裏還分可變類型和不可變類型) 規則二:局部變量爲組合數據類型且未建立,等同於全局變量 使用規則: -基本數據類型,不管是否重名,局部變量與全局變量不一樣 -能夠經過global保留字在函數內部聲明全局變量 -組合數據類型,若是局部變量未真實建立,則是全局變量
無名,保留字,函數名是返回結果
<函數名> = lambda <參數>:<表達式>
--主要做用 特定函數或方法 的參數 -- 固定使用方式,逐步積累掌握 -- 通常狀況,用def定義普通函數,慎用lambda
--1. 繪製單個數字對應的數碼管 --2. 得到一串數字,繪製對應的數碼管 --3. 得到當前系統時間,繪製對應的數碼管
分析單個數碼管:數組
獲取一段數字,繪製多個數碼管:瀏覽器
獲取當前系統時間:ruby
PS:分形幾何,天然界常見
6.2.1 定義
6.2.2 函數和方法
6.2.3 元組類型及操做
6.2.4 列表類型及操做
6.2.5 序列類型應用場景
6.4.1 定義
函數和方法
應用場景
略
7.1.1 文件的類型
7.1.2 文件打開和關閉
讀文件:3種方法 VS 寫文件: 3種方法 -文件的打開: <變量名> = open(<文件名>,<打開模式>)
變量名:文件句柄
文件名:文件路徑和名稱(源文件同目錄可省略)
打開模式:文本or二進制;讀or寫
補充:windows下,文件目錄之間用\,這個和python衝突,解決方式兩種:\\,或者用/ .
打開模式:
文件打開模式 | 描述 |
---|---|
"r" | 只讀模式,默認值,若文件不存在,返回FileNotFoundError |
"w" | 覆蓋寫模式,文件不存在則建立,存在則徹底覆蓋 |
"x" | 建立寫模式,文件不存在則建立,存在則返回FileExistsError |
"a" | 追加寫模式,文件不存在則建立,存在則在文件最後追加內容 |
"b" | 二進制文件模式 |
"t" | 文本文件模式,默認值 |
"+" | 與r/w/x/a一同使用,在原功能基礎上增長同時讀寫功能 |
文件關閉:變量名.close()
7.1.3 文件內容的讀取
操做方法 | 描述 |
---|---|
<f>.read(size=-1) | 讀入所有內容,若是給出參數,讀入前size長度 |
<f>.readline(size=-1) | 讀入一行內容,若是給出參數,讀入該行前size長度,每讀取一行指針移動到下一行的行首。 |
<f>.readlines(hint=-1) | 讀入文件全部行,以每行爲元素造成列表。若是給出參數,讀入前hint行。 |
fo = open(filename,"r")
txt = fo.read(2)
while txt != "":
# 對txt進行處理
txt = fo.read(2)
fo.close()
fo = open(filename,"r")
for line in fo.readlines():
print(line)
fo.close()
fo = open(filename,"r")
for line in fo: # 經過迭代器訪問
print(line)
fo.close()
操做方法 | 描述 |
---|---|
<f>.write(s) | 向文件寫入一個字符串或字節流 |
<f>.writelines(lines) | 將一個元素全爲字符串的列表寫入文件 |
<f>.seek(offset) | 改變當前文件操做指針的位置,offset含義以下:0 - 文件開頭;1 - 當前位置;2 - 文件結尾 |
fo = open("output.txt", "w+")
ls = ["中國", "法國", "美國"]
fo.writelines(ls)
fo.seek(0) # 不然,沒有結果輸出
for line in fo:
print(line)
fo.close()
7.2.1 問題分析
7.2.2 實例講解
7.2.3 觸類旁通
7.3 一維數據的格式化和處理
7.3.1 數據組織的維度:組織形式
一維數據的表示
一維數據的存儲
一維數據的處理
7.4 二維數據的格式化和處理
fo = open(filename)
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 cloumn in row:
print(ls[row][column])
8.1 實例13:體育競技分析
8.2 Python程序設計思惟
8.3 Python第三方庫安裝
8.4 模快7:os庫的基本使用
os庫是標準庫,包含幾百個函數,經常使用路徑操做、進程管理、環境參數等幾類
8.4.1 路徑操做:os.path子庫,處理文件路徑及信息
函數 | 描述 |
---|---|
os.path.abspath(path) | 返回path在當前系統中的絕對路徑 |
os.path.normpath(path) | 歸一化,統一用\\分隔路徑 |
os.path.relpath(path) | 返回相對路徑 |
os.path.dirname(path) | 返回Path中目錄名稱 |
os.path.basename(path) | 返回path中最後的文件名稱 |
os.path.join(path,*paths) | 組合path,返回路徑字符串 |
os.path.exists(path) | 判斷path對應文件目錄是否存在,返回bool |
os.path.isfile(path) | 判斷path所對應是否爲已存在的文件,返回bool |
os.path.isdir(path) | 判斷path所對應是否爲已存在的文件,返回bool |
os.path.getatime(path) | 返回path對應文件或目錄上一次的訪問時間 |
os.path.getmtime(path) | 返回path對應文件或目錄最近一次的修改時間 |
os.path.getctime(path) | 返回path對應文件或目錄的建立時間 |
os.path.getsize(path) | 返回path對應文件的大小,以字節爲單位 |
8.4.2 進程管理:啓動系統中其餘程序
8.4.3 環境參數:得到系統軟硬件信息等環境參數
函數 | 描述 |
---|---|
os.chdir(path) | 修改當前程序操做的路徑 |
os.getcwd() | 返回程序的當前路徑 |
os.getlogin() | 得到當前系統登錄用戶名 |
os.cpu_count() | 得到當前系統的CPU數量 |
os.urandom(n) | 得到n個字節長度的隨機字符串,一般用於加解密運算 |
8.5 實例14:第三方庫自動安裝腳本