首页 > 代码库 > Day03
Day03
集合
是一个无序不重复元素集,基本功能包括关系测试和消除重复元素. 集合对象还支持并、交、差、对称差等。
list_1 = [1,2,6,4,8,7,8]
list_2 = [5,7,8,3,4]
s1 = set(list_1)
s2 = set(list_2)
print(s1)
{1, 2, 4, 6, 7, 8}
将列表转成集合,并去重
集合运算操作
数学含义 | Python方法 | 运算符 | 含义 |
---|---|---|---|
交集 | interesting() | & | 筛选出两集合相同的部分 |
并集 | union() | | | 两集合合并,相同部分只显示一次 |
差集 | difference() | - | 筛出一个集合里另一个集合中没有的数据 |
对称差集 | difference() | ^ | 删除重复数据后合并集合 |
—— | ———— | != | 不等于 |
—— | ———— | == | 等于 |
—— | ———— | in | 子集判断 |
len() 统计长度
交
s1.interesting(s2) 筛选出两集合相同的部分 等同 s1 & s2
并
s1.union(s2) 两集合合并,相同部分只显示一次 等同 s1 | s2
差
s1.difference(s2) 筛出集合1里集合2没有的数据 等同 s1 - s2
对称差
s1.symmetric_difference(s2) 删除重复数据后合并集合 等同 s1 ^ s2
文件操作
import os
os.path.exists("filename") 判断文件是否存在,返回布尔值
f = open("file_name.txt","w",encoding="utf-8")
以写入的方式将文件内容赋值给变量f (慎用写入模式,会覆盖已有的文件内容)
f = open("file_name.txt","a",encoding="utf-8")
f.write("新增内容")
文本追加模式,在文件里新增内容,不覆盖已有文件的内容
with open("file", "r",encoding="utf-8") as f, open("file_bak", "w",encoding="utf-8") as f_new :
for line in f:
line = line.replace("a","b")
f_new.writ(line)
同时打开两个文件,将a替换成b,写入新文件
f = open("file_name.txt","r",encoding="utf-8")
只读文本模式打开文件
*注:文本只能以一种模式打开,不能同时多种模式操作,既读的时候不能写,写的时候不能读
count = 0
for lin in f :
if count == 4:
print("跳过第5行")
count += 1
continue
print(lin.rstrip()) #去除末端空格避免换行打印
count += 1
按行读取文件,通过count函数记录行数,尽量避免使用readline(),readline()是一次性将文件内容读取,大文件时效率低,且内存可能不足
print(f.readline())
print(f.tell()) #显示指针位置
f.seek(0) #指针移动到0号下标位置
print(f.readline()) #从0号下标开始读取文件(既重头开始读取文件)
flush() 立即刷新
进度条案例:
import sys,time
for i in range(50):
sys.stdout.write("#")
sys.stdout.flush()
time.sleep(0.1)
每隔0.1秒打印#,立即刷新显示(若无flush,则一次性显示50个#)
f.truncate(10) 剪切文本前10个字符(只能从头开始截取,不根据指针位置为起始点)
r+ 读写模式,只能在文本末尾追加内容
w+ 写读模式
字符编码
import sys
print(sys.getdefaultencoding())
显示默认编码
import chardet
chardet.detect()
显示字符当前编码。(chardet不是内建库需要下载安装.chardet可以直接用detect函数来检测所给字符的编码。函数返回值为字典,有2个元数,一个是检测的可信度,另外一个就是检测到的编码。 )
转码原则
字符编码发展简介:
ANSI-- (GB2312--GBK)-统称DBCS--UNICODE--UTF-8-其它国家编码
先以字符当前编码格式解码成Unicode编码,再以想要的编码格式进行编码
例子:
a = “你好”
当前系统默认编码为utf-8,假设a的编码为gbk,将a的编码转换成utf-8
b = a.decode("gbk").encode("utf-8")
函数
函数是带名字的、可实现某种功能的一段代码
函数用途
当要重复使用函数代码里的功能时,直接调用函数名即可,方便快捷。更改函数里的代码时,调用函数的地方自动跟着改变,方便修改程序。
形参、实参
形参:函数里定义程序时用到的变量、列表、元组、字典等的名字
实参:调用函数时给函数里变量传递的值
既:形参是变量名,实参是变量值
用def定义函数
例:
def describe_pet(animal_type, pet_name):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type+ "‘s name is "+ pet_name.title()+ ".")
describe_pet(‘harry‘, ‘hamster‘)
注:函数有多个形参时,实参的顺序默认跟形参一致。可通过关键字实参的方式绑定形参实参,避免顺序上引起的错误。
例:
describe_pet(‘harry‘,‘dog’) 位置参数调用。默认按顺序赋值,harry赋值给animal_type,dog赋值给pet_name,显然不符合程序本意。
describe_pet(pet_name=‘harry‘,animal_type=‘dog’) 关键字参数调用。指定形参对应的实参,避免位置引发的错误。
位置参数跟关键字参数混用时,位置参数一定要放在关键字参数前,优先按位置参数传值,后按关键字参数传值
例:
def test(x,y,z,k):
print(x,y,z,k)
test(3,k=4,y=2,z=1) 正确
test(3,k=4,y=2,x=1) 错误,x被重复传值
test(z=3,k=4,y=2,1) 错误,位置参数被放置关键字之后
返回值 return
方便程序调用函数的结果,根据结果执行下一步操作。
例:
def get_formatted_name(first_name, last_name):
"""返回整洁的姓名"""
full_name = first_name + ‘ ‘ + last_name
return full_name.title()
musician = get_formatted_name(‘jimi‘, ‘hendrix‘)
print(musician)
函数传递列表
例:
def greet_users(names):
"""向列表中的每位用户都发出简单的问候"""
for name in names:
msg = "Hello, " + name.title() + "!"
print(msg)
usernames = [‘hannah‘, ‘ty‘, ‘margot‘]
greet_users(usernames)
def name(*list):
.........
name(1,2,3,.......)
不固定实参数量表示法,实参以元组的形式传值给形参list
函数传递字典
def name(x,**list):
......
name(a,sd="n",hh="h",dd="n",zh="h"......)
不固定数量字典传值表示法
全局变量,局部变量
(pycharm快捷键:ctrl+? 批量注释选中的行)
全局变量:在程序头部,对整个程序都生效。全局变量的值可直接在局部变量中使用。
局部变量:只在函数中有效,局部有效。
注意:如果全局变量是列表、字典、集合时,在函数中可直接修改全局变量的值。如果全局变量是字符、整数、元组时,函数中无法直接修改全局变量值。
在函数中使用 “global 变量名” 可强制在函数中修改字符、整数型全局变量值。
禁止在函数中生成一个新的全局变量,因函数经常被多次调用,故障时无从查找故障点。
递归
函数中调用自己的函数称为递归函数,使用return返回值调用
注:递归最大层数999层次,防止死循环,程序奔溃
函数特性:
1、递归函数必须有个明确的结束条件
2、每次进入深一层递归时,问题规模相比上次递归都应减少
3、递归效率不高,递归层次过多会导致栈溢出
例:
def cal(n):
print (n)
if int(n/3) > 0:
return cal( int(n/2) )
print("end",n)
cal(20)
高阶函数
一个函数可以接受另外一个函数作为参数,这种函数称为高阶函数
例:
def add(x,y,f):
return f(x) + f(y)
res = add(3,-6,abs) #abs为绝对值函数,作为f的参数
print(res)
作业三:HAproxy配置文件操作
程序说明:
1、显示程序功能列表,用户输入选择
2、用户输入编号
3、判断用户输入,输入“q”退出程序
4、输入“1”,新增用户输入的信息
5、输入“2”,删除用户输入的信息
6、输入“3”,更改用户输入的对应信息
7、输入“4”,查询用户输入的对应信息
流程图:
程序:
def f_to_d_del(file_name,del_if) :
with open("file", "r", encoding="utf-8") as f, open("file_bak", "w", encoding="utf-8") as f_new:
for line in f:
f_new.write(line)
dic = {}
with open(file_name) as f:
for i in f:
if i[0] not in [‘ ‘, ‘\t‘]:
dic[i] = []
lst = dic[i]
else:
lst.append(i)
with open(file_name, "w") as f1:
coun = 0
for k in dic:
if del_if in k:
k_key = k
coun = 1
if coun == 1:
dic.pop(k_key)
for k1 in dic:
f1.write(k1)
for v1 in dic[k1]:
f1.write(v1)
f1.flush()
while True :
choose = input ("\n程序功能列表:"
"\n1、增加配置\n2、删除配置\n3、更改配置\n4、查询配置"
"\n\033[33;1m请选择需要的操作的编号:\033[0m")
if choose in ["1","3"] :
backend = input("backend name:")
server1 = input("server1:")
server2 = input("server2:")
weight = input("weight:")
maxconn = input("maxconn:")
f_to_d_del("file",backend)
with open("file","a") as f1 :
f1.write("backend %s\n\t\tserber %s %s weight %s maxconn %s" % (backend, server1, server2, weight, maxconn))
continue
if choose == "2" :
backend_del = input("\n请输入要删除的backend域名:")
f_to_d_del("file",backend_del)
continue
if choose == "4":
backend_find = input("\n请输入要查询的backend域名:")
dic = {}
with open("file", "r", encoding="utf-8") as f4:
for i in f4:
if i[0] not in [‘ ‘, ‘\t‘]:
dic[i] = []
lst = dic[i]
else:
lst.append(i)
for i in dic:
if i.startswith(‘backend‘) and backend_find in i :
for j in dic[i]:
print(j, end=‘‘)
continue
elif choose.lower() == "q" :
break
else:
print("\033[41;1m无此功能编号,请重新输入\033[0m")
程序操作文件样本:
global
log 127.0.0.1 local2
daemon
maxconn 256
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 :8888
stats enable
stats uri /admin
stats auth admin:1234
frontend oldboy.org
bind 0.0.0.0:80
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 20 maxconn 3000
server 100.1.7.10 100.1.7.9 weight 20 maxconn 3000
backend www.yangboy.org
server 100.1.7.11 100.1.7.9 weight 20 maxconn 3000
server 100.1.7.12 100.1.7.9 weight 20 maxconn 3000
backend www.newboy.org
server 100.1.7.13 100.1.7.9 weight 20 maxconn 3000
server 100.1.7.14 100.1.7.9 weight 20 maxconn 3000
Day03