先学习之前未完成的冒泡算法

li = [13,22,6,99,11]

从小到大

从第一个数字比较把大的往后移位

for m in range(4):

  num1 = li[m]

  num2 = li[m+1]

  if num1 > num2:

    temp = li[m]

    li[m] = num2

    li[m+1] = temp

print li

循环四次就把最大数放到列表的最后

for m in range(3):

  num1 = li[m]

  num2 = li[m+1]

  if num1 > num2:

    temp = li[m]

    li[m] = num2

    li[m+1] = temp

以此类推写成以下代码

vim day4-1.py

#!/usr/bin/python
# -*- coding:utf-8 -*-

li = [13,22,6,99,11]
for m in range(4): #循环
num1 = li[m]
num2 = li[m+1]
if num1 > num2: #前一个数字和后一个对比如果前面数字大与后面的对调
temp = num1
li[m] = num2
li[m+1] = temp
print li for m in range(3):
num1 = li[m]
num2 = li[m+1]
if num1 > num2:
temp = num1
li[m] = num2
li[m+1] = temp print li for m in range(2):
num1 = li[m]
num2 = li[m+1]
if num1 > num2:
temp = num1
li[m] = num2
li[m+1] = temp print li for m in range(1):
num1 = li[m]
num2 = li[m+1]
if num1 > num2:
temp = num1
li[m] = num2
li[m+1] = temp print li #多次循环得到排序结果

  

[root@VPN scripts]# python day4-1.py
[13, 6, 22, 11, 99]
[6, 13, 11, 22, 99]
[6, 11, 13, 22, 99]
[6, 11, 13, 22, 99]

这样的循环很繁琐,假如不知道列表的长度更加麻烦需要多次循环

vim day4-2.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
li = [13,22,6,99,11]
for n in range(1,len(li)-1): #外层循环1,2,3,4
for m in range(len(li)-n): #内层循环4,3,2,1
num1 = li[m]
num2 = li[m+1]
if num1 > num2:
temp = li[m]
li[m] = li[m+1]
li[m+1] = temp
print li

  运行结果的一样的

[root@VPN scripts]# python day4-2.py
[6, 11, 13, 22, 99]

下面实现上节课的专业

一个配置文件需要实现以下三个功能

1,查找

2,添加

3,删除

配置文件ha

backend www.oldboy.org
server 100.1.7.9 100.1.7.9 weight
backend buy.oldboy.org
server 100.1.7.9 100.1.7.9 weight 20 maxconn 300
server 100.1.7.10 100.1.7.10 weight 20 maxcont 300
backend home.oldboy.org
server 100.1.7.9 100.1.7.9 weight 20 maxconn 300

vim day4-3.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
def fetch(backend):
fetch_list = [] #定义一个空的列表用来放置对应的配置数据
with open('ha') as obj: #打开配置文件
flag = False #定义一个flag用于循环的判断
for line in obj: #一行行读取文件中的数据
if line.strip() == "backend %s" %backend: #如果匹配到backend +对应的参数
flag = True #把flag置为True
continue #结束本次循环
if flag and line.strip().startswith('backend'): #如果flag为True并且开始为backend结束整个循环
break #如果遇到下一个backend代表已经读取到了下一个配置文件了
if flag and line.strip(): #如果flag为真并且不是空行添加到fetch_list列表
fetch_list.append(line.strip())
return fetch_list #函数返回这个列表
result = fetch("buy.oldboy.org")
print (result)

  

下面实现添加

添加的格式为

s = '{"backup":"www.oldboy.org","record":{"server":"100.1.7.9","weight":20,"maxconn":30}}'

添加的步骤为

1,找到指定backend下所有记录

2,处理记录

原来存在该记录

原来不存在该记录

当原来配置文件不存在这条记录时

