python學習之路:
編程:邏輯,背後原理(網絡、代理);
java、c、c++、python、c#、php、vb/.NET、js、go、perl、swift、ruby、R;
每個知識都是有用的,只是你位置不夠高,當你到達一定位置時才發現書讀少了;
荷蘭人guido van rossum(他是英國BBC喜劇《monty python's flying circus》的忠實粉絲),1989年創立了python,1991年初發布第一個公開發行版,2013年加入dropbox;
python來源於
全世界程序員爲python提供了11萬多的庫;
life is short,you need python;
python哲學:import this;
技能:
平臺:*nix;
系統:線程、進程、shell編程;
網絡:網絡原理、http、socket開發、異步IO;
web開發:偏後端、MVC框架、django、flask、tornado;
算法要求:轉置矩陣、求質數等現場能寫;
DB:關係型至少會mysql、nosql最好會一個;
可視化:html、js,browser痛點在於兼容性(user-agent);
linux運維工程師:知識體系龐大、集羣、虛擬化、web應用、大數據、雲計算等核心技術;
python開發工程師:最易入門的開發語言,應用非常廣泛;
基礎:OS、網絡基礎、DB基礎、python語言基礎……
進階:函數封裝思想、面向對象設計、裝飾器、描述器……
高級:網絡編程、併發編程、ORM、最新前端架構開發(ES6、react)……
實戰:web框架、博客系統、CMDB、跳板機;
運維工作:
職業方向:
運維自動化工程師:需求多樣,問題複雜;
全棧工程師:偏向web開發,web前後端開發;
大數據開發工程師:部分可使用python語言完成,注重算法應用;
分析工程師(數據科學家):科學計算、數據建模、注重算法的設計;
AI:facebook算法框架pytorch;
python該怎麼學?
多寫,寫好的代碼就是要不停的練習,唯手熟爾;
少問,對問題的解決能力,決定着你水平的高低;
不要盲目下手,先構思;
不管黑貓白貓,抓住老鼠就是好貓;
先不要苛求完美,先做出效果來;
忘了就去查手冊;
少看博客(僅作爲參考),多總結、多實踐;
慎用刪除;
再簡單的代碼,放在生產前,必須測試;
適當的註釋,例如:功能說明,負責的邏輯的實現說明;
通一門,則無所謂語言了,核心是程序邏輯;
代碼重構、優化——簡化複雜的語句,複用——函數;
學不學框架?架構;
學習不是囤積?
知識不是用來囤積的;
你需要的不是漂亮的書架;
你需要的不是海量的磁盤;
你需要的是夜以繼日的碼代碼,成爲驕傲的碼農;
#,octothorpe八角帽,pound英鎊,hash電話的#鍵,mesh網;
+,plus;
-,minus,subtract;
/,slash,divide;
\,back slash,escape sequences轉義序列;
\\,double back slash;
*,asterisk星號,multiply乘;
%,percent;
<,less than;
>,greater than;
<=,less than equal;
>=,greater than equal;
_,underscore;
=,equal,single equal;
==,double equal;
format string;
(),parenthesis;
,,comma;
''',triple quotes;
',quote;
'',double quote;
area面積;
girth周長;
radius半徑;
注:
一行不要超過80個字符,python風格;
round(),四捨六入五取偶;
%r和%s區別,%r用作debug(程序員用),%s用作顯示(用戶用);
input()和raw_input(),input()會把輸入的內容當python代碼處理,會帶來安全問題;
注:
print end1+...+end10,end11+...end20
與
print end1+...+end10,
print end11+...end20
]# pydoc raw_input
argv,argument variable參數變量(標準的編程術語);
modules <==> libraries
from sys import argv
script,first,second,third = argv #參數解包
def print_two(*args):
arg1,arg2 = args
print('arg1:%r,arg2:%r' % (arg1,arg2)) #參數解包
print_two('zed','shaw')
def print_two_again(arg1,arg2):
print('arg1:%r,arg2:%r' % (arg1,arg2))
print_two_again('zed','shaw')
import collections
collections.OrderedDict(dic) #字典排序
file.open()
file.close()
file.read()
file.readline()
file.readlines()
file.truncate() #清空文件
file.write()
版本:
2.*發展到了2.7;
3.*發展到了3.6,3.*始自2008年,3.5版本發佈於2015年,3.5與3.6差異大;
https://pythonclock.org/ #2.*版本的倒計時
不要迷信版本(重點是算法,解決問題的思路),學會一個版本,好好學會一門語言,其它都不是問題;
2.*與3.*區別:
語句函數化,如print(1,2)打印出1 2,2.*中是print語句打印元組,3.*中是函數的2個參數;
整除,如1/2和1//2,3.*中/爲自然除結果爲0.5,3.*中1//2爲整除結果爲0,2.*中/爲整除結果爲0;
3.*中raw_input重命名爲input,不再使用raw_input;
round函數,如round(5.5)和round(5.4),3.*中i.5的取整變爲距離最近的整數,3.*中round(5.5)結果爲6,2.*中round(5.5)結果爲6.0;
3.*中字符串統一使用unicode;
異常的捕獲,拋出的語法改變;
3.*以上版本不用關心編碼問題,如# -*- code: utf-8 -*-;
注:
SSD,電子電路;
普通disk,機械部件;
開發環境pyenv:
python多版本管理工具:
管理python解釋器;
管理python版本;
管理python的虛擬環境;
注:
win下安裝Python-3.5.3.tgz,第一步要選Add Python3.5 to PATH;
常用的源:清華(中科大),aliyun;
環境變量:win下先當前路徑再環境變量PATH路徑,linux下直接PATH路徑不找當前路徑;
vmware中的snapshot,有父子節點時,不要刪除父節點,否則在子節點下再創建快照時會有問題(當前分支下的所有快照樹可能會有問題);
安裝vmware tools,虛擬機設置-->共享文件夾-->問題啓用-->網絡中找到主機-->映射驅動器到Z;
win下沒有ss命令,可用netstat -tnlp;
https://github.com/pyenv/pyenv
https://github.com/pyenv/pyenv-virtualenv #使用此插件做包隔離
環境準備:
snapshot1(clear system):centos6.5,系統最小化安裝,開啓sshd,關閉iptables,配置yum源本地光盤,安裝vim;
snapshot2(base):關閉selinux,配置ntpd,網絡接口配置,密碼(單用戶模式下加S);
snapshot3(shutdown):關機,從此位置clone;
]# yum -y install git gcc make patch gdbm-devel openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel nss
]# useradd python
]# echo "python" | passwd --stdin python
]# su - python
]$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash #自動安裝,若報curl: (35) SSL connect error錯誤,先執行yum -y install nss;安裝完成後,注意最後提示內容
]$ vim ~/.bash_profile
#export PATH
#export PYENV_ROOT=/home/python/.pyenv
export PATH="/home/python/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
]$ . !$
. ~/.bash_profile
]$ python -V
Python 2.6.6
]$ pyenv version #當前版本,同python -V
system (set by /home/python/.pyenv/version)
]$ pyenv versions #pyenv管理的所有版本
* system (set by /home/python/.pyenv/version)
]$ pyenv install -l #--list,列出可安裝的版本
]$ pyenv install 3.5.3 -v #先下載再編譯安裝
]$ mkdir ~/.pyenv/cache #在此路徑下放入Python-3.5.3.tar.xz、Python-3.5.3.tgz、Python-3.5.3.tar.gz,用本地提供的文件裝,可省去在網上下載
]$ pyenv versions
* system (set by /home/python/.pyenv/version)
3.5.3
]$ pyenv -h
local Set or show the local application-specific Python version #local用於指定公共環境
global Set or show the global Python version #global全局,通常禁用此項
shell Set or show the shell-specific Python version #shell會話級別
install Install a Python version using python-build
]$ pyenv global 3.5.3 #禁用
]$ pyenv versions
system
* 3.5.3 (set by /home/python/.pyenv/version)
]$ pyenv global system
]$ pyenv versions
* system (set by /home/python/.pyenv/version)
3.5.3
]$ pyenv shell 3.5.3
]$ pyenv versions
system
* 3.5.3 (set by PYENV_VERSION environment variable)
]$ pyenv shell system
]$ pyenv versions
* system (set by PYENV_VERSION environment variable)
3.5.3
]$ mkdir -pv magedu/projects/
mkdir: created directory `magedu'
mkdir: created directory `magedu/projects/'
]$ cd !$
cd magedu/projects/
projects]$ pyenv local 3.5.3 #當前目錄及其下的子目錄是用local指定的,其它目錄不受影響,local用於指定公共環境;
projects]$ python -V
Python 3.5.3
projects]$ pyenv version
3.5.3 (set by /home/python/magedu/projects/.python-version)
projects]$ cd ..
magedu]$ python -V
Python 2.6.6
magedu]$ pyenv version
system (set by /home/python/.pyenv/version)
magedu]$ cd projects/
projects]$ mkdir test
[python@tmsapp projects]$ cd test/
[python@tmsapp test]$ python -V
Python 3.5.3
[python@tmsapp test]$ pyenv version
3.5.3 (set by /home/python/magedu/projects/.python-version)
]$ ll -h ~/.pyenv/plugins/pyenv-virtualenv/ #此插件作包隔離
]$ pyenv install 3.6.1 -v
]$ cd ~/magedu/projects/
]$ pyenv local system
]$ pyenv version
system (set by /home/python/magedu/projects/.python-version)
]$ mkdir cmdb
]$ cd cmdb
]$ pyenv versions
* system (set by /home/python/magedu/projects/.python-version)
3.5.3
3.6.1
]$ pyenv virtualenv 3.5.3 magedu353 #magedu353爲softlink,多出3.5.3/envs/magedu353和magedu353,如果與多人協同開發要用虛擬環境,且最好用虛擬環境,即此步創建的pyenv virtualenv 3.5.3 magedu353,若一個人使用可直接pyenv local VERSION公共環境;
Requirement already satisfied: setuptools in /home/python/.pyenv/versions/3.5.3/envs/magedu353/lib/python3.5/site-packages
Requirement already satisfied: pip in /home/python/.pyenv/versions/3.5.3/envs/magedu353/lib/python3.5/site-packages
[python@tmsapp cmdb]$ pyenv versions
* system (set by /home/python/magedu/projects/.python-version)
3.5.3
3.5.3/envs/magedu353
3.6.1
magedu353
]$ pyenv local magedu353 #此步操作後命令提示符會改變,之後每次進入~/magedu/projects/cmdb這個目錄後命令提示符都會變;
(magedu353) [python@tmsapp cmdb]$ pyenv version
magedu353 (set by /home/python/magedu/projects/cmdb/.python-version)
(magedu353) [python@tmsapp cmdb]$ pip -V
pip 9.0.1 from /home/python/.pyenv/versions/3.5.3/envs/magedu353/lib/python3.5/site-packages (python 3.5)
(magedu353) [python@tmsapp cmdb]$ cd ..
]$ mkdir web
]$ cd web/
]$ pyenv local 3.6.1
]$ pip -V #該版本的公共環境,若多人協同開發時會混,此方式不建議使用;
pip 9.0.1 from /home/python/.pyenv/versions/3.6.1/lib/python3.6/site-packages (python 3.6)
]$ cd
~]$ mkdir ~/.pip
~]$ vim .pip/pip.conf #pip默認使用官網下載包,改爲國內鏡像
index-url=https://mirrors.aliyun.com/pypi/simple/
trusted-host=mirrors.aliyun.com
~]$ cd magedu/projects/cmdb/
(magedu353) [python@tmsapp cmdb]$ pip install ipython redis jupyter
(magedu353) [python@tmsapp cmdb]$ pip list
(magedu353) [python@tmsapp cmdb]$ pip freeze > /tmp/packages.txt #或pip freeze -r /tmp/packages.txt,(freeze,Output installed packages in requirements format.獲取當前環境的包),可通過pip install -r /tmp/packages.txt在其它目錄或環境中重新安裝(-r,--requirement,Install from the given requirements file. This option can be used multiple times.)
(magedu353) [python@tmsapp cmdb]$ cat !$
cat /tmp/packages.txt
bleach==2.1.2
decorator==4.2.1
entrypoints==0.2.3
html5lib==1.0.1
ipykernel==4.8.2
ipython==6.2.1
ipython-genutils==0.2.0
ipywidgets==7.1.2
jedi==0.11.1
Jinja2==2.10
jsonschema==2.6.0
jupyter==1.0.0
jupyter-client==5.2.2
jupyter-console==5.2.0
jupyter-core==4.4.0
MarkupSafe==1.0
mistune==0.8.3
nbconvert==5.3.1
nbformat==4.4.0
notebook==5.4.0
pandocfilters==1.4.2
parso==0.1.1
pexpect==4.4.0
pickleshare==0.7.4
prompt-toolkit==1.0.15
ptyprocess==0.5.2
Pygments==2.2.0
python-dateutil==2.6.1
pyzmq==17.0.0
qtconsole==4.3.1
redis==2.10.6
Send2Trash==1.5.0
simplegeneric==0.8.1
six==1.11.0
terminado==0.8.1
testpath==0.3.1
tornado==4.5.3
traitlets==4.3.2
wcwidth==0.1.7
webencodings==0.5.1
widgetsnbextension==3.1.4
(magedu353) [python@tmsapp cmdb]$ cd ../web/
[python@tmsapp web]$ pip install -r /tmp/packages.txt #導入安裝
~]$ ll -h .pyenv/versions/3.5.3/envs/magedu353/lib/python3.5/site-packages/ #虛擬環境,要使用此種方式
~]$ ll -h .pyenv/versions/3.6.1/lib/python3.6/site-packages/
~]$ ll -h .pyenv/versions/3.5.3/lib/python3.5/site-packages/
]$ pyenv update #升級pyenv版本
pip saarch KEYWORD
pip help install #或pip install -h
-r, --requirement <file> Install from the given requirements file. This option can be used
multiple times.
ipython:
增強的python shell,自動補全、自動縮進、支持shell、增加了很多函數;
jupyter:
從ipython中獨立出來,獨立的交互式筆記本,後臺使用ipython,快捷鍵有:shift+enter、ctrl+enter、dd、m(markdown編輯,要先在行首單擊,再m);
(magedu353) [python@tmsapp cmdb]$ jupyter notebook password
(magedu353) [python@tmsapp cmdb]$ jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser
win中,http://localhost:8888/,登錄時忘記密碼:
>jupyter notebook --generate-config #會在家目錄的.jupyter下生成 C:\Users\Administrator\.jupyter\jupyter_notebook_config.py,修改此文件的第280行c.NotebookApp.token = 'generated'
IDE工具:
https://www.jetbrains.com/pycharm/ #建立項目、編寫代碼、運行
右鍵某一模塊(.py文件)-->Show in Open Folder
編程基礎:
程序:一組能讓計算機識別和執行的指令;
電子計算機:能夠執行程序的機器;
現代計算機:
alan mathison turing艾倫麥席森圖靈,1912.6.23-1954.6.7,英國數學家、邏輯學家,被稱爲計算機科學之父,人工智能之父,圖靈提出的著名的圖靈機模型爲現代計算機的邏輯工作方式奠定了基礎;
john von neumann馮諾依曼,1903.-1957,著名匈牙利裔美籍猶太人,數學家、計算機科學家、物理學家、化學家、數字計算機之父,他提出了以binary作爲數字計算機的數制基礎,計算機應該按照程序順序執行,計算機應該有五大部件;
馮諾依曼體系架構:
cpu:運算器+控制器,運算器完成各種算數運算、邏輯運算、數據傳輸等數據加工處理,控制器控制程序的執行;
存儲器:用於記憶程序和數據,如內存;
輸入設備:將數據或程序輸入到計算機中,如keyboard、mouse;
輸出設備:將數據或程序的處理結果展示給用戶,如顯示器、printer等;
計算機語言;
機器語言;
彙編語言;
語言分類:
低級語言:面向機器的語言,包括機器語言、彙編語言;不同的機器不能通用,不同的機器需要不同的機器指令或彙編程序;
高級語言:
接近自然語言和數學語言的計算機語言;
高級語言首先要書寫源程序,通過編譯程序把源程序轉換成機器指令的程序;
1954年正式發佈的fortran(IBM)語言是最早的高級語言,本意是公式翻譯;
人們只要關心怎麼寫源程序,針對不同機器編譯的事交給編譯器關心處理;
語言越高級,越接近人類的自然語言和數學語言;
語言越低級,越能讓機器理解;
高級語言和低級語言之間需要一個轉換的工具:編譯器、解釋器;
c、c++等語言的源代碼需要本地編譯;
java、python、c#的源代碼需要被解釋器編譯成中間代碼bytecode,在虛擬機pvm(同jvm)上運行;
編譯語言,把源代碼轉換成目標機器的cpu指令;
解釋語言,解釋後轉換成字節碼,運行在虛機上,解釋器執行中間代碼;
高級語言的發展:
非結構化語言:編號或標籤、goto、子程序多個入口和出口;有分支、循環;
結構化語言:任何基本結構只允許是唯一入口和唯一出口;順序、分支、循環、廢棄goto;
面嚮對象語言:更加接近人類認知世界的方式,萬事萬物抽象成對象,對象間關係抽象成類和繼承;封裝、繼承、多態;
函數式語言:古老的編程範式,應用在數學計算、並行處理的場景,引入到了很多現代高級語言中;函數是“一等公民”,高階函數;如:MS的F語言,JAVA的scaler;
program程序:
程序=算法+數據結構;
算法,解決問題的辦法,處理數據的方式,算法有優劣之分;
數據是一切程序的核心,數據結構是數據在計算機中的類型和組織方式;
寫程序難點:
理不清數據;
搞不清處理方法;
無法把數據設計轉換成數據結構,無法把處理方法轉換成算法;
無法用設計範式來進行程序設計;
世間程序皆有bug,但不會debug;
python解釋器:
官方cpython,c語言開發,最廣泛的python解釋器;
ipython,一個交互式、功能增強的cpython;
pypy,python語言寫的python解釋器,JIT(just in time)技術,動態編譯python代碼;
jython,python的源代碼編譯成java的字節碼,運行在jvm上;
IronPython,與java類似,運行在.NET平臺上的解釋器,python代碼被編譯成.NET的字節碼;
高級:
原碼、反碼、補碼;
GC內存管理;
改pip鏡像:
mkdir ~/.pip
vim ~/.pip/pip.ini
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com
win下:
%APPDATA%,即進到C:\Users\Administrator\AppData\Roaming下;
創建pip目錄;
在pip目錄下pip.ini
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com
win10下pycharm:
用pip安裝包時,raw write() returned invalid length 2 (should have been between 0 and 1)
用命令chcp查看,默認936;
chcp 65001 #改爲utf8,依舊不起作用;
解決:pycharm編輯框上方有提示,點install;
pycharm調試django項目:
Run-->Edit Configurations
+-->Python
Script Path(項目中的manage.py),Parameters(命令寫runserver,也可其它命令);
在代碼中打斷點,Run-->運行Debug 'debug'