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=["","","","",""]
- 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,完毕。
练习:
程序:购物车程序
需求:
- 启动程序后,让用户输入工资,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
- 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”的一个浅复制
四、文件操作
对文件操作流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
读一个名为“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的更多相关文章
- Python文件基础
===========Python文件基础========= 写,先写在了IO buffer了,所以要及时保存 关闭.关闭会自动保存. file.close() 读取全部文件内容用read,读取一行用 ...
- 3.Python编程语言基础技术框架
3.Python编程语言基础技术框架 3.1查看数据项数据类型 type(name) 3.2查看数据项数据id id(name) 3.3对象引用 备注Python将所有数据存为内存对象 Python中 ...
- Python爬虫基础
前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...
- 小白必看Python视频基础教程
Python的排名从去年开始就借助人工智能持续上升,现在它已经成为了第一名.Python的火热,也带动了工程师们的就业热.可能你也想通过学习加入这个炙手可热的行业,可以看看Python视频基础教程,小 ...
- Python爬虫基础之requests
一.随时随地爬取一个网页下来 怎么爬取网页?对网站开发了解的都知道,浏览器访问Url向服务器发送请求,服务器响应浏览器请求并返回一堆HTML信息,其中包括html标签,css样式,js脚本等.我们之前 ...
- 零基础学Python--------第2章 Python语言基础
第2章 Python语言基础 2.1 Python语法特点 2.11注释 在Python中,通常包括3种类型的注释,分别是单行注释.多行注释和中文编码声明注释. 1.单行注释 在Python中,使用 ...
- Python学习基础笔记(全)
换博客了,还是csdn好一些. Python学习基础笔记 1.Python学习-linux下Python3的安装 2.Python学习-数据类型.运算符.条件语句 3.Python学习-循环语句 4. ...
- Python数据分析基础教程
Python数据分析基础教程(第2版)(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1_FsReTBCaL_PzKhM0o6l0g 提取码:nkhw 复制这段内容后 ...
- Python数据分析基础PDF
Python数据分析基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1ImzS7Sy8TLlTshxcB8RhdA 提取码:6xeu 复制这段内容后打开百度网盘手 ...
- Python的基础语法(一)
0. 前言 最近正在重新整理Python的基础知识,以便更好地学习新知识.这一部分主要是讲述Python基础语法的演示.下面的语法都是基于Python3的语法. 1. 注释 注释:Python的注释方 ...
随机推荐
- 洛谷 T2691 桶哥的问题——送桶
嗯... 题目链接:https://www.luogu.org/problem/T2691 这道题有一点贪心的思想吧...并且思路与题目是倒着来的(貌似这种思路已经很常见的... 先举个栗子: 引出思 ...
- Jquery练习1
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 第三周之Hadoop学习(三)
从上周的这篇教程中继续hadoop的安装过程:http://dblab.xmu.edu.cn/blog/install-hadoop-in-centos/ 上节课安装到对hadoop中的输出的文件夹的 ...
- 【转】android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler
来自:http://blog.csdn.net/jason0539/article/details/18055259 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新, ...
- Linux CentOS7 VMware LAMP架构Apache用户认证、域名跳转、Apache访问日志
一.Apache用户认证 vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把111.com那个虚拟主机编辑成如下内容 <Virtu ...
- linux#自启动脚本
编写脚本: /etc/init.d/myscriptname # chkconfig: # description: 描述信息,描述信息,上面的90表示在众多开机启动脚本的优先级,10表示在众多关机启 ...
- Docker 问题[Warning] IPv4 forwarding is disabled. Networking will not work.
Docker 问题[Warning] IPv4 forwarding is disabled. Networking will not work. 在使用Dockerfile创建Docker镜像的时候 ...
- python导入第三方库
2.Python的库一般包含两个方面:第三方库和标准库 3.Python的time标准库主要包含三个方面的内容:(1)时间处理函数(2)时间格式化(3)程序计时 4.turtle画笔运动函数的功能是进 ...
- JS 删除对象中指定的值
1,通过delete删除 2,通过filter filter需要在循环的时候判断一下是true还是false,是true才会返回这个元素: let arr1 = [1,2,3]; let arr2 = ...
- 病毒[POI2000](AC自动机+搜索)
题目链接:病毒[POI2000] 我们假设已经有一个无限长的串满足要求,那如果我们拿它去匹配会发生什么? 它会一直在Trie树和fail树上转圈,一定经过根节点且不会经过病毒字符串结束的节点. 所以如 ...