python-python基础2
本章内容:
1、列表、元组
2、字典
3、集合
4、文件操作
5、字符编码与转码
一、列表、元组操作
列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作
names=["zhangzhihao","jehu","xiaodu","jjj","aaa"] print(names[1]) #从第2个取到第4个,但不包括第4个 print(names[1:3]) #切片,顾头不顾尾 print(names[0:3]) #取倒数第二个值 print(names[-2]) #取最后两个值 print(names[-2:])
执行结果:
jehu ['jehu', 'xiaodu'] ['zhangzhihao', 'jehu', 'xiaodu'] jjj ['jjj', 'aaa']
追加
names=["zhangzhihao","jehu","xiaodu","jjj","aaa"] names.append("www") print(names)
执行结果:
['zhangzhihao', 'jehu', 'xiaodu', 'jjj', 'aaa', 'www']
插入
names=["zhangzhihao","jehu","xiaodu","jjj","aaa"] names.insert(1,"rrr") print(names)
执行结果:
['zhangzhihao', 'rrr', 'jehu', 'xiaodu', 'jjj', 'aaa']
修改
names=["zhangzhihao","jehu","xiaodu","jjj","aaa"] names[0]="zhangzz" print(names)
执行结果:
['zhangzz', 'jehu', 'xiaodu', 'jjj', 'aaa']
删除
方法一:
names=["zhangzhihao","jehu","xiaodu","jjj","aaa"] names.remove("aaa") print(names)
执行结果:
['zhangzhihao', 'jehu', 'xiaodu', 'jjj']
方法二:
names=["zhangzhihao","jehu","xiaodu","jjj","aaa"] del names[3] print(names)
执行结果:
['zhangzhihao', 'jehu', 'xiaodu', 'aaa']
方法三:
#删掉jjj names=["zhangzhihao","jehu","xiaodu","jjj","aaa"] names.pop(3) print(names)
查找某个字符串在列表中的哪个位置
names=["zhangzhihao","jehu","xiaodu","jjj","aaa"] print(names.index("xiaodu"))
统计列表中字符串的数量
names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"] print(names.count("jjj"))
清空列表
names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"] names.clear() print(names)
翻转列表
names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"] names.reverse() print(names)
执行结果:
['jjj', 'aaa', 'jjj', 'xiaodu', 'jehu', 'zhangzhihao']
排序
names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"] names.sort() print(names)
执行结果:
['aaa', 'jehu', 'jjj', 'jjj', 'xiaodu', 'zhangzhihao']
合并列表
names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"] names2=["1","2","3","4","5"] print(names) names.extend(names2) print(names)
执行结果:
['zhangzhihao', 'jehu', 'xiaodu', 'jjj', 'aaa', 'jjj']
['zhangzhihao', 'jehu', 'xiaodu', 'jjj', 'aaa', 'jjj', '1', '2', '3', '4', '5']
复制
copy 浅复制
names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"] names2=names.copy() print(names) print(names2)
number=["1","2","3",["a","b","c"],"4","5"] number2=number.copy() number[2]="666" print(number) print(number2) number[3][0]="A" print(number) print(number2)
执行结果:
['1', '2', '666', ['a', 'b', 'c'], '4', '5']
['1', '2', '3', ['a', 'b', 'c'], '4', '5']
['1', '2', '666', ['A', 'b', 'c'], '4', '5']
['1', '2', '3', ['A', 'b', 'c'], '4', '5']
把number复制到number2,修改number中的元素本不应该影响number2,但是如果number中还有一层列表,修改number会影响number2
深复制
import copy number=["1","2","3",["a","b","c"],"4","5"] number2=copy.deepcopy(number) number[2]="666" number[3][0]="A" print(number) print(number2)
元组
元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表
语法:names = ("alex","jack","eric")
它只有2个方法,一个是count,一个是index,完毕。
练习:
程序:购物车程序
需求:
- 启动程序后,让用户输入工资,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
salary=input("Please input your salary:") commodities=[["Iphone",5800],["Milk",30],["apple",15],["coffee",20],["chicken",25], ["pork",32],["juice",8],["router",700]] brougth_com=[] if salary.isdigit(): salary=int(salary) while True: for index,i in enumerate(commodities): print(index,i) com_chose = input("The item number you want to buy:") if com_chose.isdigit(): com_chose=int(com_chose) if com_chose<len(commodities) and com_chose>=0: price=commodities[com_chose][1] if salary>=price: salary=salary-price brougth_com.append(commodities[com_chose]) print("Have added {0} to the shopping cart and your current balance is \033[31;1m{1}\033[0m".format(commodities[com_chose][0],salary)) else: print("Your balance is short, only {0} left.".format(salary)) else: print("Over the goods number range.") elif com_chose=="q": print("------shopping list-------") for j in brougth_com: print(j) print("Your balance is {0}.".format(salary)) exit() else: print("invalid option.") else: print("invalid option.")
二、字典
字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。
字典的特性:
- dict是无序的
- key必须是唯一的,so 天生去重
语法:
info = { '1': "zhangzhihao", '2': "liuxiaodu", '3': "jehu", }
增加
info["4"]="aaa" print(info)
执行结果:
{'1': 'zhangzhihao', '2': 'liuxiaodu', '3': 'jehu', '4': 'aaa'}
修改
info["1"]="zhangzz" print(info)
执行结果:
{'1': 'zhangzz', '2': 'liuxiaodu', '3': 'jehu'}
删除
方法一:
info.pop("2") print(info)
执行结果:
{'1': 'zhangzhihao', '3': 'jehu'}
方法二:
del info["2"] print(info)
执行结果:
{'1': 'zhangzhihao', '3': 'jehu'}
查找
b=info.get("2") print(b) a=info["2"] print(a)
执行结果:
liuxiaodu
liuxiaodu
如果一个key不存在,就报错,get不会,不存在只返回None
多级字典嵌套及操作
city={ "广东":{ "广州":["越秀","天河","荔湾","白云"], "深圳":["南山","罗湖","福田","宝安"], "茂名":["茂南","茂港","电白","高州"]}, "浙江":{ "杭州":["西湖","萧山","余杭"], "温州":["鹿城","龙湾","瓯海"], "嘉兴":["南湖","秀洲","平湖"]}, "上海":{ "黄埔":["南京路","外滩","豫园"], "徐汇":["湖南路","天平路","枫林路"], "长宁":["华阳路","新华路","江苏路"] } } print(city) print(city["广东"]) print(city["广东"]["深圳"])
执行结果:
{'广东': {'广州': ['越秀', '天河', '荔湾', '白云'], '深圳': ['南山', '罗湖', '福田', '宝安'], '茂名': ['茂南', '茂港', '电白', '高州']}, '浙江': {'杭州': ['西湖', '萧山', '余杭'], '温州': ['鹿城', '龙湾', '瓯海'], '嘉兴': ['南湖', '秀洲', '平湖']}, '上海': {'黄埔': ['南京路', '外滩', '豫园'], '徐汇': ['湖南路', '天平路', '枫林路'], '长宁': ['华阳路', '新华路', '江苏路']}}
{'广州': ['越秀', '天河', '荔湾', '白云'], '深圳': ['南山', '罗湖', '福田', '宝安'], '茂名': ['茂南', '茂港', '电白', '高州']}
['南山', '罗湖', '福田', '宝安']
循环查字典
#方法1 for key in info: print(key,info[key]) #方法2 for k,v in info.items(): #会先把dict转成list,数据里大时莫用 print(k,v)
三、集合
集合是一个无序的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集等关系
list_1=[3,1,4,5,6,5,3,9,8] list_1=set(list_1) print(list_1,type(list_1))
执行结果:
{1, 3, 4, 5, 6, 8, 9} <class 'set'>
语法:
s = set([3,5,9,10]) #创建一个数值集合 t = set("Hello") #创建一个唯一字符的集合 a = t | s # t 和 s的并集 b = t & s # t 和 s的交集 c = t – s # 求差集(项在t中,但不在s中) d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中) 基本操作: t.add('x') # 添加一项 s.update([10,37,42]) # 在s中添加多项 使用remove()可以删除一项: t.remove('H') len(s) set 的长度 x in s 测试 x 是否是 s 的成员 x not in s 测试 x 是否不是 s 的成员 s.issubset(t) s <= t 测试是否 s 中的每一个元素都在 t 中 s.issuperset(t) s >= t 测试是否 t 中的每一个元素都在 s 中 s.union(t) s | t 返回一个新的 set 包含 s 和 t 中的每一个元素 s.intersection(t) s & t 返回一个新的 set 包含 s 和 t 中的公共元素 s.difference(t) s - t 返回一个新的 set 包含 s 中有但是 t 中没有的元素 s.symmetric_difference(t) s ^ t 返回一个新的 set 包含 s 和 t 中不重复的元素 s.copy() 返回 set “s”的一个浅复制
四、文件操作
对文件操作流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
读一个名为“yesterday”的文件
#只读 f=open('yesterday','r',encoding="utf-8") data=f.read() print(data) f.close() #只写 f2=open('yesterday2','w',encoding="utf-8") f2.write("When i was young,I loved you.But I like this.....") f2.close() #追加 f3=open('yesterday3','a',encoding="utf-8") #a:append追加 f3.write("When i was young,I loved you.\nyeah!!!") f3.close()
打开文件的模式有:
- r,只读模式(默认)。
- w,只写模式。【不可读;不存在则创建;存在则覆盖内容;】
- a,追加模式。【不可读; 不存在则创建;存在则只追加内容;】
打印第一行:
f=open('yesterday','r',encoding="utf-8") data=f.readline() print(data) f.close()
打印前五行:
f=open('yesterday','r',encoding="utf-8") for i in range(5): print(f.readline().strip()) f.close()
打印所有行:
f=open('yesterday','r',encoding="utf-8") for i in f.readlines(): print(i.strip()) f.close()
不打印第十行:
方法一:(不推荐,效率低,用readlines是一次性将文件读到内存)
f=open('yesterday','r',encoding="utf-8") for index,i in enumerate(f.readlines()): if index==9: print("--------------") continue print(i.strip()) f.close()
方法二:(推荐,一行一行读进内存)
f=open('yesterday','r',encoding="utf-8") count=0 for i in f: if count==9: print("-----------") count+=1 continue print(i.strip()) count+=1 f.close()
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读;可写;可追加】
- w+,写读
- a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
- ab
文件修改示例:
f=open("yesterday","r",encoding="utf-8") f_new=open("yesterday2","w",encoding="utf-8") for line in f: if "生命的滋味是甜的" in line: line=line.replace("生命的滋味是甜的","生命的滋味是咸的") f_new.write(line) f.close() f_new.close()
with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open("yesterday","r",encoding="utf-8") as f: for line in f: print(line.strip())
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
with open('log1') as obj1, open('log2') as obj2: pass
文件操作作业练习:
修改haproxy配置文件
haproxy配置文件:
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
原配置文件
需求:
1、查
输入:www.oldboy.org
获取当前backend下的所有记录
2、新建
输入:
arg = {'backend': 'www.oldboy.org','record':{'server': '100.1.7.9','weight': 20,'maxconn': 30}}
3、删除
输入:
arg = {'backend': 'www.oldboy.org','record':{'server': '100.1.7.9','weight': 20,'maxconn': 30}}
需求
代码:
print("1.search\n2.add\n3.delete") chose=input("你要选择哪项操作?") if chose=="1": find=input("你要查询哪个?") find="backend "+find+"\n" with open("haproxy", "r") as f: for line in f: if find == line: print(line.strip()) print(next(f).strip()) #方法二:print(f.readline().strip()) elif chose=="2": add=input("你要新增什么字段?") add=eval(add) #eval把字符串转化为字典格式 with open("haproxy","a") as f: f.write("\nbackend {0}\n".format(add["backend"])) f.write("\tserver {0} weight {1} maxconn {2}".format(add['record']['server'],add['record']['weight'],add['record']['maxconn'])) print("新增完成") elif chose=="3": delete=input("想要删除的字段:") delete=eval(delete) delete_backend=delete['backend'] delete_server=delete['record']['server'] delete_weight=delete['record']['weight'] delete_maxconn=delete['record']['maxconn'] delete_line=[] with open("haproxy","r") as f: haproxy_line=f.readlines() f.seek(0) for index,line in enumerate(f): if "backend "+delete_backend+"\n" == line: delete_line.append(index) delete_line.append(index+1) count = 0 with open("haproxy","w") as ff: for line in haproxy_line: if count not in delete_line: ff.write(line) count+=1 print("删除完成") else: print("输入错误")
五、字符编码与转码
需知:
1.在python2默认编码是ASCII, python3里默认是unicode
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

上图仅适用于py2
#-*-coding:gb2312 -*- #这个也可以去掉 __author__ = 'Alex Li' import sys print(sys.getdefaultencoding()) msg = "我爱北京天安门" #msg_gb2312 = msg.decode("utf-8").encode("gb2312") msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔 gb2312_to_unicode = msg_gb2312.decode("gb2312") gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8") print(msg) print(msg_gb2312) print(gb2312_to_unicode) print(gb2312_to_utf8) in python3

浙公网安备 33010602011771号