python 11期 第三天

字典的擴展:

一、collections

1、count 計數器

需要先導入collections的模塊:

import collections

coun=collections.Counter('ijfiefjjfjoejwfsdjljf')

print coun

Counter({'j': 7, 'f': 5, 'e': 2, 'i': 2, 'd': 1, 'l': 1, 'o': 1, 's': 1, 'w': 1})

Counter方法會直接把傳入的參數計算出裏面各個字符串出現的次數。


>>> coun

Counter({'i': 2, 'j': 2, 'f': 2, 'l': 1})

>>> coun2

Counter({'i': 2, 'j': 2, 'f': 2, 'e': 1})

>>> coun.update(coun2)         ##update可將coun2中的相同的元素次數傳入到coun中。

>>> coun

Counter({'i': 4, 'j': 4, 'f': 4, 'e': 1, 'l': 1})

>>> coun.most_common(4)     ##most_common參數是幾,就顯示前幾組。

[('i', 4), ('j', 4), ('f', 4), ('e', 1)]

>>> coun.__missing__('w')     ##__missing__會對查找不存在的元素返回計數器是0

0


>>> coun.elements()      #elements是迭代器,在循環時候可以打印出計數器中所有的元素。

<itertools.chain object at 0x0000000002694CC0>

>>> for i in coun.elements():print i

i

i

i

i

……

給列表中的元素計算出現的次數:

>>> li=[22,52,'ww',52,'ag',22]

>>> coun=collections.Counter(li)

>>> coun

Counter({52: 2, 22: 2, 'ww': 1, 'ag': 1})


把字典的value計算次數:

>>> dic={'chen': '1234', 'liu': '9876', 'wang': '4567', 'zhang': '1234',"whiw":'4567'}

>>> dic

{'chen': '1234', 'liu': '9876', 'whiw': '4567', 'wang': '4567', 'zhang': '1234'}

>>> coun=collections.Counter(dic.values())

>>> coun

Counter({'1234': 2, '4567': 2, '9876': 1})


2、有序字典

>>> dic=collections.OrderedDict()    ##定義一個有序字典。

>>> dic['k2']=2

>>> dic['k4']=4

>>> dic['k1']=1

>>> dic['k3']=3

>>> dic         ##字典是按照輸入的順序來排列。

OrderedDict([('k2', 2), ('k4', 4), ('k1', 1), ('k3', 3)])

備註:OrderedDict只管第一層的順序,如果裏面再套一層字典,第二層的字典則不排序,除非第二層也用OrderedDict來定義,每次定一次,只管一層。


3、指定字典的value默認類型

字典默認的values爲None, 如果想要更改此默認值,可用collections.defaultdict

import collections

>>> dic4=collections.defaultdict(list)

>>> dic4

defaultdict(<type 'list'>, {})

dic4=collections.defaultdict(dict)   ##也可設置爲默認字典和元組。


4、重命名元組 (主要用於座標的功能實現)

老的元組:

>>> old_tup=(1,4,6)

>>> old_tup

(1, 4, 6)

新元組:

>>> import collections

>>> mytuple=collections.namedtuple('mytuple',('x','y','z'))  #先創建一個類

>>> new=mytuple(1,4,6)                           ##實例化類

>>> new

mytuple(x=1, y=4, z=6)

>>> new.x      ##可以用命名來查找元素,也可通過下標來查找元素。

1

>>> new.z

6

>>> new[1]

4

>>> new[0]

1


5、雙向對列  (隊列:FIFO,先進先出)

>>> que=collections.deque()

>>> que.append(2)

>>> que.append(55)

>>> que.append(23)

>>> que.append(2)

>>> que.append('eee')

>>> que

deque([2, 55, 23, 2, 'eee'])

>>> que.pop()    #默認從右邊拿走一個消息,並刪除

'eee'

>>> que

deque([2, 55, 23, 2])     ##popleft從左邊拿走一個

>>> que.popleft()

2

>>> que

deque([55, 23, 2])

>>> que.reverse()    ##reverse順序反轉

>>> que

deque([2, 23, 55])


6、單向隊列 (隊列:FIFO,先進先出)

>>> import Queue

>>> dan=Queue.Queue()     #創建一個隊列

>>> dan

<Queue.Queue instance at 0x000000000268B788>

>>> dan.put(3)           #存消息進去

>>> dan.put(65)

>>> dan.put(9)

>>> dan

<Queue.Queue instance at 0x000000000268B788>

>>> dan.get()        ##取消息出來。

3

>>> dan.get()

65

>>> dan.get()

9

>>> dan.get()


迭代器和生成器

1、迭代器

>>> import collections
>>> c=collections.Counter('244451168444')
>>> c
Counter({'4': 6, '1': 2, '2': 1, '5': 1, '6': 1, '8': 1})
>>> c.elements()
<itertools.chain object at 0x0000000001DD3BA8>
>>> d=c.elements()
>>> print d
<itertools.chain object at 0x00000000021E6C88>

此處d就是迭代器,如果想要顯示迭代器中的數據,只能用循環的方式

寫迭代器可以定義一個類,並且有迭代的方法。


2、生成器

生成器如xrange,xreadlines. 暫不在內存中實際生成數據,只有在循環的時候纔會生成。


下標循環:

>>> li=['liu','cheng','wang',42,82]
>>> for a in range(len(li)):
...   print li[a]
liu
cheng
wang
42
82


用冒泡算法給列表排序:

li = [89,22,63,11,43]
for i in range(len(li)):
    for i in range(len(li)-1):
        if li[i] < li[i+1]:
            li[i],li[i+1]=li[i+1],li[i]

