Python学习笔记 Day 3

  • 集合(关系测试、去重)
    • 集合定义
    • 关系测试-交集(&),并集(|),差集(-),子集,父集,对称差集(^)
    • 增删查
      • 增 .set.add(),.set.update()
      • 删除 remove(),pop(),discard()
      • 检查x 是否是S的成员
  • 文件
    • 文件操作
      • 读取
      • 写操作
      • 读与写及进制
        • (r+,w+,a+(同a),rb:处理二进制文件,(w,a )+b同理,b无encoding)
        • 把某行内容进行更改replace()
      • 虽然文件会自动关闭,但最好是用完即关。
  • 字符编码与转码
  • 函数式编程与函数
    • 定义
    • 使用函数的好处
    • 函数返回值、参数
      • 返回值的作用:
      • 实参,形参
    • 作用域、局部与全局变量
      • 全局与局部变量
    • 递归
    • 函数式编程
    • 高阶函数:
  • 作业

集合(关系测试、去重)

集合定义

注:集合天生去重,也是无序的
(1).工厂方法:se = set()
注意不要写成 se = () 这样变成元组了。
(2).直接定义:se = {1,2,3} 用大括号括起来。
大括号中要写入元素,不写元素就是一个空字典了。

list_1=[1,6,5,2,7,8,5,1,0,7]
list_1=set(list_1)#变集合,去重
print(list_1,type(list_1))

运行如下:


{0, 1, 2, 5, 6, 7, 8} <class 'set'>

关系测试-交集(&),并集(|),差集(-),子集,父集,对称差集(^)

list_1=[1,6,5,2,7,8,5,1,0,7]
list_1=set(list_1)#变集合,去重
list_2=set([88,22,8,1,15,23,56,47,5])
#交集,找出两个集合中相同的元素
print("1",list_1.intersection(list_2))#等同print(list_1 & list_2)
#并集,去除两个集合相同的元素然后合并
print("2",list_1.union(list_2))
#差集,保留1里面2所没有的
print("3",list_1.difference(list_2))
#子集,列表1是否是2的子集
list_3=set([1,2,7])
print ("4",list_1.issubset(list_2))
#父集,列表3是否是1的父集
print("5",list_1.issuperset(list_2))
print ("6",list_3.issubset(list_1))
#反向差集,去除交集,把互相没有的合到一起
print("7",list_1.symmetric_difference(list_2))
#判断两个集合是否没有交集,是则返回True
list_4=set([3,5,6])
print("8",list_3.isdisjoint(list_4))

运行如下

1 {8, 1, 5}
2 {0, 1, 2, 5, 6, 7, 8, 15, 22, 23, 88, 47, 56}
3 {0, 2, 6, 7}
4 False
5 False
6 True
7 {0, 2, 6, 7, 15, 47, 22, 23, 88, 56}
8 True

增删查

增 .set.add(),.set.update()

(1).add() 添加单个元素
(2).update(iterable) 批量更新,会去重

list_1={1,6,5,2,8,0,7}
list_2={88,22,8,1,15,23,56,47,5}
print(list_1.add(999),list_2.update([112,333,555]))

删除 remove(),pop(),discard()

list_1={1,6,5,2,8,0,7}
list_2={88,22,8,1,15,23,56,47,5}
print(list_1.remove(1))
#随意删除一个元素并反馈该元素为何值
print(list_2.pop())
print(list_2.pop())#验证2次
#随意删除一个元素并反馈该元素为何值
list_2=list_2.discard()
print(list_2)
#discard()里的参数不正确是,其返馈的是None,不会报错

检查x 是否是S的成员

x iin s ;(x not in s 也可以用)

文件

文件操作

如下例子中 : r是模式,read,w是写,write,会另存1个文件出来,注意改文件名,否则会復盖。a是append,追加内容。写入时不用改名它是原来文件末端加上内容
打开文件进行操作用完后理应加上.close()进行关闭

读取

data=open("C:\ProgramData\Anaconda3\yesterday.py",'r',encoding="utf-8").read()#此方法只能打开,不能操作
print("内容为:%s---"%data)
data.close()
#打印内容内有%+字符类型代码(如S),在引号后加%+变量名,变量内空会可以打印在打印内容内。如上,打印内容为:“内容为:【data文件内容】---”
#encoding为字符编码,r是模式,read,w是写,write,a是append,追加内容,写入时不用改名它是原来文件末端加上内容

