Python是一個強大、快速、簡單易讀的程式語言
轉換到Python之後就回不去C/C++了,尤其在入手Mac之後,不用安裝任何軟體,也不需要編譯
對於Python的依賴程度越來越重,越是喜愛就越想推廣Python給身旁的朋友。
What Can Python Do?
- 一些有用的Python函式庫列表 (GUI界面、遊戲、網頁、伺服器、資料庫)
- Python開發的應用 有誰在用Python
最近找尋了不少資料,許多線上教學都是按部就班,
對於已有程式基礎,想要快速入門Python還是比較麻煩
因此寫了這一篇,給「已經學過C/C++,Java等程式語言」快速轉換Python的文件
如果是任何程式語言都沒有學過,
建議可以從以下資源一步步學習Python,對於建立起程式設計的概念比較有幫助:
- CodeCademy 遊戲化的學習(英文)
- Python Tutorial 第一堂(1)揭開序幕 很完整的中文教學
Let's Start!
[安裝]
執行第一個程式Hello World
有兩種選擇:
- 直接開啟直譯器上輸入一行行程式碼,Enter執行
- Windows:開啟
Python(command line)
- Mac/Unix:Terminal輸入
python
-輸入print "Hello World"
- Windows:開啟
- 跟以往一樣寫一個.py的檔案,執行
python my_first_python.py
# encoding: utf-8
print "Hello World"
!!!注意
中文的檔案要加上# encoding: utf-8
Windows
Mac/Unix
//2014-10-20補充
網路上看到一張圖片大約40行的code也可以很清楚的供有程式基礎的人快速了解Python 簡中對照版
之後的部分,會更詳細介紹Python好用的功能,將以.py的檔案形式展示程式碼。
[語法]
python不需要任何代表結尾的符號(ex;
)
python不需要先指定變數的型態,之後也可以任意轉換型態
python可以透過=
,+=
,-=
直接賦值,也可同時給多個變數賦值
單行註解為#
,多行註解則用"""
開頭與結尾,多運用註解可以幫助你或其他人看懂你的程式碼。
# encoding: utf-8
"""
這是一個簡單的python程式
介紹基本的語法
"""
x = 3
x += 2
x -= 1
print x
x,y = 99.99,5
print x,y
Output:
4
99.99 5
[數據類型]
list是可以隨意更動大小的陣列,可透過append
增加。
python的list提供很多好用函式:
-
len()
可以算list長度 -
sum()
可以計算list中所有數值的加總(但list中的元素都需為數值,不可與字串混合) -
count
則是可以計算list中某個元素出現次數
# encoding: utf-8
my_list = []
my_list.append(1)
my_list.append(2)
my_list2 = [55.55,"Hi",3,99,222,222]
my_list2[0]=333.333
print len(my_list),sum(my_list),my_list2.count(222)
print my_list2[0],my_list2[-1],my_list2[1:3],my_list2[2:]
Output:
2 3 2
333.333 222 ['Hi', 3] [3, 99, 222, 222]
dictionary像是hash-table一樣有一個key對應一個變數
# encoding: utf-8
passwd={'Mars':00000,'Mark':56680}
passwd['Happy']=9999
passwd['Smile']=123456
del passwd['Mars']
passwd['Mark']=passwd['Mark']+1
print passwd
print passwd.keys()
print passwd.get('Tony')
Output:
{'Happy': 9999, 'Smile': 123456, 'Mark': 56681}
['Happy', 'Smile', 'Mark']
None
set則是集合,可以進行聯集、交集、差集等運算
# encoding: utf-8
admins = set()
users = {'Smile', 'Tony','Happy','Sherry','Allen','Andy', 'Mars'}
admins.add('ihc')
admins.add('Mars')
print admins & users
print admins | users
print admins ^ users
print admins - users
print users - admins
Output:
set(['Mars'])
set(['Allen', 'Andy', 'Smile', 'Mars', 'Tony', 'ihc', 'Happy', 'Sherry'])
set(['Andy', 'Allen', 'Tony', 'Smile', 'Happy', 'ihc', 'Sherry'])
set(['ihc'])
set(['Sherry', 'Andy', 'Allen', 'Tony', 'Smile', 'Happy'])
[字串]
字串可用雙引號"
或用單引號'
來進行標示
# encoding: utf-8
s = "Hello"
s += 'World'
s1 = "HelloWorld".replace("ll","1")
s2 = "Hello"[0]+"i"
print s,s1,s2,len(s)
Output:
HelloWorld He1oWorld Hi 10
其中python字串內建的分割函式string.split()很好用,可以將字串依指定的字元(字串)切割
s3 = "This is a sentence."
s3_split=s3.split(' ')
print s3_split
Output:
['This', 'is', 'a', 'sentence.']
而中文的處理,我們可以透過unicode的編解碼來處理
# encoding: utf-8
s="台灣"
u = s.decode('utf8')
print '台',s[0],u[0]
print u[0]==u'台'
Output:
台 ? 台
#沒有解碼過的s是顯示不出來每一個"中文字"的
True
[型別轉換、基本運算符]
要注意的是,由於python不用特別宣告變數,要注意不能讓不同型別的變數同時運算
ex: x+s
會出錯,因為整數型態與字串型態,兩者是不能同時運算的
# encoding: utf-8
x=2**3
y=3/2
s="3"
print ord('a'),ord('c'),chr(ord('a')+2)
print y,int(s)/2,float(s)/2,3%2
print str(x+y),str(x)+str(y)
Output:
97 99 c
1 1 1.5 1
9 81
[Flow Control:判斷式、迴圈]
再來就進入到程式設計中很重要的部分:流程控制
也可以從這部分開始看到Python之所以容易閱讀的原因,
每個流程的結尾是用冒號:
屬於該流程底下的執行動作不需要任何括號,而是使用縮排
縮排可以使用Tab
或四格Space
,但不可混用,建議是把編輯器設定成Tab對應四格空白
縮排可以讓程式碼更容易閱讀,了解整個程式的架構&邏輯,也是寫程式重要的習慣之一。
在python的判斷式中,and
,or
,not
是邏輯運算子。
python提供一個很好的函式range
,範圍是左邊數字到右邊數字-1,在撰寫迴圈時可以更加快速。
另外in
函式可以用來判斷某個型別中是否有某個元素,非常的方便!
# encoding: utf-8
my_list=[]
for i in range(0,10): """//for(i=0;i<10;i++)"""
my_list.append(i+1)
if my_list[0]==1 and len(my_list)<10:
my_list[0]+=1
print "1 state"
elif (10 in my_list) or not(len(my_list)==10):
print "2 state"
print "range(i,j) is i~j-1"
else:
print "3 state"
print "none of above"
for i in my_list: """//for(i=0;i<my_list.length();i++)"""
print i, """//cout<<my_list[i]"""
print
Output:
2 state
range(i,j) is i~j-1
1 2 3 4 5 6 7 8 9 10
[自定義函式Function]
python定義函式用def
開頭,同樣以冒號:
結尾,還有縮排。
def my_function(x,y):
return x-10,y+10
x,y = my_function(10,20)
print x,y
Output:
0 30
[類別Class]
Class的初始化函式是由兩條底線包含著init做宣告。
# encoding: utf-8
class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def set_name(self, name):
self.name = name
student_objects=[]
student_objects.append( Student('john', 'B', 15) )
student_objects.append( Student('dave', 'A', 12) )
student_objects.append( Student('jane', 'A', 10) )
student_objects[0].set_name('John')
for i in student_objects:
print i.name,i.grade,i.age
Output:
John B 15
dave A 12
jane A 10
[導入外部資源import]
可以用import
直接導入整個python檔中所有的函式
或是用from
檔案import
函式,插入特定的函式
# encoding: utf-8
import sys """插入sys檔案中所有函式,使用sys檔中的write函式前須加檔名"""
from time import time """從time檔案插入time()函式,使用time()前不需要加檔名"""
sys.stdout.write( str(time()) + "\n" )
Output:
1409796132.99
#當下的time
[I/O]
前例中已經看到很多使用print
當Output的案例
但print
預設是印每一行就會加一個換行,要使用,
才會在每次印出之間以空格取代
要更自由一點,可以使用library中的write函式。
# encoding: utf-8
import sys
file_in = file('db.txt','r')
file_out = file('copy.txt','w')
for line in file_in:
for i in range(0,len(line)):
if line[i]!="\n":
sys.stdout.write(line[i]+',')
else:
sys.stdout.write(line[i])
file_out.write(line[i])
sys.stdout.write("\n")
file_in.close()
file_out.close()
"""
# db.txt
1111
2222
ssss
wwww
5555
"""
Output:
1,1,1,1,
2,2,2,2,
s,s,s,s,
w,w,w,w,
5,5,5,5,
copy.txt內容和db.txt一樣。
[例外處理 Exceptions Handling]
# encoding: utf-8
def my_divide():
try:
10 / 0 #會讓程式出錯,所以需要特別handle
except ZeroDivisionError:
print "不能除以0!!!"
else:
print "沒有任何錯誤"
finally:
print "無論有沒有例外都會執行這一行"
my_divide()
Output:
不能除以0!!!
無論有沒有例外都會執行這一行
[排序]
排序是用程式處理資料中最常用到功能,python提供了很方便的sort函式
lambda
是簡易型函式,只能回傳一個值,因此如果需要兩個值以上的排列順序,會用attrgetter
# encoding: utf-8
class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def set_name(self, name):
self.name = name
student_objects=[]
student_objects.append( Student('john', 'B', 15) )
student_objects.append( Student('dave', 'A', 12) )
student_objects.append( Student('jane', 'A', 10) )
student_objects.sort(key=lambda i: i.grade)
for i in student_objects:
print i.name,i.grade,i.age
print
from operator import attrgetter
student_objects.sort(key=attrgetter('grade', 'age'),reverse=True)
for i in student_objects:
print i.name,i.grade,i.age
print
Output:
dave A 12
jane A 10
john B 15
john B 15
dave A 12
jane A 10
以上介紹包含了一些最常用到的python功能,給想快速轉換python的人一個入門文章。
What's Next?
有了以前學C的基礎後,其實後來要碰任何程式語言都很快,
最快學習的方法都是「動手做」一個Project,邊做邊google該語言的程式語法
之後再從頭開始「看文件」,從官網或是書上一步步把該程式語言的基礎打好
動手做
提供一些遊戲化的關卡來當作練習
- CheckiO 一個以連環故事為主題的的Online Judge網站。
- The Python Challenge 根據提示解出下一關網址的闖關遊戲,借此練習Python技巧。
- Sikuli - 程式語言大革命!用圖片寫程式! 利用Sikuli可以設計出好玩的自動化程式
看文件
- Python Tutorial 第一堂(1)揭開序幕 很完整的中文教學
- Learn Python The Hard Way 英文經典教材
- Invent with Python 透過開發遊戲學習Python