vim day4-4.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import json
import os
def fetch(backend):
fetch_list = [] #定义一个空的列表用来放置对应的配置数据
with open('ha') as obj: #打开配置文件
flag = False #定义一个flag用于循环的判断
for line in obj: #一行行读取文件中的数据
if line.strip() == "backend %s" %backend: #如果匹配到backend +对应的参数
flag = True #把flag置为True
continue #结束本次循环
if flag and line.strip().startswith('backend'): #如果flag为True并且开始为backend结束整个循环
break #如果遇到下一个backend代表已经读取到了下一个配置文件了
if flag and line.strip(): #如果flag为真并且不是空行添加到fetch_list列表
fetch_list.append(line.strip())
return fetch_list #函数返回这个列表
#result = fetch("buy.oldboy.org")
#print (result) def add1(dict_info):
backend_title = dict_info.get('backend')
#"backend www.oldboy.org"
current_title = "backend %s" %backend_title
current_record = "server %s %s weight %d maxconn %d" %(dict_info['record']['server'],dict_info['record']['server'],dict_info['record']['weight'],dict_info['record']['maxconn'])
#获取指定backend下面的所有记录
fetch_list = fetch(backend_title)
if fetch_list:
pass #存在backend,则只需再添加记录
else:
with open('ha','r') as read_obj,open('ha.new','w') as write_obj: #不存在backend,添加记录和backend
#把原配置文件中内容,写入新配置文件中
for line in read_obj:
write_obj.write(line)
write_obj.write("\n"+current_title+'\n')
temp = "%s%s\n" %(" "*8,current_record)
write_obj.write(temp)
s = '{"backend":"www.oldboy.org","record":{"server":"100.1.7.9","weight":20,"maxconn":30}}' #s是一个字符串
data_dict = json.loads(s) #使用json方法把字符串转换成字典
add1(data_dict)
os.rename("ha","ha.bak")
os.rename("ha.new","ha")

 执行结果会在原配置文件下面增加记录,记录的标题为www.oldboy.org内容为server 100.1.7.9 100.1.7.9 weight 20 maxconn 30

使用os模块的重命名功能把新生成的配置文件替换原来的配置文件,原来的配置文件做一个备份ha.bak

当原来配置文件存在这条记录标题时

如果插入的记录已经存在不插入,不存在则插入

vim day4-5.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import json
import os
def fetch(backend):
fetch_list = [] #定义一个空的列表用来放置对应的配置数据
with open('ha') as obj: #打开配置文件
flag = False #定义一个flag用于循环的判断
for line in obj: #一行行读取文件中的数据
if line.strip() == "backend %s" %backend: #如果匹配到backend +对应的参数
flag = True #把flag置为True
continue #结束本次循环
if flag and line.strip().startswith('backend'): #如果flag为True并且开始为backend结束整个循环
break #如果遇到下一个backend代表已经读取到了下一个配置文件了
if flag and line.strip(): #如果flag为真并且不是空行添加到fetch_list列表
fetch_list.append(line.strip())
return fetch_list #函数返回这个列表
#result = fetch("buy.oldboy.org")
#print (result) def add1(dict_info):
backend_title = dict_info.get('backend')
#"backend www.oldboy.org"
current_title = "backend %s" %backend_title
current_record = "server %s %s weight %d maxconn %d" %(dict_info['record']['server'],dict_info['record']['server'],dict_info['record']['weight'],dict_info['record']['maxconn'])
#获取指定backend下面的所有记录
fetch_list = fetch(backend_title)
if fetch_list: #存在backend,则只需再添加记录
if current_record in fetch_list:
pass #如果这条记录存在什么都不做
else:
fetch_list.append(current_record)#得到处理完之后的中间部分
#读配置文件,写新配置文件
#读上->新上
#新配置处理完之后配置文件写入新配置文件中
#读下->新下
flag = False
has_write = False
with open('ha','r') as read_obj,open('ha.new','w') as write_obj:
for line in read_obj:
if line.strip() == current_title:
flag = True
write_obj.write(line)#把backend写入到新配置文件里
continue
if flag and line.strip().startswith('backend'): #如果flag为True并且开始为backend结束整个循环
# write_obj.write(line)
flag = False
if flag and line.strip():
#把已经处理完的数据fetch_list写入到新配置文件中
if not has_write:
for new_line in fetch_list:
temp = "%s%s\n" %(" "*8,new_line)
write_obj.write(temp)
has_write = True
else:
write_obj.write(line)
else:
with open('ha','r') as read_obj,open('ha.new','w') as write_obj: #不存在backend,添加记录和backend
#把原配置文件中内容,写入新配置文件中
for line in read_obj:
write_obj.write(line)
write_obj.write("\n"+current_title+'\n')
temp = "%s%s\n" %(" "*8,current_record)
write_obj.write(temp)
s = '{"backend":"buy.oldboy.org","record":{"server":"100.1.7.39","weight":20,"maxconn":30}}' #s是一个字符串
data_dict = json.loads(s) #使用json方法把字符串转换成字典
add1(data_dict)
os.rename("ha","ha.bak")
os.rename("ha.new","ha")

  

