本章内容:

1、列表、元组

2、字典

3、集合

4、文件操作

5、字符编码与转码

一、列表、元组操作

列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa"]
  2. print(names[1])
  3. #从第2个取到第4个,但不包括第4个
  4. print(names[1:3]) #切片,顾头不顾尾
  5. print(names[0:3])
  6. #取倒数第二个值
  7. print(names[-2])
  8. #取最后两个值
  9. print(names[-2:])

执行结果:

  1. jehu
  2. ['jehu', 'xiaodu']
  3. ['zhangzhihao', 'jehu', 'xiaodu']
  4. jjj
  5. ['jjj', 'aaa']

追加

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa"]
  2. names.append("www")
  3. print(names)

执行结果:

['zhangzhihao', 'jehu', 'xiaodu', 'jjj', 'aaa', 'www']

插入

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa"]
  2. names.insert(1,"rrr")
  3. print(names)

执行结果:

['zhangzhihao', 'rrr', 'jehu', 'xiaodu', 'jjj', 'aaa']

修改

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa"]
  2. names[0]="zhangzz"
  3. print(names)

执行结果:

['zhangzz', 'jehu', 'xiaodu', 'jjj', 'aaa']

删除

方法一:

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa"]
  2. names.remove("aaa")
  3. print(names)

执行结果:

['zhangzhihao', 'jehu', 'xiaodu', 'jjj']

方法二:

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa"]
  2. del names[3]
  3. print(names)

执行结果:

['zhangzhihao', 'jehu', 'xiaodu', 'aaa']

方法三:

  1. #删掉jjj
  2. names=["zhangzhihao","jehu","xiaodu","jjj","aaa"]
  3. names.pop(3)
  4. print(names)

查找某个字符串在列表中的哪个位置

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa"]
  2. print(names.index("xiaodu"))

统计列表中字符串的数量

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"]
  2. print(names.count("jjj"))

清空列表

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"]
  2. names.clear()
  3. print(names)

翻转列表

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"]
  2. names.reverse()
  3. print(names)

执行结果:

['jjj', 'aaa', 'jjj', 'xiaodu', 'jehu', 'zhangzhihao']

排序

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"]
  2. names.sort()
  3. print(names)

执行结果:

['aaa', 'jehu', 'jjj', 'jjj', 'xiaodu', 'zhangzhihao']

合并列表

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"]
  2. names2=["","","","",""]
  3. print(names)
  4. names.extend(names2)
  5. print(names)

执行结果:

['zhangzhihao', 'jehu', 'xiaodu', 'jjj', 'aaa', 'jjj']
['zhangzhihao', 'jehu', 'xiaodu', 'jjj', 'aaa', 'jjj', '1', '2', '3', '4', '5']

复制

copy 浅复制

  1. names=["zhangzhihao","jehu","xiaodu","jjj","aaa","jjj"]
  2. names2=names.copy()
  3. print(names)
  4. print(names2)
  1. number=["","","",["a","b","c"],"",""]
  2. number2=number.copy()
  3. number[2]=""
  4. print(number)
  5. print(number2)
  6. number[3][0]="A"
  7. print(number)
  8. 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

深复制

  1. import copy
  2.  
  3. number=["","","",["a","b","c"],"",""]
  4. number2=copy.deepcopy(number)
  5. number[2]=""
  6. number[3][0]="A"
  7. print(number)
  8. print(number2)

元组

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

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

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

练习:

程序:购物车程序

需求:

  1. 启动程序后,让用户输入工资,然后打印商品列表
  2. 允许用户根据商品编号购买商品
  3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
  4. 可随时退出,退出时,打印已购买商品和余额
  1. salary=input("Please input your salary:")
  2. commodities=[["Iphone",5800],["Milk",30],["apple",15],["coffee",20],["chicken",25],
  3. ["pork",32],["juice",8],["router",700]]
  4. brougth_com=[]
  5.  
  6. if salary.isdigit():
  7. salary=int(salary)
  8. while True:
  9. for index,i in enumerate(commodities):
  10. print(index,i)
  11. com_chose = input("The item number you want to buy:")
  12. if com_chose.isdigit():
  13. com_chose=int(com_chose)
  14. if com_chose<len(commodities) and com_chose>=0:
  15. price=commodities[com_chose][1]
  16. if salary>=price:
  17. salary=salary-price
  18. brougth_com.append(commodities[com_chose])
  19. 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))
  20. else:
  21. print("Your balance is short, only {0} left.".format(salary))
  22. else:
  23. print("Over the goods number range.")
  24. elif com_chose=="q":
  25. print("------shopping list-------")
  26. for j in brougth_com:
  27. print(j)
  28. print("Your balance is {0}.".format(salary))
  29. exit()
  30. else:
  31. print("invalid option.")
  32. else:
  33. print("invalid option.")

