Python 学习拾遗
該博文主要適應于python2.7,并沒有對py3進行測試。
主要記錄學習python過程中容易出現(xiàn)的一些小問題、小錯誤,相信能給你啟發(fā)。
1、剔除一個字符串中的所有空格(假設該字符串是s)
"".join(s.split())
樣例輸入:
s =?' ? ?123 ?4567 ? ?8 ? '
樣例輸出:
'12345678'
?
2、剔除文件名字符串中的非法字符(假設字符串是s)
有的時候從網上抓取下來的標題需要作為文件名保存到本地(windows環(huán)境)
但是windows下文件名中不能包含一些非法字符,例如‘/’、‘\’、‘?’ 神馬的
你可以用下面這段代碼剔除標題中的非法字符
?
pattern = re.compile(r'[/\:*?"<>|]')
s = re.sub(pattern,'',s)
樣例輸入:
s = '<<?I am title?>>'
樣例輸出:
'I am title'
?
3、列表解析、base64解密、chr()、int()、join()函數(shù)使用
這是知道創(chuàng)宇的余弦出的一個解密小游戲,給你一個字符串,你需要解密出一個郵箱地址。
密碼字符串為:
XDY1XDc2XDY5XDZjXDYzXDZmXDczXDQwXDY3XDZkXDYxXDY5XDZjXDJlXDYzXDZmXDZk
解密方式為先用base64解密,再進行16進制轉換,最后按ASCII碼輸出每個字符。
這個小游戲很有意思,可以學習到一些python知識。
下面是解題步驟:
1、base64解密
s = 'XDY1XDc2XDY5XDZjXDYzXDZmXDczXDQwXDY3XDZkXDYxXDY5XDZjXDJlXDYzXDZmXDZk'
print base64.b64decode(s)
輸出:
\65\76\69\6c\63\6f\73\40\67\6d\61\69\6c\2e\63\6f\6d
這一看就是一種字符編碼,最先猜到是ASCII編碼。
為了方便觀察,將其拆分:
print base64.b64decode(s).split('\\')
輸出:
['', '65', '76', '69', '6c', '63', '6f', '73', '40', '67', '6d', '61', '69', '6c', '2e', '63', '6f', '6d']
由于每個元素帶有字母,猜測是16進制數(shù),轉換進制。
int(c,16) 可以將字符串c當成16進制數(shù),將其轉換成10進制數(shù)返回(注意返回的是一個整數(shù))
chr(n) ? ? 可以將一個整數(shù)n轉換成對應的ASCII字符。
于是有代碼:
for c in base64.b64decode(s).split('\\'):
if c: # 剔除空元素
print chr(int(c,16)),
輸出:
e v i l c o s @ g m a i l . c o m?
以上代碼可以用 列表解析 簡潔表示:
print [chr(int(c,16)) for c in base64.b64decode(s).split('\\') if c]
輸出:
['e', 'v', 'i', 'l', 'c', 'o', 's', '@', 'g', 'm', 'a', 'i', 'l', '.', 'c', 'o', 'm']
3、join()連接為字符串
s.join(l) ?表示將列表l中每個字符連接成一個字符串,用字符串s作為間隔
so,可以將上述列表連接成字符串:
print ''.join([chr(int(c,16)) for c in base64.b64decode(s).split('\\') if c])
輸出:
evilcos@gmail.com
以上,就得到余弦大大的郵箱咯,是不是很有意思?
?
4.理解python繼承的小例子
1 #coding=gbk 2 class A(object): 3 name = 'boss' 4 print name 5 def __init__(self,name=None): 6 print '2' 7 if name is not None: 8 self.name = name 9 print self.name 10 11 12 class B(A): 13 print '1' 14 name = 'Boss' 15 16 te = B()運行結果:
boss 1 2 Boss可以看出類中變量和函數(shù)的繼承調用關系。
實例化B,先是運行從A繼承來的語句,運行結果:
boss再運行B中的語句,運行結果:
1最后調用從A繼承過來的構造函數(shù)__init__(),運行結果:
2 Boss?
5.python列表解析中的雙重循環(huán)
如何將B列表中的每一個元素與A列表中的元素相加,生成一個新列表?
請看以下代碼:
1 A = [1,2,3] 2 B = [4,5,6] 3 print [x+y for x in A for y in B]以上列表解析的寫法相當于一個雙重循環(huán),先遍歷B中每一個元素,再遍歷A中每一個元素,每輪循環(huán)進行元素相加操作,最后得到一個新列表。
?
6.max()的比較函數(shù)
max()函數(shù)原型:
max(arg1, arg2, *args[, key])例子:
1 #coding=gbk 2 A = [1,3,5,2,4] 3 4 print max(A) # 輸出A中最大的元素 5 print max(A,key=lambda x:x>2) # 輸出A中第一個大于2的元素 6 7 print max('af', 'be','cd') # 輸出最大的字符串,比較規(guī)則為默認的字符串比較規(guī)則 8 print max('af', 'be','cd', key=lambda x: x[1]) # 輸出第二個字符最大的字符串輸出:
5 3 cd afkey參數(shù)值為一個函數(shù)入口指針,你可以將自己定義的函數(shù)作為參數(shù)傳進來,max函數(shù)將根據你定義的函數(shù)來進行比較,你可以自己制訂比較規(guī)則。
lambda為python中一種定義函數(shù)(匿名函數(shù))的方法,你也可以用def定義。
?
7.reverse()函數(shù)有返回值嗎?
請看以下代碼,猜猜它會輸出什么呢?
1 A = [1,2,3] 2 print A.reverse()是不是第一眼以為會輸出 [3,2,1] ?哈哈,錯了。真正的輸出是:
None看一下reverse()的語法:
list.reverse() 參數(shù):NA 返回值:該方法沒有返回值,但是會對列表的元素進行反向排序。?
8.提取url中的host(域名)
使用urllib庫提供的函數(shù),用法如下:
1 import urllib 2 3 protocol, rest = urllib.splittype('https://www.cnblogs.com:80/yym2013') 4 # protocol : https 5 # rest : //www.cnblogs.com:80/yym2013 6 7 host, rest = urllib.splithost(rest) 8 # host : www.cnblogs.com:80 9 # rest : /yym2013 10 11 host, port = urllib.splitport(host) 12 # host : www.cnblogs.com 13 # port : 80參考自:?python 獲取url的host
?
9.if-else 單行書寫方法
if a>b:t = a else:t = b?轉換成if-else單行形式:
t = a if a>b else b?
10.open的文件打開模式
r或rt 默認模式,文本模式讀 rb 二進制文件w或wt 文本模式寫,打開前文件存儲被清空 wb 二進制寫,文件存儲同樣被清空a 追加模式,只能寫在文件末尾 a+ 可讀寫模式,寫只能寫在文件末尾w+ 可讀寫,與a+的區(qū)別是要清空文件內容 r+ 可讀寫,與a+的區(qū)別是可以寫到文件任何位置特別注意:a+、w+、r+的區(qū)別,他們雖然都是讀寫模式,但使用效果是有差別的。
參考自:Python open()文件處理使用介紹
?
11.關于文件讀寫錯誤?IOError: [Errno 0] Error
該錯誤通常在windows環(huán)境下,使用a+讀寫模式打開文件,并對其先進行read()讀操作,然后進行write()寫入操作后出現(xiàn)的。原因是沒有進行flush或者seek等操作,python不知道文件位置在哪了。
參考自:python IOError: [Errno 0] Error - freeDynasty
?
12、使用python發(fā)送郵件
參考自:使用python發(fā)送郵件
?
13、python的編號迭代
有時候想用下標記錄當前遍歷的位置,同時又想有當前元素,自建一個變量變量作為下標又太low,優(yōu)雅一些的做法是用內建函數(shù)enumerate()進行迭代。
這樣既會有下標,又會有當前迭代元素。
for index,s in enumerate(str):print '%d==>%s'%(index,s)?
14、list元素去重
我比較喜歡用set集合進行去重,另外如果要保留list的順序的話,需要使用sort進行排序。
詳見:python中對list去重的多種方法
?
15、如何用盡量簡潔的代碼輸出一個列表(list)的前五個元素
最直觀的寫法,定義一個下標變量index來控制輸出:
1 li = [1,2,3,4,5,6,7,8,9,10] 2 index = 0 3 for x in li: 4 if index>=5: 5 break 6 print x 7 index+=1觀察代碼,發(fā)現(xiàn)下標index可以用enumerate函數(shù)直接分離出來:
1 li = [1,2,3,4,5,6,7,8,9,10] 2 for index,x in enumerate(li): 3 if index>=5: 4 break 5 print x還有更簡單的寫法,使用列表的切片操作來簡化代碼:
1 li = [1,2,3,4,5,6,7,8,9,10] 2 for x in li[:5]: 3 print x?
16、readlines()會讀入換行符!
在一次用smtp服務發(fā)送郵件給自己的時候,我用readlines()讀取本地文件。
將帶有email的username和password的那兩行行直接賦值給用戶名和密碼變量。
結果導致收到的郵件開頭帶有亂碼,檢查了各個地方都沒有發(fā)現(xiàn)bug在哪里。
最后找到原因是輸入的用戶名和密碼最后分別帶有一個換行符,而郵件將多余的內容作為亂碼來處理了。
解決方法是readlines()讀取每一行內容后,賦值的時候需要先strip()去除字符串前后端多余的空白符。
?
?
Freecode# :?www.cnblogs.com/yym2013
轉載于:https://www.cnblogs.com/yym2013/p/5923953.html
總結
以上是生活随笔為你收集整理的Python 学习拾遗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《jQuery知识点总结》(一)
- 下一篇: webform Repeater重复器、