易忽視的Python知識點

一、sort和sorted
(1)sort:會直接修改原始列表的序列,只是排序,不去重。
>>> a=[2,5,7,8,3,5,1,3,9,6,2]
>>> a.sort()
>>> a
[1, 2, 2, 3, 3, 5, 5, 6, 7, 8, 9]
     
(2)sorted:不會修改原始列表的序列,只是排序,不去重。
>>> a=[2,5,7,8,3,5,1,3,9,6,2]
>>> sorted(a)
[1, 2, 2, 3, 3, 5, 5, 6, 7, 8, 9]
>>> a
[2, 5, 7, 8, 3, 5, 1, 3, 9, 6, 2]
二、remove:會直接把原始文件中的元素刪除。這裏須要注意一下,當循環刪除一個元素時,列表中的元素會前移
當列表是惟一的,或者是無連續要刪除的元素時,可採用循環刪除,這不會有問題,可是,當有連續要刪除的元素時,則會出問題。
好比:把a中全部的2刪除,結果發現,連續的要刪除的2出現時,有的2並無被刪除,這是由於,remove是原始列表修改的,而且,當刪除一個元素後,列表中該元素後面的全部元素會前移。
>>> a=[1,2,2,2,2,3,2,2,2,3,4,5,3,6,8,2,3,2,5]
>>> for aa in a:
    if aa==2:
        a.remove(aa)
>>> a
[1, 3, 2, 3, 4, 5, 3, 6, 8, 2, 3, 2, 5]
 
正確:可採用a[:],a[:]是a列表元素的複製,或者採用倒序的方式進行刪除,這裏用a[:]進行循環刪除。
>>> for aa in a[:]:
    if aa==2:
        a.remove(aa)
 
>>> a
[1, 3, 3, 4, 5, 3, 6, 8, 3, 5]
三、list和set都非原始列表修改
>>> a=[2,3,4,5]
(1)     >>> type(a)
<type 'list'>
>>> set(a)
set([2, 3, 4, 5])
>>> type(a)
<type 'list'>
 
四、list(set(a))這是set方法和list方法的聯合使用,能夠實現將列表a中的元素進行去重,可是並不會進行排序。
>>> a=[1,2,2,2,3,4,5,3,6,8,2,3,2,5,2,7,3]
>>> b=list(set(a))
>>> b
[1, 2, 3, 4, 5, 6, 7, 8]
>>> a
[1, 2, 2, 2, 3, 4, 5, 3, 6, 8, 2, 3, 2, 5, 2, 7, 3]
五、(intersection)交集、(union )並集、( difference)差集,只有set類型的列表才能夠用這些方法。
         >>> a=[2,3,4,5]
>>> b=[2,4,7,8]
(1) (intersection)交集:既在a中也b中的元素
>>> c=set(a).intersection(set(b))
>>> type(c)
<type 'set'>
>>> list(c)
[2, 4]
 
(2)(union )並集:在a中的全部元素和b中全部元素的集合,而且去重。
          >>> c=set(a).union(set(b))
>>> type(c)
<type 'set'>
>>> list(c)
[2, 3, 4, 5, 7, 8]
 
(3) ( difference)差集:在a中的元素,可是不在b中的元素
>>> c=set(a).difference(set(b))
>>> type(c)
<type 'set'>
>>> list(c)
[3, 5]
 
五、以r或者R開頭,表示該字符串是(非轉義)原始字符串,好比不加r的字符串,和加r的字符串在文檔中的顯示是不同的。
(1)不加r:則其中的特殊字符,有保留本身獨特的特性,好比\n表示換行,\t表示Tab。以r字符開頭的經常使用於正則表達式。
>>> a="good\nbye\terror"
>>> fn=open(r"E:\tempData.txt","w")
>>> fn.writelines(a)
>>> fn.close()
(2)加r:一些特殊字符,好比\n,\t,當加r表示時,會將這些特殊字符表示爲普通字符,而不會保留特殊字符獨有的特性。
>>> a=r"good\nbye\terror"
>>> fn=open(r"E:\tempData.txt","w")
>>> fn.writelines(a)
>>> fn.close()
六、以u或者U開頭的字符串表示unicode字符串,Unicode是書寫國際文本的標準方法。若是你想用非英語寫文本,那麼你須要有一個支持Unicode的編輯器。
這部分信息是摘錄別人的,僅供參考

