本章内容:

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=["","","","",""]
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=["","","",["a","b","c"],"",""]
number2=number.copy()
number[2]=""
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=["","","",["a","b","c"],"",""]
number2=copy.deepcopy(number)
number[2]=""
number[3][0]="A"
print(number)
print(number2)

元组

元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表

语法:names = ("alex","jack","eric")

它只有2个方法,一个是count,一个是index,完毕。

练习:

程序:购物车程序

需求:

  1. 启动程序后,让用户输入工资,然后打印商品列表
  2. 允许用户根据商品编号购买商品
  3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
  4. 可随时退出,退出时,打印已购买商品和余额
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 = {
'': "zhangzhihao",
'': "liuxiaodu",
'': "jehu",
}

增加

info[""]="aaa"
print(info)

执行结果:

{'1': 'zhangzhihao', '2': 'liuxiaodu', '3': 'jehu', '4': 'aaa'}

修改

info[""]="zhangzz"
print(info)

执行结果:

{'1': 'zhangzz', '2': 'liuxiaodu', '3': 'jehu'}

删除

方法一:

info.pop("")
print(info)

执行结果:

{'1': 'zhangzhihao', '3': 'jehu'}

方法二:

del info[""]
print(info)

执行结果:

{'1': 'zhangzhihao', '3': 'jehu'}

查找

b=info.get("")
print(b)
a=info[""]
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”的一个浅复制

四、文件操作

对文件操作流程

  1. 打开文件,得到文件句柄并赋值给一个变量
  2. 通过句柄对文件进行操作
  3. 关闭文件

读一个名为“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=="":
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=="":
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=="":
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

python-python基础2的更多相关文章

  1. Python文件基础

    ===========Python文件基础========= 写,先写在了IO buffer了,所以要及时保存 关闭.关闭会自动保存. file.close() 读取全部文件内容用read,读取一行用 ...

  2. 3.Python编程语言基础技术框架

    3.Python编程语言基础技术框架 3.1查看数据项数据类型 type(name) 3.2查看数据项数据id id(name) 3.3对象引用 备注Python将所有数据存为内存对象 Python中 ...

  3. Python爬虫基础

    前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...

  4. 小白必看Python视频基础教程

    Python的排名从去年开始就借助人工智能持续上升,现在它已经成为了第一名.Python的火热,也带动了工程师们的就业热.可能你也想通过学习加入这个炙手可热的行业,可以看看Python视频基础教程,小 ...

  5. Python爬虫基础之requests

    一.随时随地爬取一个网页下来 怎么爬取网页?对网站开发了解的都知道,浏览器访问Url向服务器发送请求,服务器响应浏览器请求并返回一堆HTML信息,其中包括html标签,css样式,js脚本等.我们之前 ...

  6. 零基础学Python--------第2章 Python语言基础

    第2章  Python语言基础 2.1 Python语法特点 2.11注释 在Python中,通常包括3种类型的注释,分别是单行注释.多行注释和中文编码声明注释. 1.单行注释 在Python中,使用 ...

  7. Python学习基础笔记(全)

    换博客了,还是csdn好一些. Python学习基础笔记 1.Python学习-linux下Python3的安装 2.Python学习-数据类型.运算符.条件语句 3.Python学习-循环语句 4. ...

  8. Python数据分析基础教程

    Python数据分析基础教程(第2版)(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1_FsReTBCaL_PzKhM0o6l0g 提取码:nkhw 复制这段内容后 ...

  9. Python数据分析基础PDF

    Python数据分析基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1ImzS7Sy8TLlTshxcB8RhdA 提取码:6xeu 复制这段内容后打开百度网盘手 ...

  10. Python的基础语法(一)

    0. 前言 最近正在重新整理Python的基础知识,以便更好地学习新知识.这一部分主要是讲述Python基础语法的演示.下面的语法都是基于Python3的语法. 1. 注释 注释:Python的注释方 ...

随机推荐

  1. C/S的接口测试工具

    Postman概述: Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果,从而验证响 ...

  2. [原]用SQL比较两张结构完全相同的表数据

    前几天面试遇到一个比较有意思的问题,就是有两张结构完全相同的表A和B,但是这两张表属于不同的业务流程,经过一段时间后发现两张表的数据不能完全匹配,有可能A比B多,也可能B比A多,或者两种可能同时存在, ...

  3. #P2010 回文日期 的题解

    题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日期.显然:一个日期只有 ...

  4. 实验一&#160;&#160;GIT 代码版本管理

    实验一  GIT 代码版本管理 实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2)   熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git ...

  5. ssh pubkey免密登陆远程主机

    二.公钥登录 每次登录远程主机都需要输入密码是很不方便的,如果想要省去这一步骤,可以利用密钥对进行连接,还可以提高安全性. 1.在本机生成密钥对 使用ssh-keygen命令生成密钥对: ssh-ke ...

  6. state thread api 查询

    state thread api 查询: http://state-threads.sourceforge.net/docs/reference.html

  7. 20199317 myod实验

    myod实验 实验内容: 1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 3 main与其他分开,制作静态库和动态库 4 编写Mak ...

  8. Python实现图片识别加翻译【高薪必学】

    Python使用百度AI接口实现图片识别加翻译 另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个Python交流.裙 :一久武其而而流一思(数字 ...

  9. Flask - 底层原理和基本流程

    一. flask依赖wsgi,实现wsgi的模块:wsgiref(django),werkzeug(flask),uwsgi 1. werkzeug示例 from werkzeug.wrappers ...

  10. [网络转载 ]LoadRunner技巧之THML与URL两种录制模式分析

    loadrunner自带网站的访问 Html_based script模式 Action() { web_url("WebTours", "URL=http://127. ...