Learn Python The Hard Way

原文網頁

Exercise 1: A Good First Program

目的:練習使用print ,建立良好的打code習慣。

Note

#號 為單行註解

在code中使用中文需加上: # -- coding: utf-8 -- 在code文件的最上方

ex1.py:

print "Hello World!"
print "Hello eval"
print "I like typing this"
print "This is fun."
print "Yay! Printing!"
print "i'd much rather you 'not'."
print 'I "said" do not touch this.'

執行結果:

Hello World!
Hello eval
I like typing this
This is fun.
Yay! Printing!
i'd much rather you 'not'.
I "said" do not touch this.

Exercise 2: Comments And Pound Characters

註解是很重要的事情,除了解釋code之外也可用來暫時移除某段程式碼。

Note

如果要印出#號可以用’’ 跟””把#包起來

ex2.py :

# --coding:utf-8 --./e  
# A comment ,this is do you can read your program later.註解,你可以這樣理解你的程式碼
# Anythin after the # is ignored by python.任何在#號後面的東西都會被python忽略掉(不執行)
print "I could have code like this.(我可以打一段code)" #and the comment after is ignored(註解符號後面的字不會被顯示出來)

# you can also use a comment to "disable" or comment out a piece of code.(你也可以用這個方式disable掉一段code)
# print "This won't run.(這段程式碼不會被執行)
print "This will run.(這段code會被執行印出)'#'"+"#"

執行結果:

I could have code like this.(我可以打一段code)
This will run.(這段code會被執行印出)'#'#

exercise 3: Numbers And Math

數字與數學運算

實作求數字加減乘除,商數餘數,T/F判斷 重寫成浮點數(ex:5.0)

ex3.py :

# --coding:utf-8 --./e  
print "i will now count my chickens"+"(我要算我有幾隻雞)"

print "Hens(母雞):",25+30/6.0
print "Roosters(公雞):",100-25.0*3%4

print "Now i wlii count the eggs.現在來算雞蛋"

print 3+2+1-5+4%2-1/4+6.0
print "is it true that 3+2<5-7?"

print 3.0+2<5-7

print "what is 3+2=? ",3.0+2
print "what is 5-7=?",5.0-7

print "oh,that's why it's False.(oh~這證明了為啥答案是False)"

print "How about some more.(再來更多的例子)"

print "is it greater?.",5.0>-2
print "is it greater or equal?", 5>=-2
print "is it less or equal?",5<=-2.0

執行結果:

i will now count my chickens(我要算我有幾隻雞)
Hens(母雞): 30.0
Roosters(公雞): 97.0
Now i wlii count the eggs.現在來算雞蛋
7.0
is it true that 3+2<5-7?
False
what is 3+2=?  5.0
what is 5-7=? -2.0
oh,that's why it's False.(oh~這證明了為啥答案是False)
How about some more.(再來更多的例子)
is it greater?. True
is it greater or equal? True
is it less or equal? False

Exercise 4: Variables And Names

變數和名稱

1.使用適當的變數名稱以免連自己都沒辦法解讀code

2.善用底線符號 _ 可以讓變數名稱更多樣、增加可讀性

3.數字變數間可以直接作計算ex: a=1,b=2,a+b=3

Note

使用+號可以將字串相加(串接)

# --coding:utf-8 --./e  
cars = 100
space_in_a_car =4.0
drivers =30
passengers = 90
cars_not_driven = cars-drivers
cars_driven = drivers
carpool_capacity=cars_driven * space_in_a_car
average_passengers_per_car = passengers/cars_driven

print "這裡有",cars,"輛車可以使用"
print "現在只有",drivers,"個駕駛"
print "這裡還有",cars_not_driven,"輛車閒置"
print "我們今天總共可以載運",carpool_capacity,"個人"
print "總共有",passengers,"位是乘客"
print "平均每輛車",average_passengers_per_car,"位乘客"

執行結果:

這裡有 100 輛車可以使用
現在只有 30 個駕駛
這裡還有 70 輛車閒置
我們今天總共可以載運 120.0 個人
總共有 90 位是乘客
平均每輛車 3 位乘客

Exercise 5: More Variables And Printing

更多的變數使用

使用%s,%r,%d放入句中,在最後放入字串變數引入

ex:

my_name = 'kevinchen'
print "讓我們談談 %s 的事情吧!" % my_name

%s = 指定輸入變數內容為字串,若變數內容為純數字,使用str()將變數格式化成字串

ex:

x=123
print 'test %s ' % x

那將會以字串格式引入。

%r = 使用repr()格式化顯示變數,不會將python語法引入,要進行變數格式的確認很好用。

ex:字串會用’‘包起來,數字無變化,中文會顯示編碼

如 顏色 black = ‘xe9xbbx91xe8x89xb2’

%d = 顯示十進位的數字

%f = 浮點數

ex5.py:

# --coding:utf-8 --./e 
my_name = 'kevinchen'
my_age = 26 
my_height = 176 #cm
my_weight = 80 #kg
my_eyes = 'black'
my_teeth = 'white'
my_hair = '黑色'