二、字典

字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。

字典的特性:

  • dict是无序的
  • key必须是唯一的,so 天生去重

语法:

  1. info = {
  2. '': "zhangzhihao",
  3. '': "liuxiaodu",
  4. '': "jehu",
  5. }

增加

  1. info[""]="aaa"
  2. print(info)

执行结果:

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

修改

  1. info[""]="zhangzz"
  2. print(info)

执行结果:

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

删除

方法一:

  1. info.pop("")
  2. print(info)

执行结果:

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

方法二:

  1. del info[""]
  2. print(info)

执行结果:

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

查找

  1. b=info.get("")
  2. print(b)
  3. a=info[""]
  4. print(a)

执行结果:

liuxiaodu

liuxiaodu

如果一个key不存在,就报错,get不会,不存在只返回None

多级字典嵌套及操作

  1. city={
  2. "广东":{
  3. "广州":["越秀","天河","荔湾","白云"],
  4. "深圳":["南山","罗湖","福田","宝安"],
  5. "茂名":["茂南","茂港","电白","高州"]},
  6. "浙江":{
  7. "杭州":["西湖","萧山","余杭"],
  8. "温州":["鹿城","龙湾","瓯海"],
  9. "嘉兴":["南湖","秀洲","平湖"]},
  10. "上海":{
  11. "黄埔":["南京路","外滩","豫园"],
  12. "徐汇":["湖南路","天平路","枫林路"],
  13. "长宁":["华阳路","新华路","江苏路"]
  14. }
  15. }
  16. print(city)
  17. print(city["广东"])
  18. print(city["广东"]["深圳"])

执行结果:

  1. {'广东': {'广州': ['越秀', '天河', '荔湾', '白云'], '深圳': ['南山', '罗湖', '福田', '宝安'], '茂名': ['茂南', '茂港', '电白', '高州']}, '浙江': {'杭州': ['西湖', '萧山', '余杭'], '温州': ['鹿城', '龙湾', '瓯海'], '嘉兴': ['南湖', '秀洲', '平湖']}, '上海': {'黄埔': ['南京路', '外滩', '豫园'], '徐汇': ['湖南路', '天平路', '枫林路'], '长宁': ['华阳路', '新华路', '江苏路']}}
  2. {'广州': ['越秀', '天河', '荔湾', '白云'], '深圳': ['南山', '罗湖', '福田', '宝安'], '茂名': ['茂南', '茂港', '电白', '高州']}
  3. ['南山', '罗湖', '福田', '宝安']

循环查字典

  1. #方法1
  2. for key in info:
  3. print(key,info[key])
  4.  
  5. #方法2
  6. for k,v in info.items(): #会先把dict转成list,数据里大时莫用
  7. print(k,v)

三、集合

集合是一个无序的,不重复的数据组合,它的主要作用如下:

  • 去重,把一个列表变成集合,就自动去重了
  • 关系测试,测试两组数据之前的交集、差集、并集等关系
  1. list_1=[3,1,4,5,6,5,3,9,8]
  2. list_1=set(list_1)
  3. print(list_1,type(list_1))

执行结果:

{1, 3, 4, 5, 6, 8, 9} <class 'set'>

语法:

  1. s = set([3,5,9,10]) #创建一个数值集合
  2.  
  3. t = set("Hello") #创建一个唯一字符的集合
  4.  
  5. a = t | s # t 和 s的并集
  6.  
  7. b = t & s # t 和 s的交集
  8.  
  9. c = t s # 求差集(项在t中,但不在s中)
  10.  
  11. d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)
  12.  
  13. 基本操作:
  14.  
  15. t.add('x') # 添加一项
  16.  
  17. s.update([10,37,42]) # 在s中添加多项
  18.  
  19. 使用remove()可以删除一项:
  20.  
  21. t.remove('H')
  22.  
  23. len(s)
  24. set 的长度
  25.  
  26. x in s
  27. 测试 x 是否是 s 的成员
  28.  
  29. x not in s
  30. 测试 x 是否不是 s 的成员
  31.  
  32. s.issubset(t)
  33. s <= t
  34. 测试是否 s 中的每一个元素都在 t
  35.  
  36. s.issuperset(t)
  37. s >= t
  38. 测试是否 t 中的每一个元素都在 s
  39.  
  40. s.union(t)
  41. s | t
  42. 返回一个新的 set 包含 s t 中的每一个元素
  43.  
  44. s.intersection(t)
  45. s & t
  46. 返回一个新的 set 包含 s t 中的公共元素
  47.  
  48. s.difference(t)
  49. s - t
  50. 返回一个新的 set 包含 s 中有但是 t 中没有的元素
  51.  
  52. s.symmetric_difference(t)
  53. s ^ t
  54. 返回一个新的 set 包含 s t 中不重复的元素
  55.  
  56. s.copy()
  57. 返回 set s”的一个浅复制