Python冒泡算法和修改配置文件的更多相关文章

  1. python冒泡算法联系代码

    root@(none):~/python# python maopao.py[6, 11, 13, 22, 99]root@(none):~/python# cat maopao.py #!/usr/ ...

  2. python冒泡算法

    array = [1,2,3,6,5,4,28,2,1,9,3,0,200,2,9,3,2,98,33,988,22,0,223,0,33,78,222,88,32,0,238,883,2,0,23] ...

  3. python学习之路-6 冒泡算法、递归、反射、os/sys模块详解

    算法 冒泡算法 # 冒泡算法就是将需要排序的元素看作是一个个"气泡",最小的"气泡"最先浮出水面,排在最前面.从小到大依次排列. # 代码如下: li = [9 ...

  4. Python之collections序列迭代器下标式循环冒泡算法等

    练习题 元素分类 有如下值集合[11,22,33,44,55,66,77,88,99]将所有大于66的数作为一个列表放在字典的key为k1的value小于等于66的为k2的value {'k1':[7 ...

  5. Python系列之文件操作、冒泡算法、装饰器、及递归

    文件处理 python对文件进行读写操作的方法与具体步骤,包括打开文件.读取内容.写入文件.文件中的内容定位.及关闭文件释放资源等 open().file(),这个两函数提供了初始化输入\输出(I\O ...

  6. python查询修改配置文件功能

    阅读目录 一.python查询功能代码 1.查询修改配置文件 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 i ...

  7. python读写修改配置文件(ini)

    python 有时候参数需要保存到配置文件中  接下来总结一下 配置文件的读写和修改的操作 代码如下: #!/usr/bin/env python # -*- coding: utf- -*- # 读 ...

  8. python排序算法实现(冒泡、选择、插入)

    python排序算法实现(冒泡.选择.插入) python 从小到大排序 1.冒泡排序: O(n2) s=[3,4,2,5,1,9] #count = 0 for i in range(len(s)) ...

  9. 44.python排序算法(冒泡+选择)

    一,冒泡排序: 是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个,如果他们的排序错误就把他们交换过来. 冒泡排序是稳定的(所谓稳定性就是两个相同的元素不会交换位置) 冒泡排序算法的运作如下 ...

随机推荐

  1. windos环境apache+mysql+php+Discuz的安装配置

    首先是相关软件的下载:PHP.Apache和Mysql软件以及VC库.相关软件可到我的百度网盘下载,百度网盘:http://pan.baidu.com/s/1o6DYcMu 相关软件的直接下载地址: ...

  2. 【react-router】从Link组件和a标签的区别说起,react-router如何实现导航并优化DOM性能?

    (注:参考自官方英文文档V3.X版本) react-router是伴随着react框架出现的路由系统,它也是公认的一种优秀的路由解决方案.在使用react-router时候,我们常常会使用其自带的路径 ...

  3. loadrunner提高篇-block(块)技术和参数化

    Block(块)技术 block(块)技术是应用于在一个脚本中实现不同事务.不同次数循环或不同百分比循环的情况.比如在一个脚本中,登录执行3次,查询执行1次. 使用方法如下: 1.录制一个脚本,包含2 ...

  4. JavaWeb之cookie

    什么叫做会话 ? 用户从打开一个浏览器开始,浏览器网站,到关闭浏览器的整个过程叫做一次会话! 每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据. 例如:用户点击超链接 ...

  5. 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态

    老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态   poptest是国内唯一 ...

  6. html/css/javascript的含义、作用及理解

    HTML(HyperText Markup Language/超文本标记语言) 含义:HTML是一种用于创建网页的标准标记语言. 作用:页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 理解:主 ...

  7. memcached预热失败

    缓存逻辑:set和get方法通过中间层SocketServer,由SocketServer去操作缓存(同步备用缓存等) 预热逻辑:在SocketServer里面打日志,通过日志去预热新缓存 出现问题: ...

  8. node压力测试

    压力测试 ab测试(ApacheBench); 介绍: 这是apache提供的压测工具; 使用: 启动node服务; 我用的XAMPP,进入bin文件夹,打开命令行,执行下面命令: // -n: 总请 ...

  9. C#调用WebService接口实现天气预报在web前端显示

    本文使用web (C#)调用互联网上公开的WebServices接口: (http://www.webxml.com.cn/WebServices/WeatherWebService.asmx)来实现 ...

  10. Java与面向对象之随感(1)

    大一下学期上完了c++课程,当时自我感觉很良好,认为对面向对象编程已经是身经百战了,但是上了院里HuangYu老师的Java课之后,才发现自己对于面向对象的编程风格的理解只在皮毛,着实惭愧不已. 假设 ...