我的Python學習之路01-附練習題

Anaconda Jupyter Lab環境配置,安裝及使用

簡單介紹

官網:https://www.anaconda.com/
簡單來說,Anaconda是包管理器和環境管理器,Jupyter notebook 可以將數據分析的代碼、圖像和文檔全部組合到一個web文檔中,事實上Anaconda 和 Jupyter notebook已成爲數據分析的標準環境。
參考文章:初學 Python 者自學 Anaconda 的正確姿勢是什麼?
怎麼在mac 系統上使用Python?怎麼安裝Anaconda?

正常安裝及啓動

Google免費Notebook CoLab

https://colab.research.google.com/notebooks/welcome.ipynb#scrollTo=-Rh3-Vt9Nev9

https://research.google.com/colaboratory/faq.html

Jupyter 和 Colaboratory 有什麼區別?
Jupyter 是一個開放源代碼項目,而 Colaboratory 是在 Jupyter 基礎之上開發的。通過 Colaboratory,您可以使用 Jupyter 筆記本並與他人共享,完全不需要在您自己的計算機上下載、安裝或運行任何內容,只要有瀏覽器就可以使用。

Docker方式安裝及啓動

  • 安裝Docker
  • 拉取鏡像:docker pull jupyter/datascience-notebook
  • 啓動容器 docker run -p 8888:8888 jupyter/datascience-notebook

其它Python IDE

VSCODE,SPYDER,PYCHARME

Notebook的更多使用 More…

Latex in markdown cell

LaTex符號大全
LaTeX實現的原理類似於HTML,Notebook中的Markdown格式解釋器中內置Latex渲染器,可以將由$與$包裹的內容進行渲染併產生最終效果。例如:

abf(x)dx\int_a^bf(x)dx

希臘字母
希臘字母小寫/大寫 LaTeX形式 希臘字母小寫/大寫 LaTeX形式
α A \alpha A μ N \mu N
β B \beta B ξ Ξ \xi \Xi
γ Γ \gamma \Gamma o O o O
δ Δ \delta \ Delta π Π \pi \Pi
ϵ ε E \epsilon \varepsilon E ρ ϱ P \rho \varrho P
ζ Z \zeta Z σ Σ \sigma \Sigma
η H \eta H τ T \tau T
θ ϑ Θ \theta \vartheta \Theta υ Υ \upsilon \Upsilon
ι I \iota I ϕ φ Φ \phi \varphi \Phi
κ K \kappa K χ X \chi X
λ Λ \lambda \Lambda ψ Ψ \psi \Psi
不同字體
mathbb:$\mathbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz}$   
mathscr:$\mathscr{ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz}$   
mathcal:$\mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz}$   
mathbf:$\mathbf{ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz}$

輸出結果爲

mathbb:ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz\mathbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz}
mathscr:ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz\mathscr{ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz}
mathcal:ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz\mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz}
mathbf:ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz\mathbf{ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz}

取消默認斜體

默認傾斜:$x_{z}$xzx_{z}
取消默認傾斜$\rm x_{z}$xz\rm x_{z}

特殊符號

$\bigcap_{i=1}^{n} \bigcup_{i=1}^n \binom{5}{3}$i=1ni=1n(53)\bigcap_{i=1}^{n} \bigcup_{i=1}^n \binom{5}{3}
$\forall$\forall :全稱量詞,表示任意的
$\exists$\exists:存在量詞,表示存在/至少一個
$\partial$\partial:偏導符號
$\propto$\propto:正比符號
$\mathop{\lim}_{n \to \infty }f(x)$limnf(x)\mathop{\lim}_{n \to \infty }f(x):無窮符號及極限

簡單公式

$y=x^2$y=x2y=x^2

$e^{i\pi} + 1 = 0$eiπ+1=0e^{i\pi} + 1 = 0

$e^x=\sum_{i=0}^\infty \frac{1}{i!}x^i$ex=i=01i!xie^x=\sum_{i=0}^\infty \frac{1}{i!}x^i

獨佔一行:$$\frac{n!}{k!(n-k)!} = {n \choose k}$$
n!k!(nk)!=(nk)\frac{n!}{k!(n-k)!} = {n \choose k}

矩陣
$A_{m,n} =
 \begin{pmatrix}
  a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
  a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
  \vdots  & \vdots  & \ddots & \vdots  \\
  a_{m,1} & a_{m,2} & \cdots & a_{m,n}
 \end{pmatrix}$

輸出結果爲

Am,n=(a1,1a1,2a1,na2,1a2,2a2,nam,1am,2am,n)A_{m,n} = \begin{pmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\ a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m,1} & a_{m,2} & \cdots & a_{m,n} \end{pmatrix}

Notebook中的Magic開關

  • 爲實現一些快捷操作,提升效率。Notebook中提供了Magic開關,能極大得優化我們使用Notebook的體驗。
  • Magic 開關分爲兩大類:%line magic & %%cell magic
