Python学习笔记 03
collection系列
1、计数器(counter):计算序列中的值出现了多少次
Counter是对字典类型的补充,用于追踪值的出现次数。
ps:具备字典的所有功能 + 自己的功能
import collections c1 = collections.Counter('123') print c1
Counter({'1': 1, '3': 1, '2': 1})
传入字典和列表:
li = [11,22,33,4,4,11,232,44,11] c2 = collections.Counter(li) print c2 #Counter({11: 3, 4: 2, 33: 1, 232: 1, 44: 1, 22: 1}) dic = {'k1':11,'k2':22,'k3':44,'k4':11} c3 = collections.Counter(dic) print c3 #Counter({'k3': 44, 'k2': 22, 'k1': 11, 'k4': 11})
有序字典:内部维护一个列表,orderdDict是对字典类型的补充,他记住了字典元素添加的顺序
dic = {'k1':11,'k2':22,'k3':44,'k4':11}
li = ['k1','k2','k3','k4']
for i in li:
print dic[i]
默认字典:,defaultdict是对字典的类型的补充,他默认给字典的值设置了一个类型
#1 dic = collections.defaultdict(list) dic['k1'].append(1) #2 dic = {} dic['k1'] = [] dic['k1'].append(1)
习题:
有如下值集合 [12,23,53,21,45,67,85,45,24],将所有大于 624的值保存至字典的第一个key中,将小于 24 的值保存至第二个key的值中。 即: {'k1': 大于24 , 'k2': 小24}
原生字典解决办法 li = [12,23,53,21,45,67,85,45,24] dic = {} for item in li: if item >24: if 'k2' in dic.keys(): dic['k2'].append(item) else: #创建只有一项元素的列表 dic['k2'] = [item,] else: if 'k1' in dic.keys(): dic['k1'].append(item) else: dic['k1'] = [item,] print dic
defaultdict字典解决方法 from collections import defaultdict values = [12,23,53,21,45,67,85,45,240] my_dict = defaultdict(list) for value in values: if value>24: my_dict['k1'].append(value) else: my_dict['k2'].append(value)
若读取一个文件,文件中内容如下:
alex|123|1 alex1|123|1 alex2|123|1
把文件内容生成字典
#打开文件,读取 obj = file('log','r') line_list = obj.readlines() obj.close() dic = {} #print line_list for line in line_list: #alex|123|1 line = line.strip() #去掉空格或换行 #alex,123,1 ele_list = line.split('|') #用|作为分隔符,分割后为列表 print ele_list dic[ele_list[0]] = ele_list[1:] #把列表追加到字典 print dic 打印结果: ['alex', '123', '1'] ['alex1', '123', '1'] ['alex2', '123', '1'] {'alex1': ['123', '1'], 'alex': ['123', '1'], 'alex2': ['123', '1']}
元组扩展
(1,4)
x=1,y=4
1、创建有两个元素可命名类
2、根据类创建对象
3、使用对象
1、创建类
2、使用类创建对象
3、使用对象
可命名元组(namedtuple) :根据nametuple可以创建一个包含tuple所有功能以及其他功能的类型。
#创建一个扩展tuple的类,Mytuple
Mytuple = collections.namedtuple('Mytuple',['x', 'y', 'z']) old = tuple(1,2) <====> old = (1,2)
import collections Mytuple = collections.namedtuple('Mytuple',['x','y']) n = Mytuple(1,2) print n print n.x print n.y 输出结果: Mytuple(x=1, y=2) 1 2
有横纵坐标的时候可以使用可命名元组
队列,线程安全
duilie.py
双向队列
单向队列
队列:先进先出
栈:弹夹
import collections q = collections.deque() q.append(1) q.append(11) q.append(12) q.append(13) print q q.pop() print q q.popleft() print q q.append(13) print q
#迭代器和生成器
生成器内部基于yield创建,即:对于生成器只有使用时才创建,从而不避免内存浪费
迭代器:对于Python 列表的 for 循环,他的内部原理:查看下一个元素是否存在,如果存在,则取出,如果不存在,则报异常 StopIteration。(python内部对异常已处理)
生成器:
range不是生成器 和 xrange 是生成器
readlines不是生成器 和 xreadlines 是生成器
>>> print range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> print xrange(10) xrange(10)
排序习题:
练习:<br>有如下列表: [13, 22, 6, 99, 11] 请按照一下规则计算: 13 和 22 比较,将大的值放在右侧,即:[13, 22, 6, 99, 11] 22 和 6 比较,将大的值放在右侧,即:[13, 6, 22, 99, 11] 22 和 99 比较,将大的值放在右侧,即:[13, 6, 22, 99, 11] 99 和 42 比较,将大的值放在右侧,即:[13, 6, 22, 11, 99,] 13 和 6 比较,将大的值放在右侧,即:[6, 13, 22, 11, 99,]
li = [13, 22, 6, 99, 11] for m in range(len(li)-1): if li[m] > li[m+1]: temp = li[m] li[m] = li[m+1] li[m+1] = temp print li 输出结果: [13, 6, 22, 11, 99]
函数
vars() == 当前模块的所有变量
内置函数:代码块,按功能划分
__file__:获取路径
__name__:被执行的脚本,__name__值等于__main__
print __file__ print __name__ print vars() 执行结果: E:/PycharmProjects/py11/day03/vars.py
__main__ {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'E:/PycharmProjects/py11/day03/vars.py', '__author__': 'wang', '__name__': '__main__', '__package__': None, '__doc__': None}
if __name__ = "__main__":只有主动执行才执行,别的程序调用时不执行,为了标识主程序
all():接受一个序列,判断,所有值都为真,返回真,否则返回假
li = [input1,input2,i]
any():只要有一个为真就是真
li = ['ares','','1'] print all(li) print any(li) li = ['ares','1','1'] print all(li) 输出结果: False True True
ord()
chr():阿斯克码与字符之间做比较
>>> chr(65) 'A' >>> ord('A') 65
enumerate():定义数字起始值,枚举函数
>>> li = [11,22,33,44,55,66] >>> for k,v in enumerate(li): ... print k,v ... 0 11 1 22 2 33 3 44 4 55 5 66
自定义函数
1、def定义函数关键字
2、函数名,日后通过函数名调用此函数
3、函数声明,不自动执行,调用后才执行
4、函数的参数
5、函数的返回值
返回值:
1、未明确指定返回值,返回None
2、返回值可以赋值给某个变量
参数:
1、普通参数
形式参数,形参:函数后加的参数为形式参数,无实际意义
实际参数,实参:
参数可以有N个,传入指定个数的参数
2、默认参数
不传则使用默认值
默认参数必须放在参数列表的最后
3、动态参数
动态参数1
def fun(*args): #传入进来的参数会形成元组
接受多个参数
传序列时内部自动构造元组
序列,*,避免内部构造元组
动态参数2
def fun(**args): 传入字典,构造字典
func(k1=1,k2=2)
def func(*arg): print arg func() func(1) func('a') func(1,'a') func(1,'a',2) li = [11,22,33] func(li) func(*li) def func1(**kwargs): print kwargs func1() func1(k1=1) func1(k1=1,k2=2) dic = {'k3' :3,'k4' :4} func1(**dic) def func2(*args,**kargs): print args print kargs 输出结果: () (1,) ('a',) (1, 'a') (1, 'a', 2) ([11, 22, 33],) (11, 22, 33) {} {'k1': 1} {'k2': 2, 'k1': 1} {'k3': 3, 'k4': 4}
导入函数
监控小案例:
import smtplib from email.mime.text import MIMEText from email.utils import formataddr def email(message): msg = MIMEText('上镜', 'plain', 'utf-8') msg['From'] = formataddr(["武沛齐",'wptawy@126.com']) msg['To'] = formataddr(["报警",'424662508@qq.com']) msg['Subject'] = "报警系统" server = smtplib.SMTP("smtp.126.com", 25) server.login("wptawy@126.com", "密码") server.sendmail('wptawy@126.com', ['424662508@qq.com',], msg.as_string()) server.quit() if __name__ == '__main__': cpu = 100 mem = 500 disk = 300 for i in range(2): if cpu > 80: alter = "CPU error" email(alter) if mem > 400: alter = "mem err" email(alter) if disk > 1000: alter = "disk error" email(alter)
文件操作
操作文件时,一般需要经历如下步骤:
- 打开文件
- 操作文件
1、打开文件
#打开文件方式
文件句柄 = file('文件路径', '模式')
#1 obj = file('文件路径','')
#2 obj = open('文件路径','') ,推荐
#w:把原先内容清空并重写【不可读;不存在则创建;存在则删除内容;】
#a:以追加的模式写,指针在最后【可读; 不存在则创建;存在则只追加内容;】
#r:只读,r+可读可写,没有读的时候指针默认在0位置 (默认为r)
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读;可写;可追加】
- w+,无意义
- a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
ab
obj.truncate() #截断文件,指针在哪里就在哪里截断(根据当前指针位置)obj = open('test','r') obj.seek(3) #指针,从第3个开始 print obj.tell() print obj.read() print obj.tell() obj.close() obj = open('test','r+') obj.seek(3) #指针,从第3个开始 print obj.tell() print obj.read() print obj.tell() #obj.write('00') obj.truncate() #截断文件,指针在哪里就在哪里截断(根据当前指针位置) obj.close()test文件内容及输出结果:
文件内容: 123456789 2222 输出结果: 3 456789 2222 15 3 456789 2222 15
操作文件:
close()关闭文件
next()获取文件下一行数据
read()读取指定字节数据
readline() 仅仅读取一行
readlines()把文件按行读取
write()写文件
writelines()把一字符串按行写入文件
with:为了避免打开文件后忘记关闭,可以通过管理上下文,即
with open('haproxy','r') as f: for line in f:
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
with open('log1') as obj1, open('log2') as obj2: pass

浙公网安备 33010602011771号