python学习笔记第二天
- 列表、元组操作
- 字符串操作
- 字典操作
- 集合操作
- 文件操作
- 作业
(ps:昨天写的竟然没保存。。。。想哭哭,所以今天写的内容的代码演示部分为了节约时间就直接复制别人的了)
一、列表、元组操作
1.1、列表操作
列表初始化:
names = ['Alex',"Tenglan",'Eric']
列表的切片:(左闭右开,前小后大)
>>> names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] >>> names[1:4] #取下标1至下标4之间的数字,包括1,不包括4 ['Tenglan', 'Eric', 'Rain'] >>> names[1:-1] #取下标1至-1的值,不包括-1 ['Tenglan', 'Eric', 'Rain', 'Tom'] >>> names[0:3] ['Alex', 'Tenglan', 'Eric'] >>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样 ['Alex', 'Tenglan', 'Eric'] >>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写 ['Rain', 'Tom', 'Amy'] >>> names[3:-1] #这样-1就不会被包含了 ['Rain', 'Tom'] >>> names[0::2] #后面的2是代表,每隔一个元素,就取一个 ['Alex', 'Eric', 'Tom'] >>> names[::2] #和上句效果一样 ['Alex', 'Eric', 'Tom']
列表的增(追加+插入):
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy']
>>> names.append("我是新来的")
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.insert(2,"强行从Eric前面插入")
>>> names
['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
列表的删(pop,del,remove):
>>> del names[2]
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
>>> del names[4]
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>>
>>> names.remove("Eric") #删除指定元素
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.pop() #删除列表最后一个值
'我是新来的'
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy']
列表的改:
>>> names ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的'] >>> names[2] = "该换人了" >>> names ['Alex', 'Tenglan', '该换人了', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
列表的查:(for in..,index)
>>> names
['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1']
>>> names.index("Amy")
2 #只返回找到的第一个下标
列表的扩展:
>>> names ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy'] >>> b = [1,2,3] >>> names.extend(b) >>> names ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
列表的统计:
>>> names
['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
>>> names.count("Amy")
2
列表的copy(浅复制+深复制):
暂无
1.2、元组操作
元组和列表差不多,但是不允许被修改,用()表示
names = ("alex","jack","eric")
元组不可修改,所以只有count和index两种方法
二、字符串操作
注意:无论是什么方法,都不会修改字符串本身的
字符串的常用操作:
name.capitalize() 首字母大写
name.casefold() 大写全部变小写
name.center(50,"-") 输出 '---------------------Alex Li----------------------'
name.count('lex') 统计 lex出现次数
name.encode() 将字符串编码成bytes格式
name.endswith("Li") 判断字符串是否以 Li结尾
"Alex\tLi".expandtabs(10) 输出'Alex Li', 将\t转换成多长的空格
name.find('A') 查找A,找到返回其索引, 找不到返回-1
format :
>>> msg = "my name is {}, and age is {}"
>>> msg.format("alex",22)
'my name is alex, and age is 22'
>>> msg = "my name is {1}, and age is {0}"
>>> msg.format("alex",22)
'my name is 22, and age is alex'
>>> msg = "my name is {name}, and age is {age}"
>>> msg.format(age=22,name="ale")
'my name is ale, and age is 22'
format_map
>>> msg.format_map({'name':'alex','age':22})
'my name is alex, and age is 22'
msg.index('a') 返回a所在字符串的索引
'9aA'.isalnum() True
'9'.isdigit() 是否整数
name.isnumeric
name.isprintable
name.isspace
name.istitle
name.isupper
"|".join(['alex','jack','rain'])
'alex|jack|rain'
三、字典操作
字典的定义:
info = {
'stu1101': "TengLan Wu",
'stu1102': "LongZe Luola",
'stu1103': "XiaoZe Maliya",
}
字典的特点:
- 无序
- key必须唯一
字典的增:
>>> info["stu1104"] = "苍井空"
>>> info
{'stu1102': 'LongZe Luola', 'stu1104': '苍井空', 'stu1103': 'XiaoZe Maliya', 'stu1101': 'TengLan Wu'}
字典的删:pop,del
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1101': '武藤兰'}
>>> info.pop("stu1101") #标准删除姿势
'武藤兰'
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
>>> del info['stu1103'] #换个姿势删除
>>> info
{'stu1102': 'LongZe Luola'}
字典的改:
>>> info['stu1101'] = "武藤兰"
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1101': '武藤兰'}
字典的查:
>>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
>>>
>>> "stu1102" in info #标准用法
True
>>> info.get("stu1102") #获取
'LongZe Luola'
>>> info["stu1102"] #同上,但是看下面
'LongZe Luola'
>>> info["stu1105"] #如果一个key不存在,就报错,get不会,不存在只返回None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'stu1105'
字典的循环:
#方法1
for key in info:
print(key,info[key])
#方法2
for k,v in info.items(): #会先把dict转成list,数据里大时莫用
print(k,v)
四、集合操作
集合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”的一个浅复制
五、文件操作
文件的基本操作流程:
- 打开文件,得到文件句柄并赋值给一个变量
- 通过对文件句柄进行操作
- 关闭文件
基本操作:
f = open('lyrics') #打开文件
first_line = f.readline()
print('first line:',first_line) #读一行
print('我是分隔线'.center(50,'-'))
data = f.read()# 读取剩下的所有内容,文件大时不要用
print(data) #打印文件
f.close() #关闭文件
readline()是读取一行,read()是读取所有
文件的打开模式:
- r,只读模式
- w,只写模式(不可读!!!!!注意这种模式下,如果本来已经有同名的文件,会新创建一个文件覆盖原有文件,导致原有文件清空)
- a,追加模式(不可读!!和w相比,就是会直接在原有的同名文件里面追加内容)
- r+(可读写)
- w+(可写读,但是先打开文件的时候仍然存在上述问题)
- a+(a)
六、作业
- 三级菜单的实现
- 购物车的优化
- 实现简单的shell sed替换功能
- 修改haproxy配置文件
三级菜单的实现:
#弱智版本
data={
'mainlevel1':{
'1-secondleve11':{
'1-third1':['1-1-1','1-1-2','1-1-3'],
'1-third2':['1-2-1','1-2-2','1-2-3']
},
'1-secondlevel2':{
'2-third1':['2-1-1','2-1-2','2-1-3'],
'2-third2':['2-2-1','2-2-2','2-2-3']
},
'1-secondlevel3':{
'3-third1':['3-1-1'],
'3-third2':['3-2-1']
}
},
'mainlevel2':{
'2-secondlevel1':{},
'2-secondlevel2':{},
'2-secondlevel3':{}
},
'mainlevel3':{
'3-secondlevel1':{},
'3-secondlevel2':{},
'3-secondlevel3':{}
}
}
#搞清楚data[mainlevel1],data[mainlevel1][1-secondleve11],data[][][]分别输出的时什么。。。数据关系
print(data['mainlevel1'])
print(data['mainlevel1']['1-secondleve11'])
print(data['mainlevel1']['1-secondleve11']['1-third1'])
flag=True
while flag:
for main in data:#一级菜单
print(main)
choicemain=input('选择进入一级菜单>>:')
#print(data[choicemain])
#错误写法 if choicemain in main,根本没有main这个变量呀,main只是在上面循环的时候用作循环变量
if choicemain in data:
while flag:
for second in data[choicemain]:
print("\t",second)
choicesecond=input('选择进入二级菜单>>:')
# if choicesecond in data[choicemain][choicesecond]:
if choicesecond in data[choicemain]:
# print('test')
while flag:
for third in data[choicemain][choicesecond]:
print('\t',third)
choicethird=input('选择三级菜单>>:')
if choicethird in data[choicemain][choicesecond]:
for item in data[choicemain][choicesecond][choicethird]:
print(item)
choiceend=input('最后一层,按b返回,按退出')
if choiceend=='b':
pass
elif choiceend=='q':
flag=True
if choicethird=='b':
break
elif choicethird=='q':
flag=True
if choicesecond=='b':
break
elif choicesecond=='q':
flag=True
#改进版本
以下主要是通过迭代修改current_menu,然后不断执行for key in current_menu:print(key)
返回上一层的做法是首先定义一个数组,用来存储每一次的current_menu,然后返回的时候就把数组中最后一个menu pop出,就是上一层的菜单。
#Author:Yueru Sun
#弱智版本
#!/usr/bin/env python
#-*- coding:utf-8 -*-
dic = {
'北京': {
'东城':
{
'沙河': ['沙河机场', '链家'],
'天通苑': ['北方明珠', '天通尾货']
},
'朝阳':
{
'花家地': ['朝阳公园', '望京soho'],
'北小河': ['北小河公园', '北京中学']
}
},
'上海': {
'虹桥':
{
'虹桥机场': ['超市', '特产店', '水吧'],
'东方明珠': ['电影院', '游泳馆', '餐馆']
},
'浦东':
{
'景秀路': ['世纪公园', '立交桥'],
'中环路': ['鲁迅公园', '同济大学']
}
},
'河北': {
'石家庄':
{
'行唐': ['东正', '阳关'],
'赵县': ['赵州桥', '高村乡']
},
'唐山':
{
'滦南县': ['司各庄镇', '安各庄镇'],
'玉田县': ['玉田镇', '亮甲店镇']
}
}
}
def multimenu():
current_menu=dic
parent_lists=[]
flag=False
while not flag:
for key in current_menu:
print(key)
choose=input('请选择,返回上一次输入b,退出菜单输入q:').strip()
if choose in current_menu:
parent_lists.append(current_menu)#将当前的菜单存入列表,用于后面的返回上一级菜单用
current_menu=current_menu[choose]#迭代改变当前的菜单
elif choose=='b':
if parent_lists:
current_menu=parent_lists.pop()
elif choose=='q':
flag=True
else:
print('输入有误')
multimenu()
购物车:
good_list=[['Iphone',5800],['Mac Pro',9800],['Bike',1000],['Watch',10000],['Coffee',31]]
buy_list=[]
Salary=int(input('请输入您的预算:'))
while True:
print('商品信息'.center(50,'*'))
for item in enumerate(good_list):
print(str(item[0]).center(10, " "), str(item[1][0]).ljust(31, " "), str(item[1][1]).ljust(10, " "))
choose=input('请输入您的选择:')
if choose.isdigit():
choose=int(choose)
if choose>=0 and choose<len(good_list):
if Salary<good_list[choose][1]:
print("余额不足")
else:
Salary-=good_list[choose][1]
buy_list.append(good_list[choose][0])
print('成功购买%s,还剩余额%s'%(good_list[choose][0],good_list[choose][1]))
else:
print('没有该商品')
elif choose=='q':
break
else:
print('输入有误')
print('余额还有%d'%Salary)
print('已经购买的商品有:')
for item in enumerate(buy_list):
print(str(item[0]).center(10, " "), str(item[1][0]).ljust(31, " "), str(item[1][1]).ljust(10, " "))
实现简单的shell sed替换功能
#Author:Yueru Sun
import sys,os
old=sys.argv[1]
new=sys.argv[2]
file_path=sys.argv[3]
f=open(file_path,"r")
f1=open("temp_file",'r+')#
for i in f:
if old in i:
i=i.replace(old,new)
f1.write(i)
f1.flush()
f.close()
f1.close()
os.remove()
os.rename("temp_file",file_path)
浙公网安备 33010602011771号