运行结果为打印yesterday.py的内容

f=open("C:\ProgramData\Anaconda3\yesterday.py",'r',encoding="utf-8")#文件句柄,相当于告知路径,此方法对文件能进行操作
a=f.read()
b=f.read()
print(a)
print("--------------------------------------------------")
print(b)


运行结果也为打印yesterday.py的内容,且顺序执行,但B的内容为打印不出来。因为1次读取后,相当于光标放在了最后,B打开时因为光标在最后,无法读取。


读前几行

f=open("C:\ProgramData\Anaconda3\yesterday.py",'r',encoding="utf-8")#文件句柄,相当于告知路径,此方法对文件能进行操作,
for i in range (5)print(f.readline())


不打印某行

f=open("C:\ProgramData\Anaconda3\yesterday.py",'r',encoding="utf-8")#文件句柄,相当于告知路径,此方法对文件能进行操作
count=0
for line in f:if count==9:print("-------------")count +=1continueprint(line)count+=1


不打印某行,但此方法相比于上面的方法,此方法会先读到内存,会更耗内存,上面的方法是直接復盖

f=open("C:\ProgramData\Anaconda3\yesterday.py",'r',encoding="utf-8")#文件句柄,相当于告知路径,此方法对文件能进行操作
for index , line in enumerate(f.readlines()):#加S读多行if index==9:print("==================")continueprint(line.strip())

Python中read()、readline()和readlines()三者间的区别和用法

光标的位置寻找与移动:.tell() .seek()

f=open("C:\ProgramData\Anaconda3\yesterday.py",'r',encoding="utf-8")
#文件句柄,相当于告知路径,此方法对文件能进行操作
print (f.tell())#打印当前光标位置
f.readline()#读取一行
print (f.tell())#打印当前光标位置
f.seek(0)#回到0字符位置
print(f.tell())#打印当前光标位置
print(f.read(5))#读取5个字位置
print(f.tell())#打印当前光标位置
print(f.encoding)#文件编码
print(f.fileno())#系统读取文件的通道 这里是win\mac系统读取的通道
0
29
0
中文名称:
15
utf-8
4

系统刷新 flush():把写到内存缓冲区的内容刷新写入到硬盘,我们执行了一条命令,如写内容,从缓冲区到内存可能要到几次才进行一次,所以,这条刷新命令就起到了直接的作用

f=open("C:\ProgramData\Anaconda3\ flush ceshi.py",'a',encoding="utf-8")
#文件句柄,相当于告知路径,此方法对文件能进行操作
f.write("加入新内容")
#执行了这句,硬盘的文件可能还不会出现此句,此时“加入新内容”可能还在内存缓冲区。
f.flush()
#执行这句,让内容从缓冲区放入到硬盘,保证内容在硬盘的文件有“加入新内容”
#由于执行起来也一样,不加图

如下某些软件进入时的加载条的代码同样用上此方法。

import sys ,time
for i in range (50):sys.stdout.write("#")sys.stdout.flush()#刷新time.sleep(0.1)#停止0.1S

代码运行点击这
提取码: v252

截段读取truncate():不论当前光标处在哪里,都是截取从开头到括号参数个字。

f=open("C:\ProgramData\Anaconda3\ yesterday.py",'a',encoding="utf-8")
#文件句柄,相当于告知路径,此方法对文件能进行操作
f.truncate(10)

Python3.0的网络传输文件都是二进制编码



写操作

Python的w操作是创建个新文件 ,所以注意在进行写文件时,要改写的文件的名字,否则名字相同了会把原来的文件復盖了,丢失原来数据,a操作是追加,a是append,追加内容,写入时不用改原文件名,它是原来文件末端加上内容

f=open("C:\ProgramData\Anaconda3\yesterday2.py",'w',encoding="utf-8")#文件句柄,相当于告知路径,此方法对文件能进行操作,yesterday2.py是新建的文件名
f.write('我爱北京\n')
f.write('我爱广东\n')
f.write("这是新加的内容\n")
f.close()
a=open("C:\ProgramData\Anaconda3\yesterday2.py",'r',encoding="utf-8").read()
print(a)

a是append,追加内容,是支持可读可写的。写入时不用改名它是原来文件末端加上内容

