懂一點Python系列——快速入門

本文面相有 必定編程基礎 的朋友學習,因此略過了 環境安裝IDE 搭建 等一系列簡單繁瑣的事情。html

1、Python 簡介

Python 英文原意爲 「蟒蛇」,直到 1989 年荷蘭人 Guido van Rossum (簡稱 Guido)發明了一種 面向對象解釋型 編程語言,並將其命名爲 Python,才賦予了它表示一門編程語言的含義。python

說到 Python 的誕生,極具戲劇色彩,據 Guido 的自述記載,Python 語言是他在聖誕節期間爲了打發時間開發出來的,之因此會選擇 Python 做爲該編程語言的名字,是由於他是一個叫 Monty Python 戲劇團體的忠實粉絲。git

解釋型 vs 編譯型

做爲電子元器件的 計算機,實際上 只能 識別某些 特定的二進制指令 (特殊的 01 組合),但因爲 人類閱讀 這些 指令 很是難以閱讀,加上使用這些指令編寫程序的 耗時 太過於 冗長,因此,人們在此基礎上再次制定了一套規範,採用特定的 人類可閱讀 的代碼編寫,待到要執行時再 翻譯 回特定二進制指令,這樣就幫助了人們更加輕鬆地理解和閱讀程序邏輯了。程序員

這也就是所謂如今的 "高級編程語言" 了。github

上述 翻譯 這個過程 (其實至關複雜,涉及語法分析、語義分析、性能優化等等..) 其實也是由一個特定程序來執行的,那 何時將源代碼翻譯成二進制指令呢?,不一樣的編程語言有不一樣的規定:web

  • 編譯型語言:必須 提早 將全部源代碼 一次性 轉換成二進制指令,生成一個可執行文件 (例如 Windows 下的 .exe) 好比:C 語言、C++、Golang、彙編等。使用的轉換工具咱們稱爲 編譯器
  • 解釋型語言:容許程序 一邊執行一邊轉換,而且不會生成可執行程序,好比 Python、JavaScript、PHP 等。使用的轉換工具咱們稱爲 解釋器

JavaC# 是一種比較奇葩的存在,它們是 半編譯半解釋型 的語言,源碼須要先轉換成一種中間文件 (字節碼文件),而後再把中間文件拿到 虛擬機 中執行。Java 引領了這種風潮,它的初衷是在跨平臺的同時兼顧執行效率。正則表達式

上圖 就展現了兩種不一樣類型語言的執行流程的不一樣,兩種方式對比起來總結以下:算法

  • 編譯型語言通常不能跨平臺:對於不一樣的 CPU 來講,它們的指令集是有差別的,這就致使了 可執行文件 (翻譯後的指令) 不能跨平臺,另外不一樣的系統之間的命令也會存在差別,例如 Linux 中睡眠是 sleep() 參數是毫秒,而 Windows 中是 Sleep() (首字母大寫) 參數是秒,這就致使了 源代碼也不能跨平臺
  • 解釋型語言可跨平臺:這一切都歸功於 解釋器,它自己就是一個可執行文件,官方只要針對不一樣的平臺開發不一樣的解釋器,那麼解釋器就可以根據相同的語法解析出一樣功能的指令;
  • 編譯型通常比解釋型效率高:因爲解釋型是採起一邊執行一邊翻譯的作法,因此會慢上一些,再加上咱們強大的 編譯器 會幫咱們作許多代碼優化的工做。

關於 Python

Python 屬於典型的解釋型語言,因此運行 Python 程序須要解釋器的支持,只要你在不一樣的平臺安裝了不一樣的解釋器,你的代碼就能夠隨時運行,不用擔憂任何兼容性問題,真正的 「一次編寫,處處運行」spring

Python 幾乎支持全部常見的平臺,好比 Linux、Windows、Mac OS、Android、FreeBSD、Solaris、PocketPC 等,你所寫的 Python 代碼無需修改就能在這些平臺上正確運行。也就是說,Python 的 可移植性 是很強的。shell

面向對象 vs 面向過程

面向對象面向過程 是咱們使用計算機編程解決問題的兩種不一樣方式的方案。

面向過程 能夠說是一種 基於事件 or 過程 來描述的編碼方式,譬如「把大象放進冰箱」就能夠描述成那經典的三個步驟,「把牛放進冰箱」又是另外一個類似的經典三步,只是這樣單獨的事件 or 過程多了以後,隨着項目複雜度的增長,項目會變得很是難以維護。