四、文件操作

对文件操作流程

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

读一个名为“yesterday”的文件

  1. #只读
  2. f=open('yesterday','r',encoding="utf-8")
  3. data=f.read()
  4. print(data)
  5. f.close()
  6.  
  7. #只写
  8. f2=open('yesterday2','w',encoding="utf-8")
  9. f2.write("When i was young,I loved you.But I like this.....")
  10. f2.close()
  11.  
  12. #追加
  13. f3=open('yesterday3','a',encoding="utf-8") #a:append追加
  14. f3.write("When i was young,I loved you.\nyeah!!!")
  15. f3.close()

打开文件的模式有:

  • r,只读模式(默认)。
  • w,只写模式。【不可读;不存在则创建;存在则覆盖内容;】
  • a,追加模式。【不可读;   不存在则创建;存在则只追加内容;】

打印第一行:

  1. f=open('yesterday','r',encoding="utf-8")
  2. data=f.readline()
  3. print(data)
  4. f.close()

打印前五行:

  1. f=open('yesterday','r',encoding="utf-8")
  2. for i in range(5):
  3. print(f.readline().strip())
  4. f.close()

打印所有行:

  1. f=open('yesterday','r',encoding="utf-8")
  2. for i in f.readlines():
  3. print(i.strip())
  4. f.close()

不打印第十行:

方法一:(不推荐,效率低,用readlines是一次性将文件读到内存)

  1. f=open('yesterday','r',encoding="utf-8")
  2. for index,i in enumerate(f.readlines()):
  3. if index==9:
  4. print("--------------")
  5. continue
  6. print(i.strip())
  7. f.close()

方法二:(推荐,一行一行读进内存)

  1. f=open('yesterday','r',encoding="utf-8")
  2. count=0
  3. for i in f:
  4. if count==9:
  5. print("-----------")
  6. count+=1
  7. continue
  8. print(i.strip())
  9. count+=1
  10. 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

文件修改示例:

  1. f=open("yesterday","r",encoding="utf-8")
  2. f_new=open("yesterday2","w",encoding="utf-8")
  3.  
  4. for line in f:
  5. if "生命的滋味是甜的" in line:
  6. line=line.replace("生命的滋味是甜的","生命的滋味是咸的")
  7. f_new.write(line)
  8. f.close()
  9. f_new.close()

with语句

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

  1. with open("yesterday","r",encoding="utf-8") as f:
  2. for line in f:
  3. print(line.strip())

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

  1. with open('log1') as obj1, open('log2') as obj2:
  2. pass

文件操作作业练习:

修改haproxy配置文件

haproxy配置文件:

  1. global
  2. log 127.0.0.1 local2
  3. daemon
  4. maxconn 256
  5. log 127.0.0.1 local2 info
  6. defaults
  7. log global
  8. mode http
  9. timeout connect 5000ms
  10. timeout client 50000ms
  11. timeout server 50000ms
  12. option dontlognull
  13.  
  14. listen stats :8888
  15. stats enable
  16. stats uri /admin
  17. stats auth admin:1234
  18.  
  19. frontend oldboy.org
  20. bind 0.0.0.0:80
  21. option httplog
  22. option httpclose
  23. option forwardfor
  24. log global
  25. acl www hdr_reg(host) -i www.oldboy.org
  26. use_backend www.oldboy.org if www
  27.  
  28. backend www.oldboy.org
  29. server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
  30.  
  31. 原配置文件

需求:

  1. 1、查
  2. 输入:www.oldboy.org
  3. 获取当前backend下的所有记录
  4.  
  5. 2、新建
  6. 输入:
  7. arg = {'backend': 'www.oldboy.org','record':{'server': '100.1.7.9','weight': 20,'maxconn': 30}}
  8.  
  9. 3、删除
  10. 输入:
  11. arg = {'backend': 'www.oldboy.org','record':{'server': '100.1.7.9','weight': 20,'maxconn': 30}}
  12.  
  13. 需求