f=open("C:\ProgramData\Anaconda3\yesterday.py",'a',encoding="utf-8")#文件句柄,相当于告知路径,此方法对文件能进行操作
f.write('我爱北京\n')
f.write('我爱广东\n')
f.write("这是新加的内容\n")
f.close()
a=open("C:\ProgramData\Anaconda3\yesterday.py",'r',encoding="utf-8").read()
print(a)

此时如下



读与写及进制

(r+,w+,a+(同a),rb:处理二进制文件,(w,a )+b同理,b无encoding)

凡是PYthon的写,都只能加在末端,不可能加在中间。凡是用到W模式都会另存一个新文件的。注意改名,否则盖掉原来会导致数据丢失。

f=open("C:\ProgramData\Anaconda3\ yesterday.py",'r+',encoding="utf-8")
#文件句柄,读写
print(f.readline())
print(f.write("我是新内容"))
f.close
g=open("C:\ProgramData\Anaconda3\ yesterday.py",'r',encoding="utf-8")
print(g.read())

二进制文件的打开
Eg:

f=open("C:\ProgramData\Anaconda3\ yesterday.py",'rb')

把某行内容进行更改replace()

文件操作应用

f=open("C:\ProgramData\Anaconda3\yesterday2.py","r",encoding="utf-8")
f_new=open("C:\ProgramData\Anaconda3\yesterday2.bak","w",encoding="utf-8")
for line in f :if "中文名称:昨日重现" in line:line=line.replace("中文名称:昨日重现","中文名称:单克隆抗体")f_new.write(line)
#把文件打印到第二个文件上,发现目标更改
f.close()
f_new=open("C:\ProgramData\Anaconda3\yesterday2.bak","r",encoding="utf-8")
print(f_new.read())
#此方法可以再移动到yesterday2.py路径,从而实现从原文件更改一样

原文:

运行后

虽然文件会自动关闭,但最好是用完即关。

with语句:with(“log”,“r”)

with open("C:\ProgramData\Anaconda3\yesterday2.py","r",encoding="utf-8") as f:for line in f:print(line)

Python 最好一行不要超过80个字符 ,So:

with open("C:\ProgramData\Anaconda3\yesterday2.py","r",encoding="utf-8") ,\
as f:for line in f:print(line)

#程序练习:
程序1:实现简单的 shell sed 替换功能
程序2:修改haproxy配置文件

程序1代码如下:

f=open("C:\ProgramData\Anaconda3\yesterday2.py","r",encoding="utf-8")
f_new=open("C:\ProgramData\Anaconda3\yesterday2.bak","w",encoding="utf-8")
find_str=input("请输入你要进行更改的句子:")
replace_str=("请输入你更改成什么句子:")
for line in f :if find_str in line:line=line.replace(find_str,replace_str)f_new.write(line)
#把文件打印到第二个文件上,发现目标更改
f.close()
f_new=open("C:\ProgramData\Anaconda3\yesterday2.bak","r",encoding="utf-8")
print(f_new.read())
#此方法可以再移动到yesterday2.py路径,从而实现从原文件更改一样

运行:

原文:

程序2代码:

字符编码与转码

存中文的编码:GBK
含多国字的编码:UNICODE(全球通用)
ASCII默认1个byte,而unicode存英文2Bytes,16位,中文3Bytes。

Unicode只是一个编码规范,目前实际实现的unicode编码只要有三种:UTF-8,UCS-2和UTF-16,三种unicode字符集之间可以按照规范进行转换。Unicode相当于一个在集合,所有文字相当于在Unicode中转,即他国文字转相应的Unicode码,Unicode再相应形式编码,最后由此编码转该国文字。Eg:日文转中文,在日文相应编码环境,日文文字编码转Unicode码,Unicode再用内含的GBK转中文。

s.decode('utf-8').encode('utf-8')#将utf-8编码的s的内容转unicode再转utf-8

decode():是解码成unicode码
encode()是编码其他形式的编码
他人更易懂文章


图片引自 : 年轻人——001

utf-8转gbk码

#-*- coding:utf-8 -*-
import sys
print (sys.getdefaultencoding())#打印系统当前应用的编码
s="你好"
s_to_gbk=s.encode("gbk")
#本身在unicode编码环境,软件已经直接将utf-8转到了unicode,然后把S的“你好”的unicode编码换成Gbk,如果你直接decode()将会出错,因为环境就在Unicode中
print(s_to_gbk)#打印你好的GBK码