print "讓我們來談談 %s " % my_name
print "他身高是 %r 公分" % my_height
print "他的體重為 %f 公斤" % my_weight
print "這應該還不算胖啦!~"
print "他有 %s 的眼睛和 %r 的頭髮" % (my_eyes, my_hair)
print "他的牙齒是 %r 色的" % my_teeth

#這行比較複雜,嘗試完全正確的打出來
print "if i add %d %d and %d i get %d" %( my_age,my_height,my_weight,my_age+my_height+my_weight)

執行結果:

讓我們來談談 kevinchen
他身高是 176 公分
他的體重為 80.000000 公斤
這應該還不算胖啦!~
他有 black 的眼睛和 '\xe9\xbb\x91\xe8\x89\xb2' 的頭髮
他的牙齒是 'white' 色的
if i add 26 176 and 80 i get 282

Exercise 6: Strings And Text

字串和純文字文件

  1. round() = 浮點數四捨五入

ex:

round(1.7333) >2
  1. 字串連結使用 +

ex:

a = “apple” ,b = “is good” ,
print a+b >>> apple is good
  1. 單引號’‘請放在雙引號”“內使用

ex6.py

# -*- coding:utf-8 -*-
x= "這裡有 %d 種類型的人" % 10  # x = 這裡有10種類形的人
binary = "二進制" # 
do_not = "則否"
y = "一些人知道 %s and 一些人 %s." %(binary,do_not)

print x 
print y

print "我說: %s" % x
print "我也說: '%s'." % y

hilarious = False 
joke_evaliation = "isn't that joke so funny?! %r"

print joke_evaliation % hilarious 

w = " 這個字串會在左邊..."
e = " 這個字串會在右邊"
print w+e

print round(1.4333)

執行結果:

這裡有 10 種類型的人
一些人知道 二進制 and 一些人 則否.
我說: 這裡有 10 種類型的人
我也說: '一些人知道 二進制 and 一些人 則否.'.
isn't that joke so funny?! False
這個字串會在左邊... 這個字串會在右邊
1.0

Exercise 7: More Printing

更多的輸出(印出)練習

Note

想要在code裡打中文或有中文輸出要在最上面加上 # -- codeing:utf-8 --

Note

提醒:一定要每行都寫註解

有錯要記錯,但要吸收相關經驗減少錯誤,不要害怕寫錯(犯錯),人非聖賢孰能無過。

練習使用字串重複輸出

ex:

"a" * 10 >>> aaaaaaaaaa

在印出時如果code的變數太多可分成兩行,用逗號( , ) 來斷行,這樣印出的字串內容就不會被斷開,code看起來比較乾淨整齊,一行cod最好不要超過80字元。

ex:

print end1 + end2 + end3 + end4 + end5 + end6,
print end7 + end8 + end9 + end10 + end11 + end12

ex7.py:

# -*- coding:utf-8 -*- 
print "Mary had a little lamb."
print "Its fleece was white as %s." % 'snow'
print "And everywhere that Mary went."
print "."*10
end1 = "他"
end2 = "是"
end3 = "一"
end4 = "個"
end5 = "超"
end6 = "級"
end7 = "無"
end8 = "敵"
end9 = "的"
end10 = "雷"
end11 = "神"
end12 = "王"
# watch that comma at the end.  try removing it to see what happens
print end1 + end2 + end3 + end4 + end5 + end6
print end7 + end8 + end9 + end10 + end11 + end12

執行結果:

Mary had a little lamb.
Its fleece was white as snow.
And everywhere that Mary went.
..........
他是一個超級
無敵的雷神王

Exercise 8: Printing, Printing

練習使用%r輸出檢視變數格式

ex8.py:

# -*- coding:utf-8 -*-
formatter = "%r '%r' %r %r"

print formatter % (1,2,3,4)
print formatter % ("one","two", "three", "four")
print formatter % (True, False , True , False )
print formatter % (formatter,formatter,formatter,formatter)
print formatter % (
    "I had this thing.",
    "That you could type up right.",
    "But it didn't sing.",
    "So I said goodnight."
)

執行結果:

1 '2' 3 4
'one' ''two'' 'three' 'four'
True 'False' True False
"%r '%r' %r %r" '"%r '%r' %r %r"' "%r '%r' %r %r" "%r '%r' %r %r"
'I had this thing.' ''That you could type up right.'' "But it didn't sing." 'So I said goodnight.'

Exercise 9: Printing, Printing, Printing

找出自己容易犯錯的地方,並且在之後的練習中儘量不要再犯。

使用三個雙引號前後包夾 作註解

ex:

”””我是註解文字”””

也可用作多行數的純文字輸出

ex:

print “”” There's something going on here.
With the three double-quotes.
We'll be able to type as much as we like.
Even 4 lines if we want, or 5, or 6.
”””

字串內加n,輸出時會換行

ex:

apple\norange\n
apple
orange

ex9.py:

# -*- coding:utf-8 -*-
#下面是一些比較奇特的輸出方式,請記住這些類型
days = "星期一 星期二 星期三 星期四 星期五 星期六 星期日"
months= "\n一月\n二月\n三月\n四月\n五月\n六月\n七月\n八月\n九月\n十月\n十一月\n十二月\n"

print "一星期有這些日子:" ,days
print "一年中有這些月份:" ,months 

print """
There's something going on here.
With the three double-quotes.
We'll be able to type as much as we like.
Even 4 lines if we want, or 5, or 6.
"""

執行結果:

一星期有這些日子: 星期一 星期二 星期三 星期四 星期五 星期六 星期日
一年中有這些月份:
一月
二月
三月
四月
五月
六月
七月
八月
九月
十月
十一月
十二月


There's something going on here.
With the three double-quotes.
We'll be able to type as much as we like.
Even 4 lines if we want, or 5, or 6.

Exercise 10: What Was That?

  1. %r 是用來測試
  2. %s(%d) 是用來顯示

3. 對於引號’ 及雙引號”” 的應用,在使用上可能會出現類似 ‘i’m a man’的類似情況, python會判別成’i’ + m a man’ ,而不幸的是python規定引號出現一定要是成對的,所以這時就會出現error。

要避免這種情況,可用escape sequences(轉意序列) 反斜線, 將 放在語意內(非程式碼作用)的’ 或 ”前。 ex:

'i\'m a man'

此時反斜線會將’的程式屬性消除,變成單純的字串,而避免了error。

要注意的是,反斜線的影響只有之後的一個位置,且反斜線之間是會互相消除的, 如:

'I\\'m a man' 就

是無效的作法;

但\也可用來印出一個反斜線。

關於 轉意序列 常用的應用有下表:

\\    印出一個斜線
\'    印出一個單引號
\”    印出一個雙引號
\b    消除前一個字
\n    換行
\r    其後面的內容在印出時強制從本行開頭印出
\t    就是tab鍵
# -*- coding:utf-8 -*-
print "I am 6'2\" tall."  # escape double-quote inside string
print 'I am 6\'2" tall.'  # escape single-quote inside string

tabby_cat = "\tI'm tabbed in."
persion_cat ="I'm spilt\non a line."
backslash_cat = "霸告不是 \\a \\cat"
"""123456"""
fat_cat = """
I'll do a list:
\t* Cat food\a
\t* \rFishies
\t* Catnip\n\t* Grass 
"""
        
print tabby_cat
print persion_cat
print backslash_cat
print fat_cat

執行結果:

I am 6'2" tall.
I am 6'2" tall.
    I'm tabbed in.
I'm spilt
on a line.
霸告不是 \a \cat

I'll do a list:
    * Cat food
Fishies *
    * Catnip
    * Grass

Exercise 11: Asking Questions

提問(對使用者)~

  1. 練習raw_input()的使用
  2. 逗號是為了不讓印出時顯示的結果跑到下一行去
  3. 儘量使用raw_input()而不要使用會有安全性疑慮的input()。

Note

可用 int(raw_input())強制輸入格式為數字

ex11.py:

# -*- coding:utf-8 -*-

print "今年幾歲啦?"
age = raw_input()
print "身高(cm)多高阿?",
height = raw_input()
print "說說看你的體重(kg)?",
weight = raw_input()

print "所以縮你 %r 歲, %r cm高 and %r kg重." % (age, height, weight)

執行結果:

今年幾歲啦?
3
身高(cm)多高阿? 100
說說看你的體重(kg)? 18
以縮你 '3' 歲, '100' cm高 and '18' kg重.

Exercise 12: Prompting People

輸入的提示

  1. 可以在raw_input()的括號內輸入你要使用者輸入的內容的提示,

ex:

raw_input(“請輸入你的體重“)這樣

練習:改寫ex11,變成以上的格式!~

ex12.py:

# -*-coding:utf-8-*-

age = raw_input("請問你幾歲?")
height = int(raw_input("身高(cm)多高呢?"))
weight = float(raw_input("體重(kg)多重呢?"))
print "所以~你 %r 歲, %d 公分高,體重 %.2f 公斤" %(
    age,height,weight)

執行結果:

請問你幾歲?99
身高(cm)多高呢?150
體重(kg)多重呢?50
所以~你 '99' 歲, 150 公分高,體重 50.00 公斤

Exercise 13: Parameters, Unpacking, Variables

參數輸入, 解壓、Unpacking,變數

from sys import argv

調用 argv(=argument variable)

1.練習使用argv(參數輸入)

ex:

script, first, second, third = argv

分配4個變數給argv使用,這個動作稱 Unpacking。

argv會由 左至右 的使用這些變數。

Note

argv除了[0]固定為檔名外,其他所需的參數數目由使用者自行決定,

argv[0] 為 執行腳本(py檔)的檔名

在上面範例內為 script 變數的位置。

Note

介紹modules的概念:

預先寫好可供直接使(調)用的功能稱為模組。 argv 是在命列列執行腳本時可放入執行參數的一個modules Unpacking? Packing?