Magic開關總覽
%lsmagic
%quickref
Line Magic
%config ZMQInteractiveShell.ast_node_interactivity='all'
%whos
%reset
Cell Magic
%%timeit 50
for item in range(100):
    a=item
    del a
%%time 
for item in range(100000):
    a=item
    del a
%%SVG
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 450 400" width="500" height="200">
  <rect x="80" y="60" width="250" height="250" rx="20" style="fill:red; stroke:black; fill-opacity:0.7" />
  <rect x="280" y="110" width="250" height="250" rx="40" style="fill:blue; stroke:black; fill-opacity:0.5;" />
</svg>
%%javascript

alert("hey");
%%html
<table>
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>
<marquee style='width: 30%; color: blue;'><b>Hey There!!!</b></marquee>
%%system
dir
!dir
%matplotlib inline
import numpy as np
from matplotlib import pyplot as plt

ys = 200 + np.random.randn(100)
x = [x for x in range(len(ys))]

plt.plot(x, ys, '-')
plt.fill_between(x, ys, 195, where=(ys > 195), facecolor='g', alpha=0.6)

plt.title("Fills and Alpha Example")
plt.show()
%matplotlib

Jupyter notebook擴展

Jupyter notebook功能擴展Nbextensions

python -m pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user --skip-running-check

添加對R語言的支持

在安裝完R後,進行conda install -c r r-essentials,再新建notebook測試

添加對Julia語言的支持

先安裝Julia,運行Julia,using Pkg;Pkg.add('IJulia');using IJulia;notebook()即可

添加對C的支持

conda install -c QuantStack -c conda-forge xeus-cling ,Try it Online

%%writefile a.py

for item in range(10):
    print(item)

Python簡介,解釋執行,運行方式

安裝Python

官網:https://docs.python.org/3/download.html
教程:https://www.runoob.com/python3/python3-tutorial.html

Python簡介

Python源碼目錄結構

  • Include: 這個目錄包括了 Python 的所有頭文件。
  • Lib:這裏是 Python 標準庫,都是用 Python 實現的。
  • Modules:用 C 語言編寫的模塊,比如 cStringIO / tkinter 高性能實現
  • Objects:Python 內建對象,如 int / list 的實現
  • Parser:Python 解釋器的 Scanner 和 Parser
  • Python:Python 解釋器的 Compiler 和執行引擎,運行核心

Python解釋與運行

Python解釋器interpreter

運行在系統線程上的C語言函數+超大循環。每個字節碼指令均對應一個完全由C實現的邏輯。

Python解釋器在執行過程

先對文件中的Python源代碼進行編譯,編譯的主要結果是產生的一組Python的字節碼(byte code),pyc文件是字節碼在磁盤上的表現形式,是進行import module時對py文件進行編譯的文件結果(如果之前編譯過,且源文件又沒有變化,則直接運行該pyc文件),而編譯結果就是Python中的PyCodeObject對象,然後PyCodeObject對象交給Python虛擬機(Virtual Machine),由虛擬機按照順序一條一條地執行字節碼,從而完成對Python程序的執行動作。

python: .py -->(編譯器)–>.pyc–>解釋器(虛擬機)–>返回結果

在編譯好的Python環境中,編譯器和解釋器都被封裝進了python36.dll中,由python.exe調用

延伸閱讀:Python解釋器

默認用到的都是用C語言實現的對Python的解釋器CPython。也有用Python實現的python解釋器PyPy,.Net實現的IronPython

  • CPython解釋器中的兩個棧:
    1. 執行棧Evaluation Stack:存儲指令操作數
    2. 塊棧Block Stack:存儲循環,異常等信息

字碼基於棧式虛擬機,沒有寄存器概念,轉譯簡單,沒有另類優化。不能被CPU執行,每條字節碼對應C實現的機器指令。
Python 實現了棧式虛擬機 (Stack-Based VM) 架構,通過與機器⽆關的字節碼來實現跨平臺執⾏能⼒。
這種字節碼指令集沒有寄存器,完全以棧 (抽象層⾯) 進⾏指令運算。

Python的兩種運行方式

1.解釋式運行:如PyCharme,或命令行下python pyname.py

  • 下方新建py文件
%%writefile test.py
import sys
print('the file run name ',sys.argv[0],'The time that file should run:',sys.argv[1])
for i in range(int(sys.argv[1])):
    print(i,'times run')
!python test.py 2

2.交互式運行

  • 命令行Python,bpython,ipython,notebook

延伸閱讀 PyCodeObject <module>

對Python編譯器來說,PyCodeObject對象是其真正的編譯結果,而pyc文件只是對象持久化表現形式
Python程序的字節碼在運行時以PyStringObject的形式保存在PyCodeObject的co_code域裏。co_code域只含有指令而不包含別的程序數據;變量名、常量等數據均放在別的域裏。