运行如下:

utf-8
b'\xc4\xe3\xba\xc3'

utf-8>>>GB2312

#-*- coding:utf-8 -*-
import sys
print (sys.getdefaultencoding())
s="你好"
s_to_G=s.encode("GB2312")
#本身在unicode编码环境,软件已经直接将utf-8转到了unicode,然后把S的“你好”的unicode编码换成Gbk
print(s_to_G)

运行如下:

utf-8
b'\xc4\xe3\xba\xc3'

Python编译器2.x默认是ASCII码编码环境,3.x是unicode编码环境,若是当前编码要选去其他如Gbk,头文件要声明编码形式,此时代码将以Gbk编码形式保存文件,声明是说明此代码文件是Gb2312编码的,但运行编码环境还是Uincode,因为环境本身处在像下例中的Unicode了,所以只有转到GB2312才有下题 #-- coding:GBK --

GB2312>>>Unicode>>>gbk

# -*- coding: GB2312 -*-
#上面声明是说明此代码文件是Gb2312编码的,但运行编码环境还是在Uincode,可以直接encode()到任何类型,如gbk
import sys
print (sys.getdefaultencoding())
s="你好"
s_to_GB2312=s.encode("utf-8").decode("utf-8").encode("GB2312")
#此处因为默认在unicode环境为utf-8中,所以要encode("utf-8").decode("utf-8")以decode成unicode码,相当于题目开立在utf-8先转到GB2312才有这题等同于要s_to_GB2312=s.encode("GB2312"),根本原因还是软件默认在unicode环境为utf-8中
print(s_to_GB2312,type(s_to_GB2312))
s_to_utf8=s.encode("GB2312").decode("GB2312").encode("utf-8")
print(s_to_utf8)
s_to_gbk=s.encode("utf-8").decode("utf-8").encode("gbk")
print(s_to_gbk)

运行如下:

utf-8
b'\xc4\xe3\xba\xc3' <class 'bytes'>
b'\xe4\xbd\xa0\xe5\xa5\xbd'
b'\xc4\xe3\xba\xc3'

utf-8>>>gbk>>>utf-8

#-*- coding:utf-8 -*-
import sys
print ("1","默认编码为:",sys.getdefaultencoding())#打印系统当前应用的编码
s="你好"
s_to_gbk=s.encode("gbk")
#本身在unicode编码,软件已经直接将utf-8转到了unicode,然后把S的“你好”的unicode编码换成Gbk
print("2","gbk:",s_to_gbk)#打印你好的GBK码
gbk_to_utf8=s_to_gbk.decode("gbk").encode("utf-8")
#Gbk先解码(Decode)成Unicode,再编码成Utf-8
print("3","utf-8:",gbk_to_utf8)

运行如下:

1 默认编码为: utf-8
2 gbk: b'\xc4\xe3\xba\xc3'
3 utf-8: b'\xe4\xbd\xa0\xe5\xa5\xbd'

练习:GB2312>>>utf-8>>>GB2312>>GBK

#-*- coding:GB2312 -*-
#上面声明是说明此代码文件是Gb2312编码的,但运行编码环境还是在Uincode,可以直接encode()到任何类型,如gbk
import sys
print ("1","系统默认编码:",sys.getdefaultencoding())#打印系统当前应用的编码
s="你好"
s_to_GB2312=s.encode("utf-8").decode("utf-8").encode("GB2312")
#此处因为默认在unicode环境为utf-8中,所以要encode("utf-8").decode("utf-8")以decode成unicode码,相当于题目开立在utf-8先转到GB2312才有这题等同于要s_to_GB2312=s.encode("GB2312"),根本原因还是软件默认在unicode环境为utf-8中
print("2","GB2312",s_to_GB2312)
s_to_utf8=s.encode("utf-8")
print("3","utf-8",s_to_utf8)#打印你好的utf8码
s_to_GB2312=s.encode("utf-8").decode("utf-8").encode("Gb2312")
print("4","GB2312",s_to_GB2312)#打印你好的GB2312码
s_to_gbk=s.encode("Gb2312").decode("GB2312").encode("gbk")
print("5","gbk",s_to_gbk)

