python培训Day3 随笔

collections类

这个类相当于一个扩展包,包含针对字典、列表、元组等数据类型的一些扩展操作。

1、计数器Counter

#计数器可以列出字符串和列表中元素出现的个数,并以字典返回

>>> import collections
>>> li=['a','b','a','c','a','b','d','d','a']
>>> st='asdasdasdasdasda'
>>> li_c=collections.Counter(li)
>>> st_c=collections.Counter(st)
>>> print li_c
Counter({'a': 4, 'b': 2, 'd': 2, 'c': 1})
>>> print st_c
Counter({'a': 6, 's': 5, 'd': 5})
#通过most_comm()方法可以指定显示出现次数排名前n位的元素
>>> print li_c.most_common(3)
[('a', 4), ('b', 2), ('d', 2)]

#update()方法可以将两个计数器的统计结果相加

>>> import collections
>>> li_a=['a','b','a','c','a']
>>> li_b=['b','c']
>>> li_a_co=collections.Counter(li_a)
>>> li_b_co=collections.Counter(li_b)
>>> print li_a_co
Counter({'a': 3, 'c': 1, 'b': 1})
>>> print li_b_co
Counter({'c': 1, 'b': 1})
>>> li_a_co.update(li_b_co) 
>>> print li_a_co
Counter({'a': 3, 'c': 2, 'b': 2})


2、有序字典

#有序字典的的操作方法和标准字典完全一致,唯一的区别就是有序字典里的key是可以按照顺序展现出来的,这是因为有有序字典其实就是在标准字典的基础上又将key都存入了一个列表,通过列表管理key

>>> import collections
>>> ord_dic=collections.OrderedDict()
>>> ord_dic={}


3、默认字典

#标准字典中value的值数据类型是需要提前定义的,否则直接向value中添加数据就可能有问题。例如如下需求:

有如下值集合 [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。

即: {'k1': 大于66 , 'k2': 小于66}

#传统实现方式

li=[11,22,33,44,55,66,77,88,99,90]
list_a=[]
list_b=[]
dic={'k1':list_a,'k2':list_b}
for i in li:
    if i > 66:
        dic['k1'].append(i)
    else:
        dic['k2'].append(i)
print dic


#用默认字典方式

import collections
#coding:utf-8
li=[11, 22, 33,44,55,66,77,88,99,90]
#用默认字典方法提前定义value的数据类型
dic=collections.defaultdict(list)
for value in li:
    if value>66:
        dic['k1'].append(value)
    else:
        dic['k2'].append(value)
print dic


队列

#队列分为双向队列和单向队列,所有的队列都是有进程安全的。

双向队列是队列两边都可以增减操作,是FIFO模式的

单向队列只有一边可以增减操作,所以单向队列就是个堆栈。

这部分以后会用到,现在暂时知道原理就好了。


文件的处理

#文件处理的流程一般是

打开文件->操作文件->关闭文件

一、打开文件

f=open('文件名','打开模式')

打开文件的模式有:

r,只读模式(默认)。

w,只写模式。【不可读;不存在则创建;存在则删除内容;】

a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

r+,可读写文件。【可读;可写;可追加】

w+,无意义

a+,同a

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

rU

r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

rb

wb

ab


文件的处理

flush()

#flush方法可以将缓存中的内容刷写到硬盘上,但是还要考虑的是这个刷写只是涉及python的缓存,至于到底什么时候才能真的写到硬盘上。还得看系统缓存。

f=open('test.txt','w')
f.write('aaaa')
f.flush()
f.close


read(),readline(),readlines()

#read(),readline(),readlines()方法的区别是

read(n)是一次性把问文件内容读入内存,n表示每次要读入的字节数,默认是读取所有数据

>>> f=open('test.txt','r')
>>> x=f.read()
>>> f.close()
>>> x
'1 213123123\n2 123123123123\n3 1231231231231\n4 23123123123123\n5 123123123123123\n'


readlines()是一次性把文件内容读入内存,并将源文件中每一行的内容读入列表作为一个元组

[wgw@mail ~]$ cat test.txt 
1 213123123
2 123123123123
3 1231231231231
4 23123123123123
5 123123123123123

使用readliness读取的结果为

f=open('test.txt','r')
x=f.readlines()
f.close()
print x
['1 213123123\n', '2 123123123123\n', '3 1231231231231\n', '4 23123123123123\n', '5 123123123123123\n']

readline()是每次只把源文件中的一行读入内存中

f=open('test.txt','r')
x=f.readline()
f.close()
print x
1 213123123

还一个xreadline()的方法是每次读取一行到内存中,并打印出来一行的内容。之后

依次循环知道所有内容都打印完,这样就避免超大文本的读取的时候直接把内存撑爆。

不过现在这个方法已经被废弃,取而代之的是直接for循环句柄的方式来读取

f=open('test.txt','r')
    for line in f:
        print line
f.close()
1 213123123
2 123123123123
3 1231231231231
4 23123123123123
5 123123123123123


next()

#读取下一行数据,若没有则触发StopIteration的异常

f=open('test.txt','r')
for i in range(3):
    x=f.next()
    print x
f.close()
1 213123123
2 123123123123
3 1231231231231


seek()

#表示调整当前读取一行数据的位置指针,默认都是每一行的第一个字节开始读取。但是如果

读取第二个字节以后的内容就需要通过seek()方法调整指针的读取位置

[wgw@mail ~]$ cat test.txt 
1122334455
f=open('test.txt','r')
#从第二个字节开始向后读
f.seek(2)
x=f.readline()
print x
f.close()
[wgw@mail ~]$ python test.py 
22334455


tell()

#返回目前指针的读取位置

#!/usr/bin/env python
#-*-coding:utf8-*-
f=open('test.txt','r')
position=f.tell()
print '起始的指针位置:',position
f.seek(2)
position=f.tell()
print '调整后的指针位置:',position
x=f.readline()
print x
position=f.tell()
print '读完一行最后的指针位置:',position
f.close()
[wgw@mail ~]$ python test.py 
起始的指针位置: 0
调整后的指针位置: 2
22334455
读完一行最后的指针位置: 11


truncate(n)

#截取字符串,只保留指定的指针位置n之前的字符串,其余的全部删除并将结果写回到源文件。

#!/usr/bin/env python
#-*-coding:utf8-*-
#打开方式必须是可读写的r+
f=open('test.txt','r+')
#从f1文件的第二个字节位置开始截取
f.truncate(2)
print f.readlines()
f.close
[wgw@mail ~]$ cat test.txt 
11


write()

#写入一个字符串到文件中

>>> f=open('test.txt','w')
>>> f.write('wgw')
>>> f.close()
[wgw@mail ~]$ cat test.txt 
wgw


writelines()

#将字符串,列表,字典等数据类型一次性写入文件中。当列表中必须都是字符串,而写入字典的话讲只有key值看不到value值

#!/usr/bin/env python
#-*-coding:utf8-*-
test_list=['1','a','b','c','\n']
test_dic={'k1':'10cc','k2':20}
f=open('test.txt','a')
f.writelines(test_list)
f.writelines(test_dic)
f.close()
[wgw@mail ~]$ cat test.txt 
1abc
k2k1


with

#普通的打开文件方式每次都要调用close()方法关闭文件。使用with方法打开文件就可以自动关闭文件

with open('test.txt','a') as f:
    x=f.read()
    print x

并且用with方法可以同时打开多个文件

with open('test.txt','a') as f1,open('wgw.txt','r') as f2:


函数

函数的作用是将代码模块化,使同一功能的代码可以被反复调用

函数分为三大类:

一、内置函数

内置函数是python自身就集成好的功能模块,需要熟知的内置函数如下

help()

dir()

vars()

type()


reload(temp)

id([12])

is

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

cmp(2,3)

abs()

bool()

divmod(10,3),分页

max()

min()

sum()

pow(2, 11) 求幂 <==> 2**11

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

len()

all() 接受一个序列,判断,所有值都是真,返回真,否则假

any() 接受一个序列,判断,只要有一个值为真,返回真,否则假

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

chr() 

ord()

hex()

oct()

bin()

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

print range(10)

print xrange(10)

for i in xrange(10):

    print i

for k,v in enumerate([1,2,3,4],执行数字起始值):

    print k,v


二、自定义函数

#当python自身提供的函数不能满足需求的时候,就可以自己定义函数

格式如下

1、def 定义函数的关键字

2、函数名,日后通过函数名调用该函数

3、函数声明,不自动执行;调用后才执行   if __name__='main':

4、函数的参数

5、函数的返回值

#!/usr/bin/env python
#coding:uft-8
def myfunc(x,y):
    return x+y
w=myfunc(1,2)
3

返回值:

1、未明确制定返回值,返回 None

2、返回值可以赋值给某个变量


其中括号中的内容就是函数的参数,参数的分类如下:

1)普通参数