今天看了一個說法,說是入坑windows程序開發,必先掌握文字的編碼和字符集知識。本博客就整理下信息存儲和字符編碼的相關知識。 
一.位: 
計算機存儲信息的最小單位,稱之爲位(bit),音譯比特,二進制的一個「0」或一個「1」叫一位。 
二.字節 
字節(Byte)是一種計量單位,表示數據量多少,它是計算機信息技術用於計量存儲容量的一種計量單位,8個二進制位組成1個字節。在ASCII碼中,一個標準英文字母(不分大小寫)佔一個字節位置,一個標準漢字佔二個字節位置。 
三.字符 
字符是指計算機中使用的文字和符號,好比「一、二、三、A、B、C、~!·#¥%…*()+」等等。 
四.ASCII碼 
先從最簡單的ASCII提及吧,這個你們也熟悉:全名是American Standard Code for Information Interchange, 叫作「美國信息交換標準碼」。ASCII碼中,一個英文字母(不分大小寫)佔一個字節的空間,一箇中文漢字佔兩個字節的空間。ASCII碼是目前最普及的一種字符編碼,它紮根於咱們的互聯網,操做系統,鍵盤,打印機,文件字體和打印機等。ASCII表以下:正則表達式

圖片來源百度百科
圖片來源百度百科算法

固然,從這個名字美國信息交換標準碼來看,ASCII碼只適用於美帝,要是用在美帝以外的國家,就不能知足需求了。 
ANSI碼 
ANSI編碼是一種對ASCII碼的拓展:ANSI編碼用0x00~0x7f 範圍的1 個字節來表示 1 個英文字符,超出一個字節的 0x80~0xFFFF 範圍來表示其餘語言的其餘字符。也就是說,ANSI碼僅在前126個與ASCII碼相同,以後的字符全是某個國家語言的全部字符。值得注意的是,兩個字節最多能夠存儲的字符數目是2的16次方,即65536個字符,這對於一個語言的字符來講,絕對夠了。還有ANSI編碼其實包括不少編碼:中國製定了GB2312編碼,用來把中文編進去另外,日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏,各國有各國的標準。受制於當時的條件,不一樣語言之間的ANSI碼之間不能互相轉換,這就會致使在多語言混合的文本中會有亂碼。 
Unicode編碼 
爲了解決不一樣國家ANSI編碼的衝突問題,Unicode應運而生:若是全世界每個符號都給予一個獨一無二的編碼,那麼亂碼問題就會消失。這就是Unicode,就像它的名字都表示的,這是一種全部符號的編碼。 
Unicode標準也在不斷髮展,但最經常使用的是用兩個字節表示一個字符(若是要用到很是偏僻的字符,就須要4個字節)。現代操做系統和大多數編程語言都直接支持Unicode。 
可是問題在於,本來能夠用一個字節存儲的英文字母在Unicode裏面必須存兩個字節(規則就是在原來英文字母對應ASCII碼前面補0),這就產生了浪費。那麼有沒有一種既能消除亂碼,又能避免浪費的編碼方式呢?答案就是UTF-8! 
UTF-8編碼 
這是一種變長的編碼方式:它可使用1~4個字節表示一個符號,根據不一樣的符號而變化字節長度,當字符在ASCII碼的範圍時,就用一個字節表示,保留了ASCII字符一個字節的編碼作爲它的一部分,如此一來UTF-8編碼也能夠是爲視爲一種對ASCII碼的拓展。值得注意的是unicode編碼中一箇中文字符佔2個字節,而UTF-8一箇中文字符佔3個字節。從unicode到uft-8並非直接的對應,而是要過一些算法和規則來轉換。 
在計算機內存中,統一使用Unicode編碼,當須要保存到硬盤或者須要傳輸的時候,就轉換爲UTF-8編碼。 
用記事本編輯的時候,從文件讀取的UTF-8字符被轉換爲Unicode字符到內存裏,編輯完成後,保存的時候再把Unicode轉換爲UTF-8保存到文件。
七、列表修改,
(1)b=a是淺複製,當修改b時,a會改變,同理,改變a時,b也會改變。由於a和b指向的是同一個地址
>>> a=[1, 2, 2, 2, 3, 4, 5, 3, 6, 8, 2, 3, 2, 5, 2, 7, 3]
>>> b=a
>>> for bb in b:
    if bb==2:
        b.remove(bb)
 
 
>>> b
[1, 3, 4, 5, 3, 6, 8, 3, 5, 2, 7, 3]
>>> a
[1, 3, 4, 5, 3, 6, 8, 3, 5, 2, 7, 3]
 
(2)當對b=a[:],就至關於對a進行了深度複製,a和b指向的是不一樣的地址。
>>> a=[1, 2, 2, 2, 3, 4, 5, 3, 6, 8, 2, 3, 2, 5, 2, 7, 3]
>>> b=a[:]
>>> for bb in b:
    if bb==2:
        b.remove(bb)
 
