1.? ?選教程
?看到crossin的編程教室python教程還不錯挟秤。以這個為主要學(xué)習(xí)內(nèi)容。
? ? python簡單實驗的編輯器用IDLE已經(jīng)足夠疟呐,更好的網(wǎng)上有推薦PyCharm(又是JetBrain的產(chǎn)品)的。
? 2. 站隊
?python學(xué)習(xí)需要站隊,有2.7版本有3.6版本安券。我選擇優(yōu)先3.6墩崩,因為語法感覺更規(guī)范,當(dāng)然2系列的語法也必須看懂完疫,要不然以前的很多成果無法使用的。
3. if語句债蓝,while語句都不是像C語言使用大括號來界定其后的block的壳鹤,而是采用冒號和后面的代碼縮進來實現(xiàn)的。
4. for的反人類寫法
最反人類的寫法是這個
for i in range(1,101):
? ? print i
? ? sum = sum + i
print sum
打印結(jié)果是1~100饰迹, 而不是1~101.? 最后sum是5050. 內(nèi)心瘋狂了有木有芳誓,有木有。
5. 關(guān)于字符串
以下都是對的
print "It's good" 外面雙引號里面就用單引號啊鸭,反過來一樣
print "It\'s good"
#同樣支持轉(zhuǎn)義字串
print "You are a \"good\" man"
超級無敵的三個引號锹淌,里面的內(nèi)容原樣顯示,包括換行:
print """
Stay hungry,
stay foolish.
? ? ? ? ? ? -- Steve Jobs
"""
再看幾個字符串的例子赠制,一看就懂
print "very "+ str1
print "price is %.2f" %4.99
yourname="Stephen"
print "I love you, %s." %yourname
print "Today is %s." %'Friday'
6. for的嵌套
看個例子
*
**
***
****
*****
代碼實現(xiàn):
for j in range(0,5):
? ? for i in range(0,j+1):
? ? ? ? print "*",
? ? print ""
注意到上面的逗號是不換行赂摆,在python3里要寫成print('*', end=' ')
另外看一個例子,參數(shù)有多個的
print "%s's score is %d" % ('Mike', 87)
7. 布爾型的微小的反人類設(shè)計
在python中钟些,其他類型轉(zhuǎn)成 bool 類型時烟号,以下數(shù)值會被認為是False:
? ?為0的數(shù)字,包括0政恍,0.0
空字符串汪拥,包括'',""
表示空值的None
? ?空集合篙耗,包括()迫筑,[],{}
其他的值都認為是True宗弯。
其實這個規(guī)則還好了脯燃,0是False而1是True是計算機界的傳統(tǒng)。
None是python中的一個特殊值蒙保,表示什么都沒有曲伊。感覺有點像Java中的null
8. 函數(shù)
先看簡單的例子,很小白:
def sayHello():
? ? print ("well, hello")
sayHello()
sayHello()
sayHello()
明白了吧,def是定義一個函數(shù)體
再來個帶參數(shù)的
def plusint(num1, num2):
? ? print (int(num1) + int(num2))
print ("please input n1")
n1 = input()
print ("please input n2")
n2 = input()
sum = plusint(n1,n2)
print (sum)
9. 條件if , else, elif
看下面的例子足夠
print ("please input a")
a = input()
if a=="1":
? ? print ("you input 1")
elif a=="2":
? ? print ("you input 2")
else:
? ? print ("you input other")
和其它語言一樣追他, if也可以嵌套
10. 列表list
a = [1,1,2,3,5,8,13]
print (a)
b = range(10,15)
print (b)
c = ["meat","egg","fish"]
print (c)
d = [365, True]
print (d)
#delete second item in list c
del c[1] 注意這是刪除指令坟募,好熟悉,egg被刪除了
for i in c:
? ? print (i)
list中的每個元素都對應(yīng)一個遞增的序號。與現(xiàn)實中習(xí)慣的序號不同在于邑狸,計算機中的計數(shù)通常都是從0開始懈糯,python也不例外。如果你記不清這個而導(dǎo)致了錯誤单雾,請去聽一下孫燕姿的《愛從零開始》
#猜點球游戲,重點是choice方法的使用
from random import choice
print ("Choose one side to shoot:")
print ("left, center, right")
you = input()
print ("You kicked " + you)
direction = ["left", "center", "right"]
com = choice(direction) 從list中取出一個元素
print ("Computer saved" + com)
if you != com:
? print ("Goal!")
else:
? print ("Oops...")
另外關(guān)于list的負數(shù)表示赚哗,顛覆三觀她紫,實際是從右往左倒著數(shù)的意思:
>>> m = [1,3,5,7,9]
>>> m[-1]
9 倒數(shù)第1個元素是9
>>> m[-2]
7 倒數(shù)第2個元素是7
>>> m[2:4] 請注意,冒號這是切片操作符
[5, 7] 第2和第3個元素屿储,從0計數(shù)
切片操作符是在[]內(nèi)提供一對可選數(shù)字贿讹,用:分割。冒號前的數(shù)表示切片的開始位置够掠,冒號后的數(shù)字表示切片到哪里結(jié)束民褂。同樣,計數(shù)從0開始疯潭。
注意赊堪,開始位置包含在切片中,而結(jié)束位置不包括竖哩。
11.? 字符串的分割split
sentence1 = "I'm a student."
a1 = sentence1.split();
print (a1)
sentence2 = "3.1.4.1.5"
a2 = sentence2.split(".")
print (a2)
執(zhí)行結(jié)果:
["I'm", 'a', 'student.']
['3', '1', '4', '1', '5']
12. 字符串的連接join
看例子就懂了
s=";"
t = ""
li = ["apple", "pear", "orange"]
fruit1 = s.join(li)
print (fruit1)
fruit2 = t.join(li)
print (fruit2)
執(zhí)行結(jié)果:
apple;pear;orange
applepearorange
以上太費事了哭廉,簡潔一點就這么寫
result = "".join(['hello', 'world'])
結(jié)果是helloworld
13. 字符串運算總結(jié):
1) 遍歷
通過for...in可以遍歷字符串中的每一個字符。
word = 'helloworld'
for c in word:
? ?print c
2)索引訪問
通過[]加索引的方式相叁,訪問字符串中的某個字符遵绰。
print word[0]
print word[-2]
與list不同的是,字符串不能通過索引訪問去更改其中的字符增淹。
word[1] = 'a'
這樣的賦值是錯誤的街立。
3) 切片
通過兩個參數(shù),截取一段子串埠通,具體規(guī)則和list相同赎离。
print word[5:7]
print word[:-5]
print word[:] 全都打印出來了
4.)連接字符
join方法也可以對字符串使用,作用就是用連接符把字符串中的每個字符重新連接成一個新字符串端辱。
newword = ','.join(word)
14. 文件讀和寫
#寫文件例子
f1name = "1.txt"
f1 = open(f1name)
data = f1.read()
print (data)
f1.close()
#讀文件例子
f2name = "2.txt"
f2 = open(f2name, "w")
f2.write("a new century");
f2.close()
readline() #讀取一行內(nèi)容
readlines() #把內(nèi)容按行讀取至一個list中
15. break和continue
while True:
? a = input()
? if a == 'hello':
? ? ? print ("hello to you")
? ? ? continue 繼續(xù)循環(huán)
? if a == 'bye':
? ? ? break 中斷
16. 異常
支持try: except:捕獲異常
try:
? ? f = open('non-exist222.txt')
? ? print ('File opened!')
? ? f.close()
except:
? ? print ("maybe file not exist")
17. 字典(像是java里的map, key-value對)
score={
? ? "Lucy":95,
? ? "Lily":98
}
print (score)
del (score["Lucy"])
print (score)
18. 模塊
import random 直接用import
print (random.randint(1,10))
print (random.choice([1,3,5]))
dir (random)
from math import pi 用from...import...
print(pi)
19. 方法的缺省參數(shù)
#def func(a=2,b)這是錯誤的梁剔,缺省的參數(shù)應(yīng)該在最后
def func(a,b=5):
? ? print (a+b)
func(3)
func(2,8)
20 綜合例子 查天氣
查天氣就是發(fā)http request, 提交上城市的code, 然后返回json描述天氣
import urllib.request
import json
from city import city 這里的city.py是一個字典,用于城市中文和城市代碼對應(yīng)關(guān)系的
def readweather():
? ? cityname = input("which city?\n");
? ? citycode = city.get(cityname)
? ? #citycode = "101120201"
? ? if citycode:
? ? ? ? try:
? ? ? ? ? ? url = ("http://www.weather.com.cn/data/cityinfo/%s.html" %citycode)
? ? ? ? ? ? print ("url=\n" + url)
? ? ? ? ? ? content = urllib.request.urlopen(url).read()
? ? ? ? ? ? jsondata = json.loads(content) 看舞蔽,這一句話就整成json了
? ? ? ? ? ? print (content)
? ? ? ? ? ? print ()
? ? ? ? ? ? print (jsondata)
? ? ? ? ? ? result = jsondata["weatherinfo"] 這一句話就把json節(jié)點取出來了
? ? ? ? ? ? str_temp = ("weather is%s, and degree is:\nfrom %s to %s")%(
? ? ? ? ? ? ? ? result["weather"], 把json的子節(jié)點取出來荣病,這是天氣概況
? ? ? ? ? ? ? ? result["temp1"], 最低溫度
? ? ? ? ? ? ? ? result["temp2"] 最高溫度
? ? ? ? ? ? )
? ? ? ? ? ? print (str_temp)
? ? ? ? except:
? ? ? ? ? ? print ("query fail") 可能網(wǎng)絡(luò)服務(wù)異常或沒網(wǎng)
? ? else:
? ? ? ? print ("city not found!") 沒有找到合適的city
另外附上幾行city.py內(nèi)容:
city = {
? ? '北京': '101010100',
? ? '海淀': '101010200',
}
運行結(jié)果是這樣的:
21. 面向?qū)ο?/p>
同樣python支持OOP渗柿,看來簡單的例子
class MyClass:
? ? name = "Tom"
? ? def sayHi(self): 這個self是個保留字,等同于java里的this. 是要顯式的傳遞的颊亮,和java不一樣的, 其實有點繁瑣,
? ? ? ? print ("Hi %s"%self.name)
? ? def sayGoodbye(self, something):
? ? ? ? print ("Goodbye %s"%something);
mc = MyClass()
mc.name="Lily"
mc.sayHi()
mc.sayGoodbye("now")
注意:
__init__函數(shù)會在類被創(chuàng)建的時候自動調(diào)用,用來初始化類
22. and和or的技巧
好吧,我討厭這些技巧,看一眼知道意思就行了涡扼。
and-or真正的技巧在于汤善,確保a的值不會為假。最常用的方式是使 a 成為 [a] 、 b 成為 [b],然后使用返回值列表的第一個元素:
a = "123"
b = "hell"
c = (True and [a] or [b])[0]
print (c)
打印的是123
拋開繞人的and和or的邏輯,你只需記住,在一個bool and a or b語句中廊遍,當(dāng)bool條件為真時英染,結(jié)果是a;當(dāng)bool條件為假時,結(jié)果是b漏设。
有學(xué)過c/c++的同學(xué)應(yīng)該會發(fā)現(xiàn),這和bool?a:b表達式很像。
我還是討厭這種讓人看不懂的用法
23. 元組(tuple)
其實 tuple(音:它跑)也譯作數(shù)組
元組(tuple)也是一種序列,和我們用了很多次的list類似,只是元組中的元素在創(chuàng)建之后就不能被修改抛猖。---好吧撑教,我可以把它當(dāng)作list常量嗎?
position = (1, 2)
geeks = ('Sheldon', 'Leonard', 'Rajesh', 'Howard')
print (position)
print (geeks)
#都是元組的實例。它有和list同樣的索引排吴、切片、遍歷等操作
上面講的太高深和不接地氣了懦鼠,其實:
其實我們之前一直在用元組钻哩,就是在print語句中:
print '%s is %d years old' % ('Mike', 23)
('Mike', 23)就是一個元組。這是元組最常見的用處肛冶。
23. math庫
和其它語言一樣街氢,提供了許多的數(shù)學(xué)庫,千萬要用睦袖,不要自己再發(fā)明輪子了
import math
print ("pi="+ str(math.pi))
print ("e="+ str(math.e))
print ("2^32=" + str( math.pow(2,64) ) )
print ("sqrt " + str ( math.sqrt(2) ))
24. 正則表達式
import re
text = "Hi, I am Lucy"
m = re.findall(r"[Hh]i", text)
if m:
? ? print (m)
else:
? ? print ("not match")
結(jié)果輸出['Hi']
r"hi"
這里字符串前面加了r珊肃,是raw的意思,即不使用轉(zhuǎn)義
今天主要說兩個符號“.”和“*”扣泊,順帶說下“\S”和“?”近范。
“.”在正則表達式中表示除換行符以外的任意字符嘶摊。在上節(jié)課提供的那段例子文本中:
Hi, I am Shirley Hilton. I am his wife.
如果我們用“i.”去匹配延蟹,就會得到
['i,', 'ir', 'il', 'is', 'if']
你若是暴力一點,也可以直接用“.”去匹配叶堆,看看會得到什么阱飘。
與“.”類似的一個符號是“\S”,它表示的是不是空白符的任意字符虱颗。注意是大寫字符S沥匈。
--
在很多搜索中,會用“?”表示任意一個字符忘渔,“*”表示任意數(shù)量連續(xù)字符高帖,這種被稱為通配符。但在正則表達式中畦粮,任意字符是用“.”表示散址,而“*”則不是表示字符,而是表示數(shù)量:它表示前面的字符可以重復(fù)任意多次(包括0次)宣赔,只要滿足這樣的條件预麸,都會被表達式匹配上。
結(jié)合前面的“.*”儒将,用“I.*e”去匹配吏祸,想一下會得到什么結(jié)果?
['I am Shirley Hilton. I am his wife']
結(jié)果是['ley Hilton. I am his wife']钩蚊,即貪婪匹配
再換成這個"l.*?e"贡翘, 懶惰匹配蹈矮,得到['le', 'lton. I am his wife']
這里不說太多了,記不住鸣驱,做爬蟲實戰(zhàn)的時候含滴,一定會返回來繼續(xù)看的批幌。
25. 再議隨機數(shù)
1)產(chǎn)生隨機整數(shù)
num = random.randint(1,100)
2)產(chǎn)生隨機小數(shù)航徙,
num2 = random.uniform(5,6.5)
print (num2)
2)關(guān)于choice
random.choice(seq)
從序列中隨機選取一個元素。seq需要是一個序列早抠,比如list递胧、元組碑韵、字符串。
random.choice([1, 2, 3, 5, 8, 13]) #list
random.choice('hello') #字符串
random.choice(['hello', 'world']) #字符串組成的list
random.choice((1, 2, 3)) #元組
3) 帶step的高級用法
random.randrange(start, stop, step)
random.randrange(1, 9, 2)
就是從[1, 3, 5, 7]中隨機選取一個缎脾。
random.randrange(start, stop, step)其實在效果上等同于
random.choice(range(start, stop, step))
4)取樣
random.sample(population, k)
從population序列中祝闻,隨機獲取k個元素,生成一個新序列遗菠。sample不改變原來序列
26. 關(guān)于時間time
import time
starttime = time.time() 一個很大的小數(shù)
print (starttime)
time.sleep(2) 延時2秒
print ("2 secs arrived")
27. 調(diào)試程序
traceback信息就是報錯联喘,也可以自己在合適的地方print
28. python shell的使用
提示符>>>就不再提了,關(guān)注一下返回上一個命令不是像DOS命令行一樣按上箭頭辙纬,而是alt+p 組合
29. 序列化pickle
存到文件和從文件中取出
import pickle
test_data = ["save me!", 123.456, True]
f = open("mypickle.txt", "wb")
pickle.dump(test_data, f)
f.close()
f2 = open("mypickle.txt", "rb")
newdata = pickle.load(f2)
f2.close()
print (newdata)
運行結(jié)果是:
['save me!', 123.456, True]
30.?列表解析List Comprehension
讓代碼更簡潔的辦法:
list_1 = [1, 2, 3, 5, 8, 13, 22]
list_2 = [i for i in list_1 if i % 2 == 0]
print list_2
輸出
[2, 8, 22]
31. 帶參數(shù)的函數(shù)
光看例子不說話豁遭,體會一下
def func(arg1=1, arg2=2, arg3=3):
print arg1, arg2, arg3
調(diào)用
func(2, 3, 4)
func(5, 6)
func(7)
輸出為
2 3 4
5 6 3
7 2 3
好了,你一定秒懂贺拣。
上次說的 func(*args) 方式是把參數(shù)作為 tuple 傳入函數(shù)內(nèi)部蓖谢。而 func(**kargs) 則是把參數(shù)以鍵值對字典的形式傳入。
示例:
def printAll(**kargs):
for k in kargs:
print k, ':', kargs[k]
printAll(a=1, b=2, c=3)
printAll(x=4, y=5)
輸出:
a : 1
c : 3
b : 2
y : 5
x : 4
在混合使用時譬涡,首先要注意函數(shù)的寫法闪幽,必須遵守:
帶有默認值的形參(arg=)須在無默認值的形參(arg)之后;
元組參數(shù)(*args)須在帶有默認值的形參(arg=)之后涡匀;
字典參數(shù)(**kargs)須在元組參數(shù)(*args)之后盯腌。
32. 蘭布達表達式
來看一個復(fù)雜一點的例子,把 lambda 表達式用在 def 函數(shù)定義中:
def fn(x):
return lambda y: x + y
a = fn(2)
print a(3)
輸出:
5
這里陨瘩,fn 函數(shù)的返回值是一個 lambda 表達式腕够,也就等于是一個函數(shù)對象。當(dāng)以參數(shù)2來調(diào)用 fn 時拾酝,得到的結(jié)果就是:
lambda y: 2 + y
33. 變量的作用域
def func(x):
? ? print ("X in the beginning of func(x):", x)
? ? x = 2
? ? print ("X in the end of func(x):", x)
x = 50
func(x)
print ("X after calling func(x): ", x)
print()
def func2():
global x
#建議在寫代碼的過程中燕少,顯式地通過 global 來使用全局變量,避免在函數(shù)中直接使用外部變量蒿囤。
print ("X start func(x):", x)
x = 3
print ("X end func(x):",x)
func2()
運行結(jié)果
X in the beginning of func(x): 50
X in the end of func(x): 2
X after calling func(x):? 50
X start func(x): 50
X end func(x): 3
34. 使用map
map()的使用方法形如map(f(x),Itera).
def triple_func(x):
? ? return x * 3
#lst_2 = list( map(triple_func, lst_1) )
lst_2 = list( map(lambda x: x*3, lst_1) )
print (lst_2)
35. 使用reduce
reduce()的使用
?reduce()的使用方法形如reduce(f(x),Itera).對客们,它的形式和map()函數(shù)一樣。不過參數(shù)f(x)必須有兩個參數(shù)。reduce()函數(shù)作用是:把結(jié)果繼續(xù)和序列的下一個元素做累積計算底挫。
from functools import reduce
lst = range(1, 101)
def add(x, y):
? ? return x + y
print (reduce(add, lst))
36. 多線程
暫不學(xué)了