Python编译器2.x默认是ASCII码编码环境,3.x是unicode编码环境,若是当前编码要选去其他如Gbk,头文件要声明编码形式,此时代码将以Gbk编码形式保存文件,声明是说明此代码文件是Gb2312编码的,但运行编码环境还是Uincode,因为环境本身处在像下例中的Unicode了,所以只有转到GB2312才有上题 #-- coding:GBK --

运行如下:

1 系统默认编码: utf-8
2 GB2312 b'\xc4\xe3\xba\xc3'
3 utf-8 b'\xe4\xbd\xa0\xe5\xa5\xbd'
4 GB2312 b'\xc4\xe3\xba\xc3'
5 gbk b'\xc4\xe3\xba\xc3'

函数式编程与函数

定义

编程方式:

  1. 面向对象(新):华山派>>>类 >>>class
  2. 面向过程:少林派>>>过程>>> def
  3. 函数式编程(最早):逍遥派>>>def
    函数:
    数学层面:y=kx,x:自变量,y:因变量
    编程层面:把逻辑结构化和过程化的编程方法。
#函数
def func1():#"testing1"print("in the func1")return 0#过程
def func2():# testing2print("in the func2")
x=func1()
y=func2()
print("from func1 return is %s"%x)
print("from func2 return is %s"%y)

区别:过程是没有返回值的

运行结果:

in the func1
in the func2
from func1 return is 0
from func2 return is None

使用函数的好处

关闭函数的With语句的使用。

  1. 简洁,代码重用
  2. 可扩展
  3. 保持一致
import time
def logger():time_format='%Y-%m-%d %X'time_current = time.strftime(time_format)with open('a.txt','a+') as f:f.write("%s end action\n"%time_current)
def test1():print("in the test1\n")logger()def test2():print("in the test2\n")logger()def test3():print("in the test3\n")logger()test1()
test2()
test3()

函数返回值、参数

返回值的作用:

可以检验函数执行情况。情况的设立可以函数体中设置不同返回值。

def test1():print("in the test1\n")return 0#代表函数结束,往下语句不执行print("测试是否结束")
def test2():print("in the test2\n")
def test3():print("in the test3\n")return 1,"liang",[1,"liang","大吃一惊"['26','sss']],{"xiaoming",['22','lala']},{'xi','wang'}
#c,C++只可返回1个值,而Python可把全部数值装成1个元组返回,返回的也可以是函数。
x=test1()#可以检验函数执行情况
y=test2()
z=test3()
print("x","y","z")

运行如下:

in the test1in the test2in the test30
None #这里是有返回值的
(1, 'liang', [1, 'liang', [26, 'sss']], 'xiaoming', [22, 'lala'], {'wang', 'xi'})

实参,形参

参数类别:
位置参数:
实参,形参一 一对应

def test(x,y):print(x)#xy为形参,与实参一 一对应print(y)return 0#代表函数结束,往下语句不执行
test("a",2)#a,2为实参,可以y=2,x=a
#关键字参数不能放字母,除非两个都声明
#Eg:test(x="a",2)不可行,而test("a",y=2)可以

这个也是一样的,但test(y=y,x=x)的=后的x,y与=前的xy是不一样的

def test(x,y):print(x)#xy为形参print(y)return 0#代表函数结束,往下语句不执行
x="a"
y=2
test(y=y,x=x)

默认参数(如下形参y=2)
特点:詷用函数时,默认参数非必须传递
用途:提前设1个默认值,如连接数据库的端口号

def test(x,y=2):print(x)print(y)return 0#代表函数结束,往下语句不执行
test("a")#用test("a",3),此时3会传给形参y,2丢失

参数组(*开头的形参)
只接收N个位置参数,转换成元组形式

def test(*a):print(a)return 0#代表函数结束,往下语句不执行
test("a",1,2,3,3,5,6)#*开头定义的形参可以接收一个数组
test(*[1,2,4,"a"])#*开头定义的实参可以定义一个数组传给*开头定义的形参

参数组与普通参数的结合可以完美改变形参,实参个数一一对应的限制写法

def test(x,*a):print(a)return 0#代表函数结束,往下语句不执行
test("a",1,2,3,3,5,6)#*开头定义的形参可以接收多出的实参而不出错

字典形式的形参(**开头定义的变量名)
把keys,values转换成字典存放