軟件危機最典型的例子莫過於 IBM 的 System/360 的操做系統開發。佛瑞德·布魯克斯(Frederick P. Brooks, Jr.)做爲項目主管,率領 2000 多個程序員夜以繼日的工做,共計花費了 5000 人一年的工做量,寫出將近 100 萬行的源碼,總共投入 5 億美圓,是美國的 「曼哈頓」 原子彈計劃投入的 1/4。儘管投入如此巨大,但項目進度卻一再延遲,軟件質量也得不到保障。布魯克斯後來基於這個項目經驗而總結的《人月神話》一書,成了史上最暢銷的軟件工程書籍。

  • 引用自:http://www.kancloud.cn:8080/yunhua_lee/oobaodian/110880

儘管 結構化的程序設計 (將一個大問題逐步劃分紅一個一個的小問題) 可以幫助咱們解決一部分問題,但 面向過程 仍然有一些不符合人類慣有的思考方式,譬如說:我今天想去存錢,我不會說「請拿走個人銀行卡和錢,而後在我卡上充值上相應的數目,最後把銀行卡還給我謝謝」,而我只會說「存錢,謝謝」,由於人大部分時間都是基於 對象 (或者能夠說角色) 來思考的。

對於 面向過程 最好的總結多是:「程序 = 算法 + 數據結構」,而對於 面向對象 來講則能夠更改成:「程序 = 對象 + 交互」

Why Python?

上面的 漫畫 很好地說明了 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 應用程序中以執行須要機器學習的任務。

快速體驗 | No Hello World !

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 vs Java

引入一張比較著名的圖吧,能夠很明顯地感覺到 Python 在寫法上要簡潔一些吧:

2、Python 基本語法簡介

Python 與其餘語言最大的區別就是,Python 的代碼塊不使用大括號 {} 來控制類,函數以及其餘邏輯判斷。Python 最具特點的就是用 縮進 來寫模塊。

2.0 註釋

# 第一個註釋
# 第二個註釋

'''
第三註釋
第四註釋
'''


"""
第五註釋
第六註釋
"""

print("Hello, Python!")
複製代碼

2.1 數據類型

Python 中的變量賦值不須要類型聲明。Python 有五個標準的數據類型:

  1. Numbers(數字):Python3 中有四種數字類型 (沒有 Python2 中的 Long),分別是 int 長整型、 bool 布爾、 float 浮點數、 complex 複數 (1 + 2j)
  2. String(字符串):Python 中字符串不能改變,而且沒有單獨的字符類型,一個字符就是長度爲 1 的字符串;
  3. Tuple(元組):相似於 List,但不能二次賦值,至關於只讀列表。eg: ('test1', 'test2')
  4. List(列表):相似 Java 中的 Array 類型。eg: [1, 2, ,3]
  5. Dictionary(字典):相似於 Java 的 Map 類型。eg: {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 的值
複製代碼

2.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' # 條件均不成立時輸出
複製代碼

2.3 循環

while 循環

在 Python 中沒有 do..while 的循環

count = 0
while count < 5:
print (count, " 小於 5")
count = count + 1
else:
print (count, " 大於或等於 5")
複製代碼

for..in 循環

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
複製代碼

2.4 函數

函數基本定義和使用

# 計算面積函數
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]]
# 函數內外值一致,由於都同屬於同一個引用
複製代碼

2.5 class 類

基本定義

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() #用子類對象調用父類已被覆蓋的方法
# 先輸出 "調用子類方法" 再輸出 "調用父類方法"
複製代碼

2.6 module 模塊

一個 .py 文件就是一個模塊,想要使用其餘 .py 文件中的方法就須要引入進來。

  1. import [module]
# 導入整個random模塊,能夠是內置/當前路徑
import random
# 使用 `random` 模塊下的 `randint` 方法
print(random.randint(0, 5))
複製代碼
  1. from [module] import [name1, name2, ...]
# 從 `random` 模塊裏導入其中一個方法 `randint`
from random import randint
# 不同的是,使用 `randint` 的就不須要先寫 `random` 了
print(randint(0, 5))
複製代碼
  1. import [module] as [new_name]
# 但這個名字可能跟其餘地方有衝突,所以更名成 `rd`
import random as rd
# 使用 `rd` 這個名稱取代本來的 `random`
print(rd.randint(0, 5))
複製代碼
  1. from [module] import *

不推薦,容易形成名稱衝突,下降可讀性和可維護性。

# Import 全部 `random` module 底下的東西
from random import *
# 使用 `randint` 的時候也不須要先寫 `random`
print(randint(0, 5))
複製代碼

module 搜索路徑

當你導入一個模塊,Python 解析器對模塊位置的搜索順序是:

  1. 當前目錄
  2. 若是不在當前目錄,Python 則搜索在 shell 變量 PYTHONPATH 下的每一個目錄。
  3. 若是都找不到,Python 會察看默認路徑。UNIX 下,默認路徑通常爲 /usr/local/lib/python/

2.7 package 包

把兩個 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。

3、基本代碼規範