如上面列子中展示的x,y就是定义的普通的参数

2)默认参数

默认参数的意思就是在定义参数的时候给参数提供一个默认值,如果有新的值赋进来就用新的值。如果没有新值就用采用默认参数。但是要注意:1、不传,则使用默认 2、默认参数必须放在参数列表的最后

def myfunc(x,y=5):
    return x+y
w=myfunc(1,2)
#第二次调用的时候,只给x赋值为1而没有指定y参数的值
z=myfunc(1)
print w
print z
3
6

3)动态参数

普通参数和默认参数只能传入一个数字或者字符串,当我们要传入一个列表或者字典的时候就需要用到

动态参数

1、当需要传入一个列表的时候,在定义参数的时候要用一个*号和args表示要引用列表

def myfunc(*args):
    print args
li=['aa','bb','cc']
myfunc(*li)
#或者用myfunc(aa,bb,cc)方式执行
('aa', 'bb', 'cc')

2、当要传入一个字典的时候,在定义参数的时候要用两个个*号和kwargs表示要引用字典

def myfunc(**kwargs):
    print kwargs
dic={'aa':11,'bb':22,'cc':33}
myfunc(**dic)
#或者用myfunc(aa=11,bb=22,cc=33)方式调用,但是注意只能用=号连接k,v值
{'aa': 11, 'cc': 33, 'bb': 22}

3、当传入的参数即有可能是列表也有可能是字典的时候,就需要将两种设置方式都写入函数中。

函数在调用的时候会自动判断传入的数据类型

只传入列表

def myfunc(*args,**kwargs):
    print args
    print kwargs
li=[77,88,99]
dic={'aa':11,'bb':22,'cc':33}
myfunc(*li)
(77, 88, 99)
{}

只传入字典

def myfunc(*args,**kwargs):
    print args
    print kwargs
li=[77,88,99]
dic={'aa':11,'bb':22,'cc':33}
myfunc(**dic)
()
{'aa': 11, 'cc': 33, 'bb': 22}

既有列表又有字典

def myfunc(*args,**kwargs):
    print args
    print kwargs
li=[77,88,99]
dic={'aa':11,'bb':22,'cc':33}
myfunc(*li,**dic)
(77, 88, 99)
{'aa': 11, 'cc': 33, 'bb': 22}


三、第三方函数和模块

第三方函数和模块主要是指从网上下载的别人写好的函数 通过import导入之后使用的函数

本文出自 “霹雳豆包” 博客,谢绝转载!

你可能感兴趣的:(day3)