def test(**a):print(a)print(a["name"])print(a["age"])print(a["sex"])print("--------------")
test(name="liang",age=23,sex="male")#会把关键字如name,sex变成字典存放到形参
test(**{"name":"liang","age":8,"sex":"male"})#形参里知道key values

运行如下:

{'name': 'liang', 'age': 23, 'sex': 'male'}
liang
23
male
--------------
{'name': 'liang', 'age': 8, 'sex': 'male'}
liang
8
male
--------------

参数组必须在形参最后

def test(name,age=18,**a):print(name)print(age)print(a["name_another"])print(a["age_another"])print(a["sex_another"])print("--------------")
test("alex",17,name_another="liang",age_another=23,sex_another="male")
#以位置参数的方式给默认参数赋值
test("alex",name_another="liang",age=17,age_another=23,sex_another="male1")
#以关键字方式给默认参数赋值

运行如下:

alex
17
liang
23
male
--------------
alex
17
liang
23
male1
--------------
def test(name,age=18,*argvs,**a):print(name)print(age)print(argvs)print(a["name_another"])print(a["age_another"])print(a["sex_another"])print("--------------")
test("alex",17,78,'new',88,99,name_another="liang",age_another=23,sex_another="male")
##以位置参数的方式给默认参数赋值,多出送给参数组

证明参数组接收位置参数;

def test(name,age=18,*argvs,**a):print(name)print(age)print(argvs)print(a["name_another"])print(a["age_another"])print(a["sex_another"])print("--------------")
test("alex",17,78,'new',88,99,name_another="liang",age_another=23,sex_another="male")
##以位置参数的方式给默认参数赋值,多出送给参数组

运行如下:

alex
17
(78, 'new', 88, 99)
liang
23
male
--------------

作用域、局部与全局变量

全局与局部变量

不建议在函数内(global a 形式)改动全局变量,容易逻辑混乱
同时不应该函数内创建全局变量(global a 形式创全局a)
全局变量的作用域是整个程序,局部变量作用域是在子程序(函数)
当全局变量与局部变量同名时,子程序内局部变量起作用,在其他地方全局变量起作用。

def test(name,age=18,*argvs,**a):print(name)print(age)print(argvs)print(a)print("--------------")logger("test")
def logger(source):print("from %s "% source)
test("alex",17,78,'new',88,99,name_another="liang",age_another=23,sex_another="male")
#正常运行,若将test()放在def logger()前就会出错,logger()未定义,函数定义前与后问题
school="xi wang zhong xue"# 全局变量,只要在代码(外)顶部都是
def change_name(name):global school#声明在函数内使用全局的变量print(school)school="xingxing zhongxue"#改的是全局变量print(school)print("before:",name)name="LIANG"#此函数就是此变量的作用域,只在此函数暂时使用age=23print("after:",name)
change_name(name)
name="liang"
print(name)#全局,此Name与自定义的Name是不一样的
print(school)#此全局变量在函数内被改

运行如下:

xi wang zhong xue
xingxing zhongxue
before: liang
after: LIANG
liang
xingxing zhongxue

递归

在函数内部,可以调用其他函数。若是调用自身函数,则称递归
特性:

  1. 有一个明确的结束条件(递归最多999次)
  2. 第进入 更深一层,问题规模要比上次少
  3. 效率不高,递归层数过多会导致栈溢出
    以下就是无结束条件
def calc(n):print(n)return calc(n/2)
calc(10)

改为:

def calc(n):print(n)if n>1:return calc(n/2)
calc(10)
10
5.0
2.5
1.25
0.625

函数式编程

函数式编程,多个式,其更多接近数学,对电脑而言,汇编是最高效率的,语言越高级,代码越抽象,越低效率,如C>Python,对于函数式编程,只要输入确定,输出就确定。纯函数式编程语言有hashshell,lisp,erlang。
运算:(1+2)*3-4

var a=1+2
var b=a*3
var c=b-4

而函数式编程;

var result=subtract(multiply(add(1+2),3),4)

高阶函数:

一个函数可以接收另一个函数作为参数。这种函数叫高阶函数

def add(x,y,f):return f(x)+f(y)#f=abs(),函数调整用abs()
res=add(3,-6,abs)
print(res)

作业

程序2:修改Haproxy配置文件
Haproxy文件内容如下 :

