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() == 当前模块的所有变量
内置函数:代码块,按功能划分

image
__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
posted @ 2015-11-09 22:09  我是一条最咸的咸鱼  阅读(174)  评论(0)    收藏  举报
返回顶部