代码:

  1. print("1.search\n2.add\n3.delete")
  2. chose=input("你要选择哪项操作?")
  3.  
  4. if chose=="":
  5. find=input("你要查询哪个?")
  6. find="backend "+find+"\n"
  7. with open("haproxy", "r") as f:
  8. for line in f:
  9. if find == line:
  10. print(line.strip())
  11. print(next(f).strip()) #方法二:print(f.readline().strip())
  12. elif chose=="":
  13. add=input("你要新增什么字段?")
  14. add=eval(add) #eval把字符串转化为字典格式
  15. with open("haproxy","a") as f:
  16. f.write("\nbackend {0}\n".format(add["backend"]))
  17. f.write("\tserver {0} weight {1} maxconn {2}".format(add['record']['server'],add['record']['weight'],add['record']['maxconn']))
  18. print("新增完成")
  19. elif chose=="":
  20. delete=input("想要删除的字段:")
  21. delete=eval(delete)
  22. delete_backend=delete['backend']
  23. delete_server=delete['record']['server']
  24. delete_weight=delete['record']['weight']
  25. delete_maxconn=delete['record']['maxconn']
  26. delete_line=[]
  27. with open("haproxy","r") as f:
  28. haproxy_line=f.readlines()
  29. f.seek(0)
  30. for index,line in enumerate(f):
  31. if "backend "+delete_backend+"\n" == line:
  32. delete_line.append(index)
  33. delete_line.append(index+1)
  34. count = 0
  35. with open("haproxy","w") as ff:
  36. for line in haproxy_line:
  37. if count not in delete_line:
  38. ff.write(line)
  39. count+=1
  40. print("删除完成")
  41. else:
  42. 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

  1. #-*-coding:gb2312 -*- #这个也可以去掉
  2. __author__ = 'Alex Li'
  3.  
  4. import sys
  5. print(sys.getdefaultencoding())
  6.  
  7. msg = "我爱北京天安门"
  8. #msg_gb2312 = msg.decode("utf-8").encode("gb2312")
  9. msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔
  10. gb2312_to_unicode = msg_gb2312.decode("gb2312")
  11. gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")
  12.  
  13. print(msg)
  14. print(msg_gb2312)
  15. print(gb2312_to_unicode)
  16. print(gb2312_to_utf8)
  17.  
  18. 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. 洛谷 T2691 桶哥的问题——送桶

    嗯... 题目链接:https://www.luogu.org/problem/T2691 这道题有一点贪心的思想吧...并且思路与题目是倒着来的(貌似这种思路已经很常见的... 先举个栗子: 引出思 ...

  2. Jquery练习1

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. 第三周之Hadoop学习(三)

    从上周的这篇教程中继续hadoop的安装过程:http://dblab.xmu.edu.cn/blog/install-hadoop-in-centos/ 上节课安装到对hadoop中的输出的文件夹的 ...

  4. 【转】android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler

    来自:http://blog.csdn.net/jason0539/article/details/18055259 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新, ...

  5. Linux CentOS7 VMware LAMP架构Apache用户认证、域名跳转、Apache访问日志

    一.Apache用户认证 vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把111.com那个虚拟主机编辑成如下内容 <Virtu ...

  6. linux#自启动脚本

    编写脚本: /etc/init.d/myscriptname # chkconfig: # description: 描述信息,描述信息,上面的90表示在众多开机启动脚本的优先级,10表示在众多关机启 ...

  7. Docker 问题[Warning] IPv4 forwarding is disabled. Networking will not work.

    Docker 问题[Warning] IPv4 forwarding is disabled. Networking will not work. 在使用Dockerfile创建Docker镜像的时候 ...

  8. python导入第三方库

    2.Python的库一般包含两个方面:第三方库和标准库 3.Python的time标准库主要包含三个方面的内容:(1)时间处理函数(2)时间格式化(3)程序计时 4.turtle画笔运动函数的功能是进 ...

  9. JS 删除对象中指定的值

    1,通过delete删除 2,通过filter filter需要在循环的时候判断一下是true还是false,是true才会返回这个元素: let arr1 = [1,2,3]; let arr2 = ...

  10. 病毒[POI2000](AC自动机+搜索)

    题目链接:病毒[POI2000] 我们假设已经有一个无限长的串满足要求,那如果我们拿它去匹配会发生什么? 它会一直在Trie树和fail树上转圈,一定经过根节点且不会经过病毒字符串结束的节点. 所以如 ...