>>> b
[1, 3, 4, 5, 3, 6, 8, 3, 5, 2, 7, 3]
>>> a
[1, 2, 2, 2, 3, 4, 5, 3, 6, 8, 2, 3, 2, 5, 2, 7, 3]
 
(3)b=a[n:],a的後n個元素深複製給了b,b和a的後部分元素是在不一樣的列表中,,而且不能對a的部分元素進行排序。
好比a[n:].sort()就是錯誤的。
 
(4)b和a指向了同一個地址,所以使用任何的函數remove,insert方法進行操做時,b和a的元素會同時改變,可是,當給b從新賦值時,則對b的改變,不會影響到a,同時,對a的變化也不會影響到b,由於通過從新賦值,a和b已是不一樣的列表和值了。
>>> a=[3,5,3]
>>> b=a
>>> b=[1,3]
>>> a
[3, 5, 3]
>>> b
[1, 3]
八、跳出循環,break是結束整個循環,在循環中用的比較多,不管是for仍是while中。而continue是結束本次循環,在複雜循環體中用的比較多。
(1)break
>>> for word in "Python":
    if word == "h":
        continue
    print "current word :",word
 
current word : P
current word : y
current word : t
current word : o
current word : n
 
當多層for循環時,則break只是跳出了本身最內層的循環,而不會跳出外層循環。
>>> a =[[1, 2, 3, 4], [6, 7, 8, 4], [5, 3, 8, 5]]
>>> for aa in a:
    for aaa in aa:
        if  aaa==8:
            print aaa
            break
        else:
            print "good",str(aaa)
 
 
good 1
good 2
good 3
good 4
good 6
good 7
8
good 5
good 3
8
(2)continue
>>> for word in "Python":
    if word == "h":
        break
    print "current word :",word
 
current word : P
current word : y
current word : t
 
九、列表推導:列表推導是從中括號的最左邊的for開始,而後依次寫語句。
(1)
>>> a=[x*x for x in range(10) if x % 3==0]
>>> a
[0, 9, 36, 81]
 
相似於:
for x in range(10)
    if x % 3==0
          x*x
(2)
>>> a=[3,5,6,8]
>>> b=[4,5,7,9]
>>> [(x,y) for x in a for y in b if x==y]
[(5, 5)]
相似於
for x in a
     for y in b
          if x==y
               (x,y)
 
十、字典:字典中的鍵是惟一的,而值不是惟一的,這是字典很重要的一個性質,須要特別注意,在使用時,要檢查本身的數據是否適合使用字典。
(1)直接建立字典
dictexample = {"A":34,"B":98,"C":67}
(2)dict建立
items=[("A",78),("B",89)]
d=dict(items)
 
d=dict("A"=89,"B"=90)
(3)
不能給空的列表直接賦值,可是能夠給空的字典直接賦值
>>> x[2]=7
 
Traceback (most recent call last):
  File "<pyshell#222>", line 1, in <module>
    x[2]=7
IndexError: list assignment index out of range
 
>>> x={}
>>> x[2]=78
>>> x
{2: 78}
 
十一、字典是無序的,字典的本質是hsah表,hsah表的數據結構是無序的。
>>> a=dict([("a",-1),("b",9),("c",3)])
>>> a
{'a': -1, 'c': 3, 'b': 9}
 
 
十二、lambda匿名函數:主要是爲了使代碼更簡潔,不會帶來程序運行效率的提升,如果可使用for...in...if來完成,尤爲是包含循環時,則不建議用lambda。
(1)基礎語法
>>> g= lambda x:x+1  (x至關於參數)
>>> g(1)
2
相似於下列函數
 
>>> def g(x):
    return x+1
>>> g(1)
2
(2)匿名函數常伴隨filter,map,reduce使用。filter\map\reuce(function,foo) 這三個方法也能夠用於其餘的函數,function能夠是自定義的函數,標準函數,匿名函數
>>> foo=[5,6,2,3,16,9,4,7,25]
1>filter:過濾
>>> filter(lambda x:x%3==0,foo)
[6, 3, 9]
相似於
>>> [x for x in foo if x%3==0]
[6, 3, 9]
2>map:對列表中的元素進行操做
>>> map(lambda x:x*2,foo)
[10, 12, 4, 6, 32, 18, 8, 14, 50]
>>> [x*2 for x in foo]
[10, 12, 4, 6, 32, 18, 8, 14, 50]
3>reduce:從例子中能夠發現,(1,3)先做爲參數進行f計算,獲得了13,而後13和列表的下一個元素5做爲x和y元素進行計算,而後返回了135。
>>> def fn(x,y):
    return x*10+y
 
>>> reduce(fn,[1,3,5,7,9])
13579
相關文章
相關標籤/搜索