#內置函數compile可以編譯Python代碼
#source_code爲py源文件內容
source_code=\
'''
#this is documents
base_string='cccc.com'

def test1(a,b):
 return a+b

def test2(c):
 x=7
 print(c**2+x)
'''
co=compile(source_code,'test_compile8.py','exec')
exec(co)#類似於import test_compile.py,即執行了這個文件到當前會話

test1(2,6),test2(7)#可以看到test1,test2名稱已經導入當前名字空間

type(co)#code code類對象
co#<code object <module> at 0x000001FC85732300, file "test_compile.py", line 3> 該對象的一些信息


co.co_names#返回這個PyCodeobject對象內符號名集合,('base_string', 'test1', 'test2')
co.co_consts#返回這個PyCodeobject對象內常量集合
co.co_code
#co_code是指令序列,是一串二進制流,co_code只含有指令而不包含其它數據,如變量名、常量,數據放在別的區域裏。
#opcode-“字節碼”:指令以字節爲單位,最多表示256個不同的字節碼指令。

dir(co)#co.__dir__() 更多PyCodeObject對象查看
co?
##也可以直接從文件讀源碼,然後用compile編譯爲PyCodeObject
src=open('test.py').read()
co1=compile(src,'test.py','exec')
co1
dir(co1)
co1.co_filename
co1.co_filename
#對co_code的翻譯:opcode-“字節碼”:指令以字節爲單位,最多表示256個不同的字節碼指令。

import opcode
print(opcode.opmap)
# dir(opcode)

#更好的翻譯Disassembler

延伸閱讀:使用Disassembler反彙編模塊

  • 文檔: https://docs.python.org/3/library/dis.html
  • Disassembler格式及解讀
  • 第一列表示以下幾個指令在py文件中的行號;
  • 第二列是該指令在指令序列co_code裏的偏移量;
  • 第三列是指令opcode的名稱,分爲有操作數和無操作數兩種,opcode在指令序列中是一個字節的整數;
  • 第四列是操作數oparg,在指令序列中佔兩個字節,基本都是co_consts或者co_names的下標;
  • 第五列帶括號的是操作數說明。
opcode oparg opcode opcode oparg
1 byte 2 bytes 1 byte 1 byte 2 bytes
import dis
dis.dis(co)#反彙編module test_compile
# dis.dis(test1),dis.dis(test2)#反彙編module test_compile下的函數

Python內置及三方庫的管理及使用

模塊Module與包Package

  • 模塊:一個模塊就是一個Python源碼文件(也可能是對c語言文件編譯生成的pyd文件)
  • 包:組織一堆相關功能的模塊,幷包含__init__.py文件的目錄。

模塊的導入

一個模塊本質上是一個py文件

%%writefile m.py
a=123
_b='str'#
def m_fun():
    return globals()
%whos
import m
m.__name__
__name__
#修改源碼後不升效?試下reload
import m
from imp import reload

reload(m)
m.a
#一個進程只對應一個模塊的實例,無論被導入多少次,每個模塊在整個解釋器進程僅有一個實例存在。
#在不同的命令行窗口,不同的notebook是不同的解釋器進程
for i in range(5):
    import os
    print(id(os))
#reload也是一樣
for i in range(5):
    import os
    print(id(reload(os)))

模塊名爲__main__???

__name__

正常情況下模塊名__name__爲對應的文件名,但當模塊作爲程序入口時,name__被修改名__main
因此使用if name=’main’:實現自適應。

if __name__=='__main__':
    dosomething
擴展閱讀:使用type函數自定義模塊(非從文件中導入)
import types
mm=types.ModuleType('MyModule')
type(mm),type(__builtins__)
mm.name='f'
mm.__name__
擴展閱讀:模塊與名字空間

每個模塊都有一個全局名字空間。

如果直接在模塊級別執行,那麼當前名字空間和全局名字空間相同
globals()固定指向模塊的名字空間

locals() is globals() #每個模塊都有一個全局名字空間。如果直接在模塊級別執行,那麼當前名字空間和全局名字空間相同。
True
import m
globals() is m.m2_fun() #globals()固定指向模塊的名字空間
False

包的導入 import 的使用

import this#Python之禪

Python內置包

import sys
list(sys.modules.keys())
import requests
r=requests.get('http://www.google.com')
html_code=r.text
import os
os.system('mkdir os_test')
使用瀏覽器查看內置包

cmd命令行下運行,python -m pydoc -p 1234

三方包的管理

!pip list #列出所有的package

批量安裝Package

創建requirements.txt文件,將所需安裝的包的名字都分行放在裏

pip install -r ./requirements.txt

如何高效得使用幫助

str1='cccc.com'
str1.rjust?
help(exec)
?exec

延伸閱讀: PEP- Python增強建議書

PEP是Python Enhancement Proposals的縮寫。一個PEP是一份爲Python社區提供各種增強功能的技術規格,也是提交新特性,以便讓社區指出問題,精確化技術文檔的提案。

https://www.python.org/dev/peps/
https://www.python.org/dev/peps/pep-3104/
https://blog.csdn.net/ratsniper/article/details/78954852

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