「本文面相有 必定編程基礎 的朋友學習,因此略過了 環境安裝、IDE 搭建 等一系列簡單繁瑣的事情。html
Python 英文原意爲 「蟒蛇」,直到 1989
年荷蘭人 Guido van Rossum (簡稱 Guido)發明了一種 面向對象 的 解釋型 編程語言,並將其命名爲 Python,才賦予了它表示一門編程語言的含義。python
「說到 Python 的誕生,極具戲劇色彩,據 Guido 的自述記載,Python 語言是他在聖誕節期間爲了打發時間開發出來的,之因此會選擇 Python 做爲該編程語言的名字,是由於他是一個叫 Monty Python 戲劇團體的忠實粉絲。git
做爲電子元器件的 計算機,實際上 只能 識別某些 特定的二進制指令 (特殊的 01
組合),但因爲 人類閱讀 這些 指令 很是難以閱讀,加上使用這些指令編寫程序的 耗時 太過於 冗長,因此,人們在此基礎上再次制定了一套規範,採用特定的 人類可閱讀 的代碼編寫,待到要執行時再 翻譯 回特定二進制指令,這樣就幫助了人們更加輕鬆地理解和閱讀程序邏輯了。程序員
這也就是所謂如今的 "高級編程語言" 了。github
上述 翻譯 這個過程 (其實至關複雜,涉及語法分析、語義分析、性能優化等等..) 其實也是由一個特定程序來執行的,那 何時將源代碼翻譯成二進制指令呢?,不一樣的編程語言有不一樣的規定:web
.exe
) 好比:C 語言、C++、Golang、彙編等。使用的轉換工具咱們稱爲
編譯器。
「Java 和 C# 是一種比較奇葩的存在,它們是 半編譯半解釋型 的語言,源碼須要先轉換成一種中間文件 (字節碼文件),而後再把中間文件拿到 虛擬機 中執行。Java 引領了這種風潮,它的初衷是在跨平臺的同時兼顧執行效率。正則表達式
上圖 就展現了兩種不一樣類型語言的執行流程的不一樣,兩種方式對比起來總結以下:算法
sleep()
參數是毫秒,而 Windows 中是
Sleep()
(首字母大寫) 參數是秒,這就致使了
源代碼也不能跨平臺;
Python 屬於典型的解釋型語言,因此運行 Python 程序須要解釋器的支持,只要你在不一樣的平臺安裝了不一樣的解釋器,你的代碼就能夠隨時運行,不用擔憂任何兼容性問題,真正的 「一次編寫,處處運行」。spring
Python 幾乎支持全部常見的平臺,好比 Linux、Windows、Mac OS、Android、FreeBSD、Solaris、PocketPC 等,你所寫的 Python 代碼無需修改就能在這些平臺上正確運行。也就是說,Python 的 可移植性 是很強的。shell
面向對象 和 面向過程 是咱們使用計算機編程解決問題的兩種不一樣方式的方案。
面向過程 能夠說是一種 基於事件 or 過程 來描述的編碼方式,譬如「把大象放進冰箱」就能夠描述成那經典的三個步驟,「把牛放進冰箱」又是另外一個類似的經典三步,只是這樣單獨的事件 or 過程多了以後,隨着項目複雜度的增長,項目會變得很是難以維護。
「軟件危機最典型的例子莫過於 IBM 的
System/360
的操做系統開發。佛瑞德·布魯克斯(Frederick P. Brooks, Jr.)做爲項目主管,率領2000
多個程序員夜以繼日的工做,共計花費了5000
人一年的工做量,寫出將近100
萬行的源碼,總共投入5
億美圓,是美國的 「曼哈頓」 原子彈計劃投入的1/4
。儘管投入如此巨大,但項目進度卻一再延遲,軟件質量也得不到保障。布魯克斯後來基於這個項目經驗而總結的《人月神話》一書,成了史上最暢銷的軟件工程書籍。
引用自:http://www.kancloud.cn:8080/yunhua_lee/oobaodian/110880
儘管 結構化的程序設計 (將一個大問題逐步劃分紅一個一個的小問題) 可以幫助咱們解決一部分問題,但 面向過程 仍然有一些不符合人類慣有的思考方式,譬如說:我今天想去存錢,我不會說「請拿走個人銀行卡和錢,而後在我卡上充值上相應的數目,最後把銀行卡還給我謝謝」,而我只會說「存錢,謝謝」,由於人大部分時間都是基於 對象 (或者能夠說角色) 來思考的。
對於 面向過程 最好的總結多是:「程序 = 算法 + 數據結構」,而對於 面向對象 來講則能夠更改成:「程序 = 對象 + 交互」。
上面的 漫畫 很好地說明了 Python 快速構建工具的能力,這也是 Why Python
的一大理由。下面根據慣例列舉一些讓咱們足以選擇 Python 的緣由。
Python 的設計足夠簡單和易於使用,這樣使得初學者可以從中不斷得獲取到樂趣以繼續 Python 之旅。
另外做爲一種很是高級的語言,Python 讀起來像英語,這減輕了編碼初學者的許多語法學習壓力。Python 爲您處理了不少複雜性,所以它很是適合初學者,由於它使初學者能夠專一於學習編程概念,而沒必要擔憂過多的細節。
Python 還一度被爆歸入高考,收編到小學課本。
做爲一種 動態類型 的語言,Python 確實很是靈活。這意味着沒有關於如何構建特徵的硬性規則,而且使用不一樣的方法來解決問題將具備更大的靈活性 (儘管 Python 哲學鼓勵使用明顯的方法來解決問題)。此外,Python 也更寬容錯誤,所以您仍然能夠編譯並運行程序,直到遇到問題爲止。
Python 在誕生之初,由於其功能很差,運轉功率低,不支持多核,根本沒有併發性可言,在計算功能不那麼好的年代,一直沒有火爆起來,甚至不少人根本不知道有這門語言。
隨着時代的發展,物理硬件功能不斷提升,而軟件的複雜性也不斷增大,開發效率愈來愈被企業重視。所以就有了不同的聲音,在軟件開發的初始階段,性能並無開發效率重要,沒必然爲了節省不到 1ms
的時間卻讓開發量增長好幾倍,這樣劃不過來。也就是開發效率比機器效率更爲重要,那麼 Python 就逐漸獲得愈來愈多開發者的親睞了。
在 12-14
年,雲計算升溫,大量創業公司和互聯網巨頭擠進雲計算領域,而最著名的雲覈算開源渠道 OpenStack 就是基於 Python 開發的。
隨後幾年的備受關注的人工智能,機器學習首選開發語言也是 Python。
至此,Python 已經成爲互聯網開發的焦點。在 「Top 10 的編程語言走勢圖」 能夠看到,Python 已經躍居第三位,並且在 2017
年還成爲了最受歡迎的語言。
在天使榜上,Python 是需求第二高的技能,也是提供最高平均薪水的技能。
隨着大數據的興起,Python 開發人員須要做爲數據科學家,尤爲是由於 Python 能夠輕鬆集成到 Web 應用程序中以執行須要機器學習的任務。
Hello World
彷佛是學習編程繞不過去的東西,但使用 Python,咱們來換點兒別的,Emmm.. 好比,一個 查詢天氣 的小程序 (效果以下圖):
http://wthrcdn.etouch.cn/weather_mini?city=xxx
這個網址能夠返回任意城市昨日以及 5 天內的天氣預報,包括氣溫、指數、空氣質量、風力等,你能夠用瀏覽器試着訪問一下,你會獲得一個 weather_mini
的文件,裏面就包含了咱們想要的一些數據。
不過這裏因爲咱們發起了網絡請求用到了第三方庫 requests
,因此在運行以前還須要使用 pip install requests
命令把該庫下載到 Python 的安裝目錄下。
# -*- coding: utf-8 -*-
import requests
while True:
city = input('請輸入城市,回車退出:\n')
if not city:
break
req = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=%s' % city)
print(req.text)
複製代碼
你能夠在 當前文件夾 下執行命令: python hello_python.py
,或是使用 python <源文件路徑>
運行也行,例如,若是我是 Windows 用戶而且將上述源文件保存在了 D
盤下面,那就能夠執行 python D:\hello_python.py
,而後你就能夠看到上面的效果了。固然若是使用 IDE 將更加方便。
引入一張比較著名的圖吧,能夠很明顯地感覺到 Python 在寫法上要簡潔一些吧:
Python 與其餘語言最大的區別就是,Python 的代碼塊不使用大括號 {}
來控制類,函數以及其餘邏輯判斷。Python 最具特點的就是用 縮進 來寫模塊。
# 第一個註釋
# 第二個註釋
'''
第三註釋
第四註釋
'''
"""
第五註釋
第六註釋
"""
print("Hello, Python!")
複製代碼
Python 中的變量賦值不須要類型聲明。Python 有五個標準的數據類型:
int
長整型、
bool
布爾、
float
浮點數、
complex
複數
(1 + 2j);
('test1', 'test2')
[1, 2, ,3]
{a: 1, b: 2}
「
set
集合也屬於數據結構,它是一個 無序 且 不重複 的元素序列。可使用大括號{ }
或者set()
函數建立集合,注意:建立一個空集合必須用set()
而不是{ }
,由於{ }
是用來建立一個空字典。
str = 'Hello World!'
print str[2:5] # 輸出字符串中第三個至第五個之間的字符串
list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]
print list[1:3] # 輸出第二個至第三個元素
tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )
print tuple[1:3] # 輸出第二個至第三個的元素
tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
print tinydict['name'] # 輸出鍵爲 2 的值
複製代碼
# 當判斷條件爲 1 個值時
flag = False
name = 'luren'
if name == 'python': # 判斷變量否爲'python'
flag = True # 條件成立時設置標誌爲真
print 'welcome boss' # 並輸出歡迎信息
else:
print name # 條件不成立時輸出變量名稱
# 當判斷條件爲多個值時
num = 5
if num == 3: # 判斷num的值
print 'boss'
elif num == 2:
print 'user'
else:
print 'roadman' # 條件均不成立時輸出
複製代碼
在 Python 中沒有 do..while
的循環
count = 0
while count < 5:
print (count, " 小於 5")
count = count + 1
else:
print (count, " 大於或等於 5")
複製代碼
for..in
適用於 list/ dict/ set
數據類型,若是須要遍歷數字序列,咱們也能夠藉助 range(min, max, step)
函數來生成數列。
sites = ["Baidu", "Google","Runoob","Taobao"]
for site in sites:
if site == "Runoob":
print("菜鳥教程!")
break
print("循環數據 " + site)
else:
print("沒有循環數據!")
print("完成循環!")
# 輸出 0/ 3/ 6/ 9
for i in range(0, 10, 3) :
print(i)
# 替換成 range(5) 則輸出 0/ 1/ 2/ 3/ 4
# 替換成 range(5,9) 則輸出 5/ 6/ 7/ 8
複製代碼
# 計算面積函數
def area(width, height):
return width * height
def print_welcome(name):
print("Welcome", name)
print_welcome("Runoob")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))
複製代碼
在 Python 中,類型屬於對象,變量是沒有類型的,例如 name = "wmyskxz"
,則 "wmyskxz"
是 String 類型,而變量 name
僅僅是一個對象的引用。
Python 中一切都是對象,嚴格意義咱們 不能說值傳遞仍是引用傳遞,咱們應該說傳 不可變對象 (string、tuples、number 不可變) 和 傳可變對象 (list、dict 可變)。
############################################
# 傳遞不可變對象
def ChangeInt(a):
a = 10
b = 2
ChangeInt(b)
print b # 結果是 2
############################################
# 傳遞可變對象
def changeme( mylist ):
"修改傳入的列表"
mylist.append([1,2,3,4])
print ("函數內取值: ", mylist) # [10, 20, 30, [1, 2, 3, 4]]
return
# 調用changeme函數
mylist = [10,20,30]
changeme( mylist )
print ("函數外取值: ", mylist) # [10, 20, 30, [1, 2, 3, 4]]
# 函數內外值一致,由於都同屬於同一個引用
複製代碼
class people:
#定義基本屬性
name = ''
age = 0
#定義私有屬性,私有屬性在類外部沒法直接進行訪問
__weight = 0
#定義構造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 說: 我 %d 歲。" %(self.name,self.age))
# 實例化類
p = people('wmyskxz', 24, 120)
p.speak() # wmyskxz 說: 我 10 歲。
複製代碼
# 單繼承
class DerivedClassName(BaseClassName1):
<statement-1>
.
<statement-N>
# 多繼承
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
# 方法重寫演示
class Parent: # 定義父類
def myMethod(self):
print ('調用父類方法')
class Child(Parent): # 定義子類
def myMethod(self):
print ('調用子類方法')
c = Child() # 子類實例
c.myMethod() # 子類調用重寫方法
super(Child,c).myMethod() #用子類對象調用父類已被覆蓋的方法
# 先輸出 "調用子類方法" 再輸出 "調用父類方法"
複製代碼
一個 .py
文件就是一個模塊,想要使用其餘 .py
文件中的方法就須要引入進來。
import [module]
# 導入整個random模塊,能夠是內置/當前路徑
import random
# 使用 `random` 模塊下的 `randint` 方法
print(random.randint(0, 5))
複製代碼
from [module] import [name1, name2, ...]
# 從 `random` 模塊裏導入其中一個方法 `randint`
from random import randint
# 不同的是,使用 `randint` 的就不須要先寫 `random` 了
print(randint(0, 5))
複製代碼
import [module] as [new_name]
# 但這個名字可能跟其餘地方有衝突,所以更名成 `rd`
import random as rd
# 使用 `rd` 這個名稱取代本來的 `random`
print(rd.randint(0, 5))
複製代碼
from [module] import *
不推薦,容易形成名稱衝突,下降可讀性和可維護性。
# Import 全部 `random` module 底下的東西
from random import *
# 使用 `randint` 的時候也不須要先寫 `random`
print(randint(0, 5))
複製代碼
當你導入一個模塊,Python 解析器對模塊位置的搜索順序是:
PYTHONPATH
下的每一個目錄。
/usr/local/lib/python/
。
把兩個 module 放在一個新的目錄 sample_package
,再新增 _init__.py
(能夠是空,但不能沒有),宣稱本身是一個 package :
sample_package
|-- __init__.py
|-- 1.py
|-- 2.py
複製代碼
# package_runoob 同級目錄下建立 test.py 來調用 package_runoob 包
# 導入包
from package_runoob.runoob1 import runoob1
from package_runoob.runoob2 import runoob2
runoob1()
runoob2()
複製代碼
「單個py文件就是一個 module,而當多個
.py
文件 +__init__.py
文件時,就等於 package。
代碼規範 再怎麼強調也不爲過:
# 正確的模塊名
import decoder
import html_parser
# 不推薦的模塊名
import Decoder
複製代碼
class Farm():
pass
class AnimalFarm(Farm):
pass
class _PrivateFarm(Farm):
pass
複製代碼
def run():
pass
def run_with_env():
pass
複製代碼
_
class Person():
def _private_func():
pass
複製代碼
if __name__ == '__main__':
count = 0
school_name = ''
複製代碼
MAX_CLIENT = 100
MAX_CONNECTION = 1000
CONNECTION_TIMEOUT = 600
複製代碼
每行代碼儘可能不超過 80
個字符(在特殊狀況下能夠略微超過 80
,但最長不得超過 120
)
理由:
side-by-side
的
diff
時頗有幫助
簡單說,天然語言使用雙引號,機器標示使用單引號,所以 代碼裏 多數應該使用 單引號
"..."
,例如錯誤信息;不少狀況仍是 unicode,使用u"你好世界"
...'
,例如 dict 裏的 key
r"..."
"""......"""
# 正確的寫法
import os
import sys
# 不推薦的寫法
import sys,os
# 正確的寫法
from subprocess import Popen, PIPE
複製代碼
# 正確的寫法
from foo.bar import Bar
# 不推薦的寫法
from ..bar import Bar
複製代碼
DocString
以後,於全局變量以前;
import os
import sys
import msgpack
import zmq
import foo
複製代碼
from myclass import MyClass
複製代碼
import bar
import foo.bar
bar.Bar()
foo.bar.Bar()
複製代碼
DocString 的規範中最其本的兩點:
def
後提供一個塊註釋來講明。
"""Return a foobar
Optional plotz says to frobnicate the bizbaz first.
"""
"""Oneline docstring"""
複製代碼
app = create_app(name, options)
# =====================================
# 請勿在此處添加 get post等app路由行爲 !!!
# =====================================
if __name__ == '__main__':
app.run()
複製代碼
# -*- coding: utf-8 -*-
"""Example docstrings.
This module demonstrates documentation as specified by the `Google Python
Style Guide`_. Docstrings may extend over multiple lines. Sections are created
with a section header and a colon followed by a block of indented text.
Example:
Examples can be given using either the ``Example`` or ``Examples``
sections. Sections support any reStructuredText formatting, including
literal blocks::
$ python example_google.py
Section breaks are created by resuming unindented text. Section breaks
are also implicitly created anytime a new section starts.
"""
複製代碼
# 不推薦的寫法(不要寫函數原型等廢話)
def function(a, b):
"""function(a, b) -> list"""
... ...
# 正確的寫法
def function(a, b):
"""計算並返回a到b範圍內數據的平均值"""
... ...
複製代碼
numpy
標準, 以下所示
def func(arg1, arg2):
"""在這裏寫函數的一句話總結(如: 計算平均值).
這裏是具體描述.
參數
----------
arg1 : int
arg1的具體描述
arg2 : int
arg2的具體描述
返回值
-------
int
返回值的具體描述
參看
--------
otherfunc : 其它關聯函數等...
示例
--------
示例使用doctest格式, 在`>>>`後的代碼能夠被文檔測試工具做爲測試用例自動運行
>>> a=[1,2,3]
>>> print [x + 3 for x in a]
[4, 5, 6]
"""
複製代碼
「更多細緻詳細的規範能夠參考:
Google 開源項目指南 - zh-google-styleguide.readthedocs.io/en/latest/g… 官方 PEP 8 代碼規範 - www.python.org/dev/peps/pe…
「
本文已收錄至個人 Github 程序員成長系列 【More Than Java】,學習,不止 Code,歡迎 star:github.com/wmyskxz/Mor… 我的公衆號 :wmyskxz, 我的獨立域名博客:wmyskxz.com,堅持原創輸出,下方掃碼關注,2020,與您共同成長!
很是感謝各位人才能 看到這裏,若是以爲本篇文章寫得不錯,以爲 「我沒有三顆心臟」有點東西 的話,求點贊,求關注,求分享,求留言!
創做不易,各位的支持和承認,就是我創做的最大動力,咱們下篇文章見!