1.輸出 print
打印
print語句也可以跟上多個字符串赶促,用逗號“,”隔開,print會依次打印每個字符串廓脆,遇到逗號“,”會輸出一個空格.
格式化
%運算符就是用來格式化字符串的宛瞄。在字符串內(nèi)部,%s表示用字符串替換上鞠,%d表示用整數(shù)替換,有幾個%?占位符芯丧,后面就跟幾個變量或者值芍阎,順序要對應(yīng)好。如果只有一個%?注整,括號可以省略能曾。
%d 整數(shù)
%f 浮點數(shù)
%s 字符串
%x 十六進制整數(shù)
其中度硝,格式化整數(shù)和浮點數(shù)還可以指定是否補0和整數(shù)與小數(shù)的位數(shù)肿轨,%s永遠(yuǎn)起作用,它會把任何數(shù)據(jù)類型轉(zhuǎn)換為字符串蕊程。
2.輸入 raw_input()
當(dāng)輸入name = raw_input()并按下回車椒袍,Python交互式命令行就在等待你的輸入。這時藻茂,可以輸入任意字符驹暑,然后按回車后完成輸入。
raw_input()讀取的內(nèi)容永遠(yuǎn)以字符串的形式返回辨赐。
3.語法基礎(chǔ)
以#開頭的語句是注釋优俘,注釋是給人看的,可以是任意內(nèi)容掀序,解釋器會忽略掉注釋帆焕。其他每一行都是一個語句,當(dāng)語句以冒號“:”結(jié)尾時不恭,縮進的語句視為代碼塊
字符串
單雙引號皆可叶雹,但是不能混用财饥。Python允許用'''...'''的格式表示多行內(nèi)容.
字符串里面有很多字符都需要轉(zhuǎn)義,就需要加很多\折晦,為了簡化钥星,Python還允許用r''表示''內(nèi)部的字符串默認(rèn)不轉(zhuǎn)義。
打印中文和Unicode字符串使用 u'' ,u'xxx'轉(zhuǎn)換為UTF-8編碼的'xxx'用encode('utf-8')方法
空值满着。反過來谦炒,把UTF-8編碼表示的字符串'xxx'轉(zhuǎn)換為Unicode字符串u'xxx'用decode('utf-8')方法。
len()函數(shù)可以返回字符串的長度
空值是Python里一個特殊的值漓滔,用None表示编饺。None不能理解為0,因為0是有意義的响驴,而None是一個特殊的空值透且。
4.字符串轉(zhuǎn)換ord 和chr
Python提供了ord()和chr()函數(shù),可以把字母和對應(yīng)的數(shù)字相互轉(zhuǎn)換.
由于Python源代碼也是一個文本文件豁鲤,所以秽誊,當(dāng)你的源代碼中包含中文的時候,在保存源代碼時琳骡,就需要務(wù)必指定保存為UTF-8編碼锅论。當(dāng)Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取楣号,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
5.判斷
判斷
if語句執(zhí)行有個特點最易,它是從上往下判斷,如果在某個判斷上是True藻懒,把該判斷對應(yīng)的語句執(zhí)行后,就忽略掉剩下的elif和else
只要x是非零數(shù)值视译、非空字符串、非空list等酷含,就判斷為True,否則為False
6.數(shù)據(jù)結(jié)構(gòu)
list
Python內(nèi)置的一種數(shù)據(jù)類型是列表:list椅亚。list是一種有序的集合,可以隨時添加和刪除其中的元素呀舔。用索引來訪問list中每一個位置的元素,記得索引是從0開始.list里面的元素的數(shù)據(jù)類型可以不同.
classmates = ['Michael', 'Bob', 'Tracy']
append追加,pop刪除,insert插入
tuple
另一種有序列表叫元組:tuple。tuple和list非常類似躯舔,但是tuple一旦初始化就不能修改驴剔,比如同樣是列出同學(xué)的名字
t = ('a', 'b', ['A', 'B'])
只有1個元素的tuple定義時必須加一個逗號,,來消除歧義.
Python在顯示只有1個元素的tuple時粥庄,也會加一個逗號,丧失,以免你誤解成數(shù)學(xué)計算意義上的括號。
dict
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
Python內(nèi)置了字典:dict的支持惜互,dict全稱dictionary布讹,在其他語言中也稱為map,使用鍵-值(key-value)存儲训堆,具有極快的查找速度描验。
dict提供的get方法,如果key不存在坑鱼,可以返回None膘流,或者自己指定的value.
要刪除一個key,用pop(key)方法鲁沥,對應(yīng)的value也會從dict中刪除.
正確使用dict非常重要呼股,需要牢記的第一條就是dict的key必須是不可變對象.
set
set和dict類似,也是一組key的集合画恰,但不存儲value彭谁。由于key不能重復(fù),所以允扇,在set中缠局,沒有重復(fù)的key。
s = set([1, 2, 3])
add添加考润,remove刪除
set可以看成數(shù)學(xué)意義上的無序和無重復(fù)元素的集合狭园,因此,兩個set可以做數(shù)學(xué)意義上的交集额划、并集等操作妙啃。
如果原生函數(shù)被覆蓋档泽,使用del funcName 就可以重新得到原生函數(shù)
7.函數(shù)的參數(shù)
Python的函數(shù)定義非常簡單俊戳,但靈活度卻非常大。除了正常定義的必選參數(shù)外馆匿,還可以使用默認(rèn)參數(shù)抑胎、可變參數(shù)和關(guān)鍵字參數(shù),使得函數(shù)定義出來的接口渐北,不但能處理復(fù)雜的參數(shù)阿逃,還可以簡化調(diào)用者的代碼。
數(shù)據(jù)類型檢查可以用內(nèi)置函數(shù)isinstance實現(xiàn).
默認(rèn)參數(shù)
def enroll(name, gender, age=6, city='Beijing'):
定義一個擁有兩個默認(rèn)參數(shù)的函數(shù)
可變參數(shù)
def calc(*numbers):
定義一個可變參數(shù)的函數(shù)。
定義可變參數(shù)和定義list或tuple參數(shù)相比恃锉,僅僅在參數(shù)前面加了一個*號。在函數(shù)內(nèi)部破托,參數(shù)numbers接收到的是一個tuple,因此州既,函數(shù)代碼完全不變吴叶。但是蚌卤,調(diào)用該函數(shù)時奥秆,可以傳入任意個參數(shù)吭练,包括0個參數(shù)
關(guān)鍵字參數(shù)
def person(name, age, **kw):
print 'name:', name, 'age:', age, 'other:', kw
可變參數(shù)允許你傳入0個或任意個參數(shù),這些可變參數(shù)在函數(shù)調(diào)用時自動組裝為一個tuple签赃。而關(guān)鍵字參數(shù)允許你傳入0個或任意個含參數(shù)名的參數(shù)锦聊,這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動組裝為一個dict孔庭。
在Python中定義函數(shù)圆到,可以用必選參數(shù)卑吭、默認(rèn)參數(shù)豆赏、可變參數(shù)和關(guān)鍵字參數(shù)富稻,這4種參數(shù)都可以一起使用椭赋,或者只用其中某些纹份,但是請注意蔓涧,參數(shù)定義的順序必須是:必選參數(shù)笋额、默認(rèn)參數(shù)兄猩、可變參數(shù)和關(guān)鍵字參數(shù)。
8.高階特性
切片
切片(Slice)操作符
>>>L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
>>>L[0:3]
['Michael', 'Sarah', 'Tracy']
tuple也是一種list鸠姨,唯一區(qū)別是tuple不可變讶迁。因此巍糯,tuple也可以用切片操作祟峦,只是操作的結(jié)果仍是tuple徙鱼。
字符串'xxx'或Unicode字符串u'xxx'也可以看成是一種list袱吆,每個元素就是一個字符。因此迅箩,字符串也可以用切片操作溉愁,只是操作結(jié)果仍是字符串。
迭代
通過collections模塊的Iterable類型判斷
isinstance('abc', Iterable)
列表生成式
列表生成式即List Comprehensions奕塑,是Python內(nèi)置的非常簡單卻強大的可以用來創(chuàng)建list的生成式家肯。例如:
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> [m + n for m in 'ABC' for n in 'XYZ']//字符串全排列
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
>>> L = ['Hello', 'World', 'IBM', 'Apple']//傳入函數(shù)
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
生成器 Generator
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x104feab40>
可以通過generator的next()方法讨衣,一個一個的打印元素。但通常都是用for循環(huán),因為生成器是可迭代的固蚤。
定義generator的另一種方法歹茶。如果一個函數(shù)定義中包含yield關(guān)鍵字惊豺,那么這個函數(shù)就不再是一個普通函數(shù)尸昧,而是一個generator
generator函數(shù)烹俗,在每次調(diào)用next()的時候執(zhí)行,遇到y(tǒng)ield語句返回累提,再次執(zhí)行時從上次返回的yield語句處繼續(xù)執(zhí)行磁浇。
9.高階函數(shù)
map
map()函數(shù)接收兩個參數(shù)置吓,一個是函數(shù),一個是序列友题,map將傳入的函數(shù)依次作用到序列的每個元素度宦,并把結(jié)果作為新的list返回。
>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce
reduce把一個函數(shù)作用在一個序列[x1, x2, x3...]上离唬,這個函數(shù)必須接收兩個參數(shù)划鸽,reduce把結(jié)果繼續(xù)和序列的下一個元素做累積計算
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
>>> def add(x, y):
... return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
filter
Python內(nèi)建的filter()函數(shù)用于過濾序列裸诽。
和map()類似丈冬,filter()也接收一個函數(shù)和一個序列。和map()不同的時实夹,filter()把傳入的函數(shù)依次作用于每個元素亮航,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素缴淋。
def is_odd(n)://在一個list中泄朴,刪掉偶數(shù),只保留奇數(shù)
return n % 2 == 1
filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
# 結(jié)果: [1, 5, 9, 15]
sorted
sorted()函數(shù)也是一個高階函數(shù)钟沛,它還可以接收一個比較函數(shù)來實現(xiàn)自定義的排序
10.閉包
返回的函數(shù)在其定義內(nèi)部引用了局部變量args恨统,所以畜埋,當(dāng)一個函數(shù)返回了一個函數(shù)后悠鞍,其內(nèi)部的局部變量還被新函數(shù)引用
裝飾器
實例:
def bdcall(text):
if callable(text):
@functools.wraps(text)
def wrapper(*args,**kw):
print 'begin call %s: '%text.__name__
text(*args,**kw)
print 'end call %s: '%text.__name__
return wrapper
else:
def decorator(func):
@functools.wraps(func)
def wrapper(*args,**kw):
print 'text: %s : ' %text
func(*args,**kw)
print 'end call %s: '%func.__name__
return wrapper
return decorator
@bdcall('demo')
def bdexe():
print 'func exec'
bdexe()
print bdexe.__name__
@bdcall
def bdexe2():
print 'func exec2'
bdexe2()
print bdexe2.__name__
輸出
text: demo:
func exec
end call bdexe:
bdexe
begin call bdexe2:
func exec2
end call bdexe2:
bdexe2
偏函數(shù)
Python的functools模塊提供了很多有用的功能模燥,其中一個就是偏函數(shù)(Partial function)。要注意心肪,這里的偏函數(shù)和數(shù)學(xué)意義上的偏函數(shù)不一樣纠吴。
函數(shù)參數(shù)通過設(shè)定默認(rèn)值戴已,可以降低函數(shù)調(diào)用的難度糖儡。而偏函數(shù)也可以做到這一點。
簡單總結(jié)functools.partial的作用就是桦沉,把一個函數(shù)的某些參數(shù)給固定状柯丁(也就是設(shè)置默認(rèn)值)埠褪,返回一個新的函數(shù)挤庇,調(diào)用這個新函數(shù)會更簡單嫡秕。
11.模塊
在Python中昆咽,一個.py文件就稱之為一個模塊(Module)。
通過包來組織模塊狭郑,避免沖突翰萨。
請注意亩鬼,每一個包目錄下面都會有一個init.py的文件,這個文件是必須存在的黄绩,否則爽丹,Python就把這個目錄當(dāng)成普通目錄粤蝎,而不是一個包初澎。init.py可以是空文件,也可以有Python代碼碑宴,因為init.py本身就是一個模塊延柠,而它的模塊名就是文件夾名稱捕仔。
模塊實例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
' a test module '
__author__ = 'Michael Liao'
import sys
def test():
args = sys.argv
if len(args)==1:
print 'Hello, world!'
elif len(args)==2:
print 'Hello, %s!' % args[1]
else:
print 'Too many arguments!'
if __name__=='__main__':
test()
第1行和第2行是標(biāo)準(zhǔn)注釋榜跌,第1行注釋可以讓這個hello.py文件直接在Unix/Linux/Mac上運行钓葫,第2行注釋表示.py文件本身使用標(biāo)準(zhǔn)UTF-8編碼础浮;
第4行是一個字符串豆同,表示模塊的文檔注釋影锈,任何模塊代碼的第一個字符串都被視為模塊的文檔注釋鸭廷;
第6行使用author變量把作者寫進去枣抱,這樣當(dāng)你公開源代碼后別人就可以瞻仰你的大名。