python递归、collections系列以及文件操作进阶
global
log 127.0.0.1 local2
daemon
maxconn
log 127.0.0.1 local2 info
defaults
log global
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option dontlognull listen stats :
stats enable
stats uri /admin
stats auth admin: frontend oldboy.org
bind 0.0.0.0:
option httplog
option httpclose
option forwardfor
log global
acl www hdr_reg(host) -i www.oldboy.org
use_backend www.oldboy.org if www backend www.oldboy.org
server 100.1.7.9 100.1.7.9 weight maxconn ########################################
配置文件增删查 、查
输入:www.oldboy.org
获取当前backend下的所有记录 、新建
输入:
arg = {
'bakend': 'www.oldboy.org',
'record':{
'server': '100.1.7.9',
'weight': ,
'maxconn':
}
} 、删除
输入:
arg = {
'bakend': 'www.oldboy.org',
'record':{
'server': '100.1.7.9',
'weight': ,
'maxconn':
}
} 需求
上文件操作方式练习作业--结合Flag标志位极好的例子--需求
递归:
(1)递归就是在过程或函数里调用自身;
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
在python中如果函数没有return,就会return为None
def func(arg1,arg2):
if arg1 == :
print arg1,arg2
arg3 = arg1 + arg2
if arg3 > :
return arg3
else:
func(arg2,arg3)
result = func(,)
print result 结果为: None
正确地递归函数为:
def func(arg1,arg2):
if arg1 == :
print arg1,arg2
arg3 = arg1 + arg2
if arg3 > :
return arg3
return func(arg2,arg3)
result = func(,)
print result
计算器作业思路:
循环:递归
将括号中的内容计算出来之后依次递归
练习题1:将列表[11,22,33,44,55,66,77,88,99]大于66的值放入第一个key中,将小于66的值放入字典第二个key中;
#!/usr/bin/env python
# _*_ coding:utf-8 _*_ num_list = [11,22,33,44,55,66,77,88,99] dict_list = {'k1':[],
'k2':[],
} for item in num_list:
if item <=60:
dict_list['k1'].append(item)
else:
dict_list['k2'].append(item) print dict_list
练习题2:上题中,如果字典中没有key值如何处理(只有空字典)
#!/usr/bin/env python
# _*_ coding:utf-8 _*_ num_list = [11,22,33,44,55,66,77,88,99] dict_list ={} for item in num_list:
if item <=60:
if 'k1' in dict_list.keys():
dict_list['k1'].append(item)
else:
dict_list['k1'] = [item,] #统一一下规范,都加逗号
else:
if 'k2' in dict_list.keys():
dict_list['k2'].append(item)
else:
dict_list['k2']=[item,]
print dict_list
练习题3:将文本内容alex|123|1
eric|123|1
tony|123|1放入字典中,第一个名字为key
#!/usr/bin/env python
# _*_ coding:utf-8 _*_ f = file(r'log','r')
line_list = f.readlines()
f.colse()
dic = {}
for line in line_list:
line = line.strip().split('|')
dic[line[0]]=line[1:]
print dic
一、Collections系列
1、collections系列之计数器
>>> import collections
>>> c1=collections.Counter('abcd') #计数器,对象为字符串或列表
>>> c1
Counter({'a': 1, 'c': 1, 'b': 1, 'd': 1})
>>> c1=collections.Counter([11,22,33,11])
>>> c1
Counter({11: 2, 33: 1, 22: 1})
>>> c1=collections.Counter('abcd')
>>> c1
Counter({'a': 1, 'c': 1, 'b': 1, 'd': 1})
>>> c2=collections.Counter('abc')
>>> c2
Counter({'a': 1, 'c': 1, 'b': 1})
>>> c1.update(c2) #元素个数叠加
>>> c1
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
>>> c1.clear() #清除内容
>>> c1
Counter()
>>> c1
Counter({'a': 1, 'c': 1, 'b': 1, 'd': 1}) #将前n个k,v值当做元组放入列表中
>>> c1.most_common(2)
[('a', 1), ('c', 1)]
>>> c1.elements() #类似于xreadlines(),是一个迭代器,只有循环时才可以显示出来
<itertools.chain object at 0x92697cc>
2、collections之有序字典(与字典用法相同)
>>> o1=collections.OrderedDict() #创建有序字典,区别是内部维护一个列表,列表是有序的
>>> o1
OrderedDict()
>>> o1['k1']=1
>>> o1
OrderedDict([('k1', 1)])
3、默认字典(defaultdict):为字典里的value设置默认类型
字典value的默认类型为None,即为
>>> dic = {'k1':None} #None没有append方法
>>> dic
{'k1': None}
>>> import collections
>>>
>>> dic = collections.defaultdict(list) #定义字典,并将value值设为list
>>> dic['k1']
[]
>>> dic['k1'].append(1)
4、collections之命名元组----->创建类
一般是:创建类--->使用类创建对象--->使用对象
对于现有的类:直接使用类创建对象--->使用对象
对于元组而言,访问元组对象中的元素,必须使用下标才行,那么如何才能不需要下标来取值呢?
#创建一个扩展的tuple类
>>> Mytuple = collections.namedtuple('Mytuple',['x','y'])
>>> new = Mytuple(1,2) #实例化
>>> new
Mytuple(x=1, y=2)
>>> new.x #通过该方法访问值
1
>>> new.y
2
5、collections之双向队列(deque)-----线程安全
>>> q = collections.deque() #创建队列
>>> q.append(1) #将1添加到队列中
>>> q.append(2)
>>> q.append(4)
>>> q
deque([1, 2, 4])
>>> q.pop() #删除(从右边开始)
4
>>> q.popleft() #从左边删除
1
除了deque,其他python标准模块也提供队列机制,queue,mutiprocessing,asyncio,heapq;
6、单向队列(Queue)-----线程安全
>>> import Queue
>>> q=Queue.Queue(10) #创建队列,放10个元素
>>>
>>> q.put(1) #往队列中添加数据
>>> q.put(2)
>>> q.put(3)
>>> q.put(4)
>>> q
<Queue.Queue instance at 0xa3cbc8c> >>> q.get() #从队列中往出拿数据,相当于pop
1 队列与与栈如何区别:
队列:FIFO
栈:弹夹
7、迭代器和生成器原理
>>> xrange(10):创建时不会在内存中创建对象,只有在循环时才会创建
在数据库创建连接池时,为节省资源,用生成器创建。
8、下标式循环以及冒泡算法
如何将a、b的值互换:
>>> a = 123
>>> b = 321
>>>
>>> temp = a
>>> a = b
>>> b = temp
>>> a
321
>>> b
123
下标式循环:
>>> for m in range(len(li)-1):
... print li[m],
...
22 6 99 11
冒泡算法:
>>> li = [,,,,]
>>> for m in range(len(li)-):
... for n in range(m,len(li)-):
... if li[m] > li[n]:
... temp = li[m]
... li[m] = li[n]
... li[n] =temp
...
>>> li
[, , , , ]
9、内置函数
函数的分类:内置函数、自定义函数、导入函数
>>> print vars() #内置函数,拿到当前模块中的所有变量
{'temp': 22, '__builtins__': <module '__builtin__' (built-in)>, 'm': 3, 'li': [6, 13, 22, 99, 11], 'n': 3, 'tab': <module 'tab' from '/usr/lib/python2.7/dist-packages/tab.pyc'>, '__name__': '__main__', '__package__': None, '__doc__': None}
其中:
__file__:文件路径
__doc__:注释
__name__:被执行的文件被赋值为__main__
内存级别函数:
reload:被reload的模块之前必须被import过,一般在被reload的模块内容改变之后使用;
id
is:内存地址相同
计算级别:
cmp(2,3)
abs()
bool()
divmod(10,3)分页
max()
min()
sum()
pow(2,11):2的11次方
all和any:all()接受一个序列,判断所有值为真,返回真,在输入用户名和密码的时候,一次性输入,可以判断输入的是否有空值;
enumerate
>>> for k,v in enumerate([,,,,],): #遍历下标和列表,序号从1开始
... print k,v
...
10、函数式编程和面向对象编程
11、函数式编程之发邮件
#!/usr/bin/env python
# _*_ coding:utf- _*_
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr def email(message):
msg = MIMEText(message,'plain','utf-8') msg['From'] = formataddr(["Charles",'qq_c123@163.com']) #源
msg['To'] = formataddr(["走人",'1812352106@qq.com']) #目标
msg['Subject'] = "主题" server = smtplib.SMTP("smtp.163.com",)
server.login("qq_c123@163.com","sXXXXXX")
server.sendmail("qq_c123@163.com",['1812352106@qq.com',],msg.as_string())
server.quit() if __name__ == '__main__':
cpu =
disk =
raw =
for i in range():
if cpu > :
alert='CPU有告警'
email(alert)
if disk > :
alert = '磁盘有告警'
email(alert)
if raw > :
alert = 'raw有告警'
email(alert)
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr def email(message,receiver):
msg = MIMEText(message,'plain','utf-8') msg['From'] = formataddr(["常强强",'qq_c123@163.com'])
msg['To'] = formataddr(["走人",'1812352106@qq.com'])
msg['Subject'] = "主题" server = smtplib.SMTP("smtp.163.com",25)
server.login("qq_c123@163.com","start33333")
server.sendmail("qq_c123@163.com",[receiver,],msg.as_string()) #发送邮件到多个
server.quit() li = ["qq_c123@163.com","alex111@126.com"]
for item in li:
emali("cpu报警",item) if __name__ == '__main__':
cpu = 100
disk = 500
raw = 50
for i in range(1):
if cpu > 90:
alert='CPU有告警'
email(alert)
if disk > 90:
alert = '磁盘有告警'
email(alert)
if raw > 90:
alert = 'raw有告警'
email(alert)
函数的返回值:
a、如果函数没有返回值,那么返回值就为None;
b、函数返回值可以复制给某个变量
12、函数的参数
a、普通参数:定义了几个形参,就要传几个实参;
b、默认参数:默认参数放在形参的最后;
c、动态参数:def func(*args):接受多个参数
def func(**kwargs):有两种传值方式
第一种:
>>> func(k1=123)
{'k1': 123}
第二种:
>>> dic = {'k1':123}
>>> func(**dic)
{'k1': 123}
函数 def func(*args,**kwargs):可以接受实参为列表和字典
13、文件操作
打开操作:
r:打开文件,指针在最前面
w:将原来的内容清空掉,然后重写,指针在最前面
a:可读、可写(以追加的方式写),指针在最后
+:只有r+(读写)有意义,指针放在开头,新写入的数据会依次替代原来的数据,没有替代的继续保留;
r+U:在读的时候,将"\r\n"转为"\n",U只能和r一起使用;
>>> obj = open('log','r')
>>> obj.read()
'test123\r\n'
>>> obj.close()
>>> obj = open('log','r+U')
>>> obj.read()
'test123\n'
obj.tell():返回文件读写位置的指针;
obj.read():将文件内容读到一个字符串当中;
obj.truncate():从指针指向的位置开始截断数据,保留前面的,丢弃后面的,在r+(读写)的时候用这种方法丢掉原来的数据;
rb/wb/ab:如果是跨平台的话,使用二进制;
操作文件:
f.next() #一次读一行
>>> seq = ["This is frist line\n","This is second line"]
>>> obj.writelines(seq) #写入多行
>>> obj.close()
f.write():一次只写一行
with管理文件操作:
>>> with open('log','r') as f: #打开时候无需关闭
... f.read()
...
'This is frist line\nThis is second line'
利用上述方法操作配置文件:(只有在2.7以上版本才支持)
>>> with open('log','r') as obj1, open('log1','w') as obj2:
... for line in obj1:
... new_line = line.replace('This is frist line','wahaha')
... obj2.write(new_line)
作业来了。。。
##############配置文件################
global
log 127.0.0.1 local2
daemon
maxconn
log 127.0.0.1 local2 info
defaults
log global
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option dontlognull listen stats :
stats enable
stats uri /admin
stats auth admin: frontend oldboy.org
bind 0.0.0.0:
option httplog
option httpclose
option forwardfor
log global
acl www hdr_reg(host) -i www.oldboy.org
use_backend www.oldboy.org if www backend www.oldboy.org
server 100.1.7.9 100.1.7.9 weight maxconn ##############需求################
增删查
、查
输入:www.oldboy.org
获取当前backend下的所有记录 、新建
输入:
arg = {
'bakend': 'www.oldboy.org',
'record':{
'server': '100.1.7.9',
'weight': ,
'maxconn':
}
} 、删除
输入:
arg = {
'bakend': 'www.oldboy.org',
'record':{
'server': '100.1.7.9',
'weight': ,
'maxconn':
}
} 需求
修改配置文件练习--结合上述操作+Flag实现
#!/usr/bin/env python
# _*_ coding:utf- _*_
import time
import os
import json
OldFile="haproxy" #源文件
Bak_File="haproxy%s"%(time.strftime('%y-%m-%d-%H-%M-%S')) #备份文件 def Check(arg):
'''通过设置标签Flag位,将需要检查的内容append到列表中,最后返回'''
Backend_List = []
Flag = False
with open(OldFile,'rb') as f:
for line in f.xreadlines():
if line.strip().startswith('backend') and line.strip().split()[-] == str(arg):
Flag = True
continue #检查到包含backend www.oldboy.org行时,直接中断循环,进入下一行
if Flag and line.strip().startswith('backend'):
'''server 100.1.7.9 100.1.7.9 weight 20 maxconn 30的一行或者多行结束,设置Flag为False'''
Flag = False
if Flag and line:
'''当Flag为True时,内容添加到列表中'''
Backend_List.append(line.strip())
return Backend_List
#print Check('www.oldboy.org')
def Add(arg):
'''分为两种情况:一种是不存在对应的backend,此时只需要将backend和对应的record先写入列表中,然后循环列表,追加到新的文件中
另一种情况是存在对应的backend,此时需要将原有的backend和record和新需要增加的record全部先写入列表中,然后通过循环列表写入到新的文件中'''
Add_dict = json.loads(arg)
BackTitle = "backend %s" %(str(Add_dict['backend']))
BackBody = 'server %s %s weight %d maxconn %d' %(Add_dict['record']['server'],Add_dict['record']['server'],
Add_dict['record']['weight'],Add_dict['record']['maxconn'],)
Backend_List = Check(Add_dict["backend"])
if not Backend_List:
print "不存在对应的backend"
Backend_List.append('%s%s'%(BackTitle,'\n'))
Backend_List.append(BackBody)
with open(OldFile,'rb') as f_old,open('ha_new','ab') as f_new:
for line in f_old.readlines():
f_new.write(line)
for line in Backend_List:
if line.strip().startswith('backend'):
f_new.write("%s" %line)
else:
f_new.write("%s %s\n" %(" "*,line)) else:
print "存在对应的backend"
with open(OldFile,'rb') as f_old,open('ha_new','ab') as f_new:
Flag = False
Has_Write = False
Backend_List.insert(,'%s'%(BackTitle,))
if BackBody not in Backend_List:
Backend_List.append(BackBody)
print Backend_List
for line in f_old.readlines():
if line.strip().startswith('backend') and line.strip().endswith(Add_dict['backend']):
Flag = True
continue
if Flag and line.strip().startswith('backend'):
Flag = False
if not Flag:
f_new.write(line)
else:
if not Has_Write:
print Backend_List
for record in Backend_List:
if record.strip().startswith('backend'):
f_new.write("%s\n" %record)
else:
f_new.write("%s %s\n" %(" "*,record))
Has_Write = True #必须设置,否则会重复添加内容
#os.rename(OldFile,Bak_File)
#os.rename('ha_new',OldFile)
arg = '{"backend": "www.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}'
Add(arg) def Delete(arg):
'''删除的思路和上面的相同'''
'''arg = {
'bakend': 'www.oldboy.org',
'record':{
'server': '100.1.7.9',
'weight': ,
'maxconn':
}
}'''
Add_dict = json.loads(arg)
BackTitle = "backend %s" %(str(Add_dict['backend']))
BackBody = 'server %s %s weight %d maxconn %d' %(Add_dict['record']['server'],Add_dict['record']['server'],
Add_dict['record']['weight'],Add_dict['record']['maxconn'],)
Backend_List = Check(Add_dict['backend'])
print Backend_List
if not Backend_List:
print "\033[32m你需要删除的backend记录不存在\033[0m"
else:
Backend_List.insert(,BackTitle)
print BackBody
if BackBody in Backend_List:
Backend_List.remove(BackBody)
print "删除指定内容"
else:
print "\033[32m你需要删除的backend记录不存在\033[0m"
print Backend_List
with open(OldFile,'rb') as f_old,open('ha_new','ab') as f_new:
Flag = False
Has_Write = False
for line in f_old.readlines():
if line.strip().startswith('backend') and line.strip().endswith(Add_dict['backend']):
Flag = True
continue
if Flag and line.strip().startswith('backend'):
Flag = False
if not Flag:
f_new.write(line)
else:
if not Has_Write:
for record in Backend_List:
if record.strip().startswith('backend'):
f_new.write("%s\n" %record)
else:
f_new.write("%s %s\n" %(" "*,record))
Has_Write = True
#Delete(arg) if __name__ == '__main__':
print """你想要执行如下哪个操作:
、查看
、增加
、删除
"""
Chose_Num = int(raw_input("请输入你数字:"))
arg = '{"backend": "www.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}'
if Chose_Num == :
print Check('www.oldboy.org')
elif Chose_Num == :
Add(arg)
elif Chose_Num ==:
Delete(arg)
else:
print "\033[31m你输入的数字是无效的\033[0m"
demo
python递归、collections系列以及文件操作进阶的更多相关文章
- (Python )格式化输出、文件操作、json
本节学习Python的格式化输出,文件操作以及json的简单用法 1.格式化输出 将非字符串类型转换成字符串,可以使用函数:str() 或者repr() ,(这两个函数的区别目前我还没搞懂,求解答) ...
- Python系列之文件操作、冒泡算法、装饰器、及递归
文件处理 python对文件进行读写操作的方法与具体步骤,包括打开文件.读取内容.写入文件.文件中的内容定位.及关闭文件释放资源等 open().file(),这个两函数提供了初始化输入\输出(I\O ...
- Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数
文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...
- Python学习系列之文件操作
Pyhton文件打开方式 with= open('文件路径','打开模式') as f:#PS:python3提供了with语句来帮我们自动调用close方法,所以说无论打开文件是否出错都能自动正确的 ...
- python基础(三)-- 文件操作
一. 文件操作: 对文件操作流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 现有文件如下 : Somehow, it seems the love I kn ...
- python基础之元组、文件操作、编码、函数、变量
1.集合set 集合是无序的,不重复的,主要作用: 去重,把一个列表变成集合,就可以自动去重 关系测试,测试两组数据的交集,差集,并集等关系 操作例子如下: list_1 = [1,4,5,7,3,6 ...
- python教程(八)·文件操作
由于离高考越来越近,博主打算本篇文章过后,暂停本系列教程的更新,等到高考完后再继续本系列教程,请谅解! 这次我们学习用python操作文件,包括文件的读.写等-- 操作文件第一步--打开文件 要想操作 ...
- Python全栈工程师(文件操作、编码)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 Python人工智能从入门到精通 最近简直要死了 发烧感冒 喉咙痛..... ...
- 【python之路19】文件操作
一.打开文件 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r ...
随机推荐
- 机器学习简要笔记(三)-KNN算法
#coding:utf-8 import numpy as np import operator def classify(intX,dataSet,labels,k): ''' KNN算法 ''' ...
- Java - 25 Java 包(package)
Java 包(package) 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包 ...
- android 开发 singleTask启动模式下传值的坑
日常填坑. 做了什么操作引起的?如下: 在活动A 启动模式设置为singleTask ,然后再用活动A启动活动B,活动B启动活动C. 现在我的活动C要使用intent携带值去启动活动A.在活动A中正常 ...
- PyQt5 qt desinger
https://jaist.dl.sourceforge.net/project/eric-ide/eric6/stable/18.08/eric6-18.08.zip pip --timeout 3 ...
- 实用的DDos攻击工具
来源: http://www.safecdn.cn/linux/2018/12/ddos/95.html 特别提示:仅用于攻防演练及教学测试用途,禁止非法使用 Hyenae 是在windows平台 ...
- Maven下载私服上的jar包
1.配置M2_HOME/conf/settions.xml <server> <id>maven-public</id> <username>admin ...
- python中的type
我们常用type()来查看类型,使用方法如下: 1 a = "zzzq" 2 b = 1 3 c = (1, "zzq123") 4 d = [2, " ...
- oryx 分离&集成
公司需要用到在线的流程编辑器,我研究了下activiti,activiti-explorer 是一个 web流程编辑工具,根据我了解到的情况. activiti-explorer web流程编辑工具 ...
- 利用java反射排查一次线上问题(确定问题及问题定位)
背景 hive 用的 1.1.0版本(其实这个版本bug挺多,包括执行计划串列的等等问题吧,建议大家如果选1.x版本用1.2.2吧),一下提到的代码部分如无特殊说明都是hive-1.1.0版本. 前段 ...
- 白鹭引擎 - 对象的添加与删除 ( 开关效果 addChild, removeChild )
class Main extends egret.DisplayObjectContainer { /** * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用父类的构造函数 ...