print li


函數:

內置函數

wKiom1ZP5FbBC2HrAAJ_yC_P5Tc017.png

模塊類:

vars() : 打印當前模塊的所有變量。(文件所在路徑;__name__的值;__doc__的值,所有註釋;)

help(): 打印幫助信息

dir(): 打印某個模塊中所有的方法

type(): 打印對象的類型

reload():  重新import 模塊。

id(): 某個變量或對象所在的內存地址。

----------------------------------------------------------------

計算類函數:

cmp(): 比較兩個值大小

abs() : 返回絕對值

bool():判斷對象的bool值是True還是False

divmod(10,4):  返回兩個值,第一個爲商,第二個爲餘數。

max():  取最大值

min():  取最小值

sum(): 取和

pow(5,4) : 取5的4次方。

--------------------------------------------------------

對順序的處理函數:

len(): 求對象的長度

all(): 如果傳入的參數值都不爲空或False,則返回True, 如果其中有一個元素爲空或False,則返回 False

any(): 判斷如果有一個爲真,就返回真。

-------------------------------------------------------------

各種轉換(進制或者ASCII):

ord('B'):將字符轉換爲ASCII碼。

chr(88):  ord()函數的逆運算,將ASCII碼轉換爲對應的字符。

hex(15): 將十進制的數字轉換爲16進制

oct():  將十進制的數字轉換爲8進制。

bin():  將十進制的數字轉換爲二進制。

enumerate(): 打印出一個順列的下標和所對應的內容。

lis=['Bao','Watch','Aodi','Fang']
for item in enumerate(lis,1):     
        print item[0],item[1]
##enumerate()函數是給列表中每個元素前加上序號,第二個參數爲起始值。(序列號)

--------------------------------------------------------------------------------------------

apply():


map():


filter()函數爲過濾生成新列表,當在第一個功能函數內返回True時候,才把元素放到新列表中,否則過濾掉

li=[15,22,66,43]

def test(num):

        if num>40:

                return True

        else:

                return False

print filter(test,li)


reduce()函數可以將累列中的數據進行  累加,累乘:

li=[11,22,66]

print reduce(lambda x,y:x+y,li)

99

print reduce(lambda x,y:x*y,li)


li=[7,2,6]

print reduce(lambda x,y:x*y,li) 

84

##從1加到100:

def recursion(x,y):

    return x+y

print reduce(recursion,range(1,101))


zip()函數:

li= [7,2,6]

li1=[3,1,5]

li2=[53,42,8]

print zip(li,li1,li2)

執行結果:

[(7, 3, 53), (2, 1, 42), (6, 5, 8)]

##把多個列表的中的相同的列組成新的列表。

函數定義方法:

1、def定義函數關鍵字

2、通過函數名來調用函數

3、函數聲明,不自動執行,調用時才執行

4、函數的參數和返回值

返回值分兩種:

1、未明確定義返回值,則返回None

2、返回值可以賦值給某個變量。

參數:普通參數,默認參數,動態參數。

動態參數:

1、形參 前面加一個*號

2、可傳遞序列即多個參數,傳進去後會變成一個元組的第一個元素,如果在傳遞序列參數時,前面也加一個*號,則會把傳弟進的序列當成一個元組。

Example1:

def param(*arg):
    print arg

li=[35,'chen',99]

param(*li)

3、加兩個*的形參,在傳遞參數時需要是一個字典的形式,並且傳參數時前面也要加兩個*號。

Example2:

def param(**arg):
    print arg

dic={'chen':35,'wang':99}

param(**dic)

4、將一個*的形參和兩個*的形參同時使用,傳遞參數時有兩種情況:

Example3:

def param(*arg1,**arg2):
    print arg1
    print arg2

第一種傳參:

param('fje',24,'wang',ke=345,k4=284)

第二種傳參:

li=['liz','wang',42]
dic={'chen':35,'wang':99}

param(*li,**dic)


文件的操作

文件的打開與寫入:

f=open('D:\TDDOWNLOAD\examp.txt','r+')   ##r+是追加,會把寫入時候的當前所在位置字符替換掉。

dic="{'chen': 35, 'wang': 99}"
print f.tell()         ##tell可以打印出當前的所在位置
f.seek(0)           ##seek可以跳轉到文件指定位置
f.write(dic)
print f.tell()
f.close()

如果在打開 文件時用a+,那麼不管指針調到哪裏,在寫入時始終會從後面追加寫入。在用'r'方式打開文件時,可以在後面加上'U', 即"rU"可以讓不同平臺的換行符(有的是"\r\n", 有的是'\r')都統一爲\n


f.truncate()  ##truncate函數會從當前指針的位置截斷文件。

flush() ##flush可以將緩存中的數據刷新到系統緩存上,要等系統緩存再刷到硬盤上。

print f.next() ##next函數可以一次讀取一行。如果沒有下一行,會報以下錯誤:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
StopIteration


f.readlines()   ##readlines一次性讀取文件所有的行,並按行分隔爲一個列表

f.readline()  ##readline一次讀取一行。


上下文管理工具:with

with open('D:\TDDOWNLOAD\examp.txt','r+') as f:

    for line in f:
        print line

用with來管理打開的文件,不用關閉即可,它自動會關閉文件。


with open('D:\TDDOWNLOAD\examp.txt','r+') as f, open('D:\TDDOWNLOAD\examp2.txt','w') as f2:
    for line in f:
        f2.writelines(line)

with可以快速的同時打開兩個文件,然後將文件1中的數據循環讀取寫入文件2中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章