代碼規範 再怎麼強調也不爲過:

  • 圖片來源:https://codingpy.com/article/programmers-daily-what-idiot-wrote-this-crappy-code/

3.1 命名規範

模塊

  • 模塊儘可能使用 小寫命名,首字母保持小寫,儘可能不要用下劃線(除非多個單詞,且數量很少的狀況)
# 正確的模塊名
import decoder
import html_parser

# 不推薦的模塊名
import Decoder
複製代碼

類名

  • 類名使用 駝峯 (CamelCase)命名風格,首字母大寫,私有類可用一個下劃線開頭
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
複製代碼

3.2 基本編碼規範

縮進

  • 統一使用 4 個空格進行縮進

行寬

每行代碼儘可能不超過 80 個字符(在特殊狀況下能夠略微超過 80 ,但最長不得超過 120)

理由:

  • 這在查看 side-by-sidediff 時頗有幫助
  • 方便在控制檯下查看代碼
  • 太長多是設計有缺陷

引號

簡單說,天然語言使用雙引號,機器標示使用單引號,所以 代碼裏 多數應該使用 單引號

  • 天然語言 使用雙引號 "...",例如錯誤信息;不少狀況仍是 unicode,使用u"你好世界"
  • 機器標識 使用單引號 ' ...',例如 dict 裏的 key
  • 正則表達式 使用原生的雙引號 r"..."
  • 文檔字符串 (docstring) 使用三個雙引號 """......"""

import 語句

  • import 語句應該分行書寫
# 正確的寫法
import os
import sys

# 不推薦的寫法
import sys,os

# 正確的寫法
from subprocess import Popen, PIPE
複製代碼
  • import 語句應該使用 absolute import
# 正確的寫法
from foo.bar import Bar

# 不推薦的寫法
from ..bar import Bar
複製代碼
  • import 語句應該放在文件頭部,置於模塊說明及 DocString 以後,於全局變量以前;
  • import 語句應該按照順序排列,每組之間用一個空行分隔
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

DocString 的規範中最其本的兩點:

  1. 全部的公共模塊、函數、類、方法,都應該寫 DocString 。私有方法不必定須要,但應該在 def 後提供一個塊註釋來講明。
  2. DocString 的結束"""應該獨佔一行,除非此 DocString 只有一行。
"""Return a foobar
Optional plotz says to frobnicate the bizbaz first.
"""


"""Oneline docstring"""
複製代碼

3.3 註釋規範

建議

  • 在代碼的 關鍵部分(或比較複雜的地方), 能寫註釋的要儘可能寫註釋
  • 比較重要的註釋段, 使用多個等號隔開, 能夠更加醒目, 突出 重要性
app = create_app(name, options)


# =====================================
# 請勿在此處添加 get post等app路由行爲 !!!
# =====================================


if __name__ == '__main__':
app.run()
複製代碼

文檔註釋(DocString)

  • 文檔註釋以 """ 開頭和結尾, 首行不換行, 若有多行, 末行必需換行, 如下是Google的docstring風格示例
# -*- 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]
"""

複製代碼

更多細緻詳細的規範能夠參考:

  1. Google 開源項目指南 - zh-google-styleguide.readthedocs.io/en/latest/g…
  2. 官方 PEP 8 代碼規範 - www.python.org/dev/peps/pe…

推薦閱讀

  1. Redis(9)——史上最強【集羣】入門實踐教程 - juejin.im/post/5e7429…
  2. React入門學習 - juejin.im/post/5da5e9…

參考資料

  1. WhyStudyPython.md | TwoWater - github.com/TwoWater/Py…
  2. C 語言中文網 | Python 系列教程 - c.biancheng.net/python/
  3. Crossin的編程教室 - python666.cn/
  4. 計算機和編程語言的發展歷史 - blog.csdn.net/abc6368765/…
  5. 面向對象葵花寶典 - www.kancloud.cn:8080/yunhua_lee/…
  6. RUNOOB | Python3 系列教程 - ttps://www.runoob.com/python3
  7. Python 基礎語法 | springleo'sblog - lq782655835.github.io/blogs/tools…
  • 本文已收錄至個人 Github 程序員成長系列 【More Than Java】,學習,不止 Code,歡迎 star:github.com/wmyskxz/Mor…
  • 我的公衆號 :wmyskxz, 我的獨立域名博客:wmyskxz.com,堅持原創輸出,下方掃碼關注,2020,與您共同成長!

很是感謝各位人才能 看到這裏,若是以爲本篇文章寫得不錯,以爲 「我沒有三顆心臟」有點東西 的話,求點贊,求關注,求分享,求留言!

創做不易,各位的支持和承認,就是我創做的最大動力,咱們下篇文章見!

相關文章
相關標籤/搜索