globallog 127.0.0.1 local2daemonmaxconn 256
defaultslog globalmode httptimeout connect 5000mstimwout client 5000msoption dontlognull
listen stats : 8888ststs enable stats uri      /admin stats auth     admin:1234
frontend oldboy.org bind 0.0.0:80option httplogoption httpcloseoption forwardforlog globalacl www hdr_reg(host) -i www.oldboy.orguse_backend www.oldboy.org if www
backend www.oldboy.orgserver 100.1.7.9 100.1.7.9 weight 20 maxconn 3000

需求:

  1. search
    查:
    输入:www.oldboy.org
    获取当前backend下的所有网站记录
  2. add
    新建:
    输入以下内容方法来追加网站
{"backend":"www.baidu.com","record":{"server":"100.1.5.9","weight":10,"maxconn":60}}
  1. detele
    删:
    输入以下内容来删除网站
{"backend":"www.baidu.com","record":{"server":"100.1.5.9","weight":10,"maxconn":60}}
  1. Update()
    改:
    输入以下内容来增加网站
{"backend":"www.baidu.com","record":{"server":"100.1.5.9","weight":10,"maxconn":60}}

eval():把字符串变字典

答案参考VisonWong

Python学习笔记Day 3相关推荐

  1. [python教程入门学习]python学习笔记(CMD执行文件并传入参数)

    本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...

  2. python学习笔记之编写readConfig读写配置文件

    python学习笔记之编写readConfig读写配置文件_weixin_34055910的博客-CSDN博客

  3. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  4. Python学习笔记一简介及安装配置

    Python学习笔记一 参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e54 ...

  5. python学习笔记目录

    人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...

  6. Python学习笔记(二):标准流与重定向

    Python学习笔记(二):标准流与重定向 - SamWei - 博客园 Python学习笔记(二):标准流与重定向 Posted on 2012-02-19 22:36 SamWei 阅读(176) ...

  7. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  8. python基本语法语句-python学习笔记:基本语法

    原标题:python学习笔记:基本语法 缩进:必须使用4个空格来表示每级缩进,支持Tab字符 if语句,经常与else, elif(相当于else if) 配合使用. for语句,迭代器,依次处理迭代 ...

  9. 廖Python学习笔记一

    1. 廖Python学习笔记 大的分类 如函数 用二级标题,下面的用三级 如输入输出 1.1.1. 输入输出 1.1.1.1. 输出 用 print() 在括号里加上字符串,就可以向屏幕上输出指定的文 ...

  10. Python学习笔记(六)

    1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...

最新文章

  1. SGU 224.Little Queens
  2. KeUserModeCallback用法详解
  3. 多个线程对hashmap进行put操作的异常
  4. java oracle 图片_JAVA读取Oracle中的blob图片字段并显示
  5. Visual Studio 2010 C++ 工程文件解读
  6. js中调用C标签实现百度地图
  7. rs232串口驱动_RS232与RS485在性能上有啥区别和联系?老电工总结分析,一目了然...
  8. Leetcode--20. 有效的括号
  9. Java:类加载机制
  10. 瑞幸咖啡股价再大涨超36% 目前总市值约13.87亿美元
  11. GIS专家:云GIS带来的最大影响是体系架构
  12. c语言实现bitmap的基本操作
  13. CentOS 6.5 中安装Jenkins
  14. if语句 power query_判断(if)语句
  15. 2022年最新软件测试工程师简历经验总结:软件测试工程师简历项目经验怎么写?(含真实简历模板)
  16. Retina显示屏-揭秘移动端的视觉稿通常会设计为传统PC的2倍
  17. 数组填空题c语言及答案,C语言程序设计 程序填空题库及答案
  18. 我在b站学数据库 (九):函数
  19. python发outlook邮件_通过Python发送Outlook电子邮件?
  20. org.tigris.subversion.javahl.ClientException: Attempted to lock an already-locke

热门文章

  1. c#调用于仕琪libfacedetection方法与遇到的问题
  2. Java UDP 入门实例
  3. AjaxSubmit提交额外数据
  4. Android开发工具类之FileUtils,ImageUtils
  5. 编程 学习视频教程大全
  6. 检索多个word文档某个关键字并打印检索结果
  7. 阿里系“玩转”区块链
  8. 安装SQLyog社区版教程
  9. UNT413-S905L3机顶盒线刷记录
  10. 国债期货合约代码是什么字母