@Unicode
我們知道unicode是一種編碼標(biāo)準(zhǔn),具體的實(shí)現(xiàn)標(biāo)準(zhǔn)可能是utf-8糊秆,utf-16鹏往,gbk ……
python 在內(nèi)部使用兩個(gè)字節(jié)來存儲(chǔ)一個(gè)unicode,使用unicode對(duì)象而不是str的好處覆旱,就是unicode方便于跨平臺(tái)蘸朋。
當(dāng)對(duì)str進(jìn)行編碼時(shí),會(huì)先用默認(rèn)編碼將自己解碼為unicode扣唱,然后在將unicode編碼為你指定編碼,這就引出了python2.x中在處理中文時(shí)藕坯,大多數(shù)出現(xiàn)錯(cuò)誤的原因所在:python的默認(rèn)編碼,defaultencoding是ascii;
如果你在python中進(jìn)行編碼和解碼的時(shí)候噪沙,不指定編碼方式炼彪,那么python就會(huì)使用defaultencoding。默認(rèn)的defaultcoding:ascii是許多錯(cuò)誤的原因正歼,所以早早的設(shè)置defaultencoding是一個(gè)好習(xí)慣辐马。
u = unicode("人生苦短") 等價(jià)于 u = unicode("人生苦短",defaultencoding)
解碼:其他編碼--> unicode
編碼:unicode-->其他編碼
文件頭聲明編碼的作用:頂部的:# -*- coding: utf-8 -*-目前看來有三個(gè)作用。
? ? 1局义、如果代碼中有中文注釋喜爷,就需要此聲明
? ? 2、比較高級(jí)的編輯器(比如我的emacs)會(huì)根據(jù)頭部聲明旭咽,將此作為代碼文件的格式贞奋。
? ? 3、程序會(huì)通過頭部聲明穷绵,解碼初始化 u”人生苦短”轿塔,這樣的unicode對(duì)象,(所以頭部聲明和代碼的存儲(chǔ)格式要一致)
@仲墨、re
pat = ' "nid":(.*?)'
body = response.body.decode("utf-8","ignore")
re.compile(pat).findall(body)或者 re.findall(pat,body) 返回的是列表
如果你的desc是str
? ? desc =sel.xpath('//div[@class="des"]').extract()[0]
? ? item['italy'] = re.search('意大利:(.*?)西班牙',desc,re.S | re.M).group(1)
? ? item['spain'] = re.search('西班牙:(.*?)',desc,re.S | re.M).group(1)
如果你的desc是unicode
? ? desc =sel.xpath('//div[@class="des"]').extract()[0]
? ? item['italy'] = re.search(u'意大利:(.*?)西班牙',desc,re.S | re.M).group(1)
? ? item['spain'] = re.search(u'西班牙:(.*?)',desc,re.S | re.M).group(1)
@勾缭、yield
從控制權(quán)來說。函數(shù)里遇到return時(shí)目养,控制權(quán)交給主線程俩由,然后沒這個(gè)函數(shù)什么事了。如果遇到y(tǒng)ield癌蚁,控制權(quán)只是暫時(shí)交給主線程幻梯,函數(shù)繼續(xù)在那等著。另外努释,函數(shù)里出現(xiàn)yield就自動(dòng)變成生成器碘梢。
@、__future__
Python提供了__future__模塊伐蒂,把下一個(gè)新版本的特性導(dǎo)入到當(dāng)前版本煞躬,于是我們就可以在當(dāng)前版本中測(cè)試一些新版本的特性。舉例說明如下:
為了適應(yīng)Python 3.x的新的字符串的表示方法,在2.7版本的代碼中恩沛,可以通過unicode_literals來使用Python 3.x的新的語(yǔ)法
from__future__importunicode_literals
@在扰、pass
pass就是什么也不做,只是為了防止語(yǔ)法錯(cuò)誤雷客,比如:
if a>1:
? ? ? pass#我這里先不做任何處理芒珠,直接跳過,但是如果不寫pass搅裙,就會(huì)語(yǔ)法錯(cuò)誤
當(dāng)你在編寫一個(gè)程序時(shí)妓局,執(zhí)行語(yǔ)句部分思路還沒有完成,這時(shí)你可以用pass語(yǔ)句來占位呈宇,也可以當(dāng)做是一個(gè)標(biāo)記,是要過后來完成的代碼局雄。比如下面這樣:
>>>defiplaypython():>>>pass
定義一個(gè)函數(shù)iplaypython甥啄,但函數(shù)體部分暫時(shí)還沒有完成,又不能空著不寫內(nèi)容炬搭,因此可以用pass來替代占個(gè)位置蜈漓。
@、append和extend
append和extend針對(duì)python的列表
列表內(nèi)的元素為對(duì)象宫盔,可以為數(shù)字融虽、字符串、列表等等
append添加的是一個(gè)對(duì)象
extend添加一個(gè)列表
append
>>> append_list = [] >>> append_list.append(1) >>> append_list.append('a') >>> append_list.append(['ssss']) >>> append_list [1, 'a', ['ssss']]
extend
>>> extend_list = [] >>> extend_list.extend(1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not iterable >>> extend_list.extend([1]) >>> extend_list.extend(["a", [3, 4] ]) >>> extend_list [1, 'a', [3, 4]]