3.字符串、列表、元组、字典
3.1 字符串
-
string(字符串)
- python 中使用单引号、双引号、三引号表示
word='字符串' word="字符串" word=""" 此为一段 输出保持换行 """
单引号双引号比较有区分的地方在I’m上
"I'm bill"
以及'I\'m bill
- 反斜杠表示特殊符号
words = "I said \"I love you\" "
- 默认UTF-8编码,所有字符串都是unicode字符串
- python 中使用单引号、双引号、三引号表示
-
转义字符
- 转义字符可以直接出现在字符串文本中
- 在字符串前加入r,可以直接显示不表示转义
转义字符 | desc |
---|---|
\ | 反斜杠 |
\’ | 单引号 |
\” | 双引号 |
\n | 换行 |
\t | tab横向制表符 |
-
字符串的截取
一般来说字符串截取可以用for循环,但是实在是太麻烦了,这里介绍截取函数str="wuhan" print(str) print(str[2]) print(str[a:b])#起始位a,结束位b(起始位0) print(str[a:b:2])#起始位a,结束位b,步进2
- 若直接到最后一位,那就可以直接省略
- 若从第0位开始,那就可以直接省略第0个
-
字符串的连接
在字符串之间使用加号+即可(不同于sql还要concat函数) -
字符串的常见封装调用的简单介绍(爬虫常用)
用途 | 函数 |
---|---|
首字母大写 | capitalize() |
对象解码 | bytes.decode(encoding=”utf-8″,errors=”strict”) |
对象编码 | encode(encoding=”utf-8″,errors=”strict”) |
纯字母或数字判断 | isalnum() |
所有字符都是字母 | isalpha() |
所有字符都是数字(严格向) | isdigit() |
所有字符都是数字(汉字罗马数字也行) | isnumeric() |
删除左空格 | lstrip() |
删除右空格 | rstrip() |
拆分 | split() |
3.2 列表
-
list列表
- 数据结构是可以混合的(接近数学的集合概念,集合的集合)
- 索引值以0开始,-1为从末尾开始的位置
- 列表可以用+连接也可以*表示重复
- 有序
-
定义一个列表
citylist=["wuhan","changsha","shenzhen"] multilist=["wuhan",1] print(citylist[0])#wuhan
- 混合列表中的数据类型保持不变
- 列表的循环遍历
citylist=["wuhan","changsha","shenzhen"] for hhhh in citylist: print(hhhh)
-
常用操作
增删改查切片排序,和R很像很像- 增加:
方式一:append 将整体当成一个元素,直接追加city= input("你想去哪?") citylist.append(city)#实际省略了citylist=这一坨 for hhhh in citylist: print(hhhh)
也可以在嵌套的列表中对子列表append
方式二:extend 用于列表之间的元素逐一添加addcity=["hangzhou","shanghai"] citylist.extend(addcity) for hhhh in citylist: print(hhhh)
方式三:insert 在第几位插入元素
citylist.insert(1,"hangzhou")#在第二位插入(众所周知0是1) for hhhh in citylist: print(hhhh)
- 删除:
方式一:del 指定位置删除moviename=["Inside Out","CoCo","Soul"] del moviename[2]#众所周知这是第三个的意思 for hhhh in moviename: print(hhhh)
方式二:pop 默认弹出末尾最后一个元素
moviename.pop() for hhhh in moviename: print(hhhh)
方式三:remove 移除有指定内容的元素(只删除第一个)
moviename.remove("CoCo") for hhhh in moviename: print(hhhh)
- 改写:
citylist[1]="hangzhou" for hhhh in citylist: print(hhhh)
- 查找:
方式一:遍历找在不在findname=input("找谁?") if findname in citylist: print("找到了") else: print("没找到")
方式二:index
index可以更精准指定范围,告诉准确位置print(citylist.index("wuhan",1,2)) #1-2位里面有没有wuhan存在,如果在,那么是第几位
范围区间是左闭右开的,不包括右边的位置
找不到会报错,但我们可以通过“异常处理”顺利解决
方式三:count
找一下具体元素有多少print(citylist.count("wuhan"))
- 排序
方式一:reverse
直接反转,并且改变了变量a=[1,23,4,5] print(a) a.reverse() print(a)
方式二:sort
a=[1,23,44,35] print(a) a.sort()#升序 print(a) a.sort(reverse=True)#降序 print(a)
- 增加:
-
列表的嵌套
schoolname=[["PKU","THU"],["NKU","TJU"],["WHU","HUST"]]#“集合的集合” #二维数组的访问 print(schoolname[0])#第一个列表 print(schoolname[0][0])#PKU #也可以循环(len)打印出来
-
小应用:办公室人员分配以及查看
import random
company=[[],[],[]]
names=["Alice","Bill","Cathy","David","Edward","Fred","Gray","Harry"]
# 简单而优美的循环分配(下面)
for name in names:
index=random.randint(0,2)
company[index].append(name)#注意函数是圆括号
i = 1 #为了给办公室编号
for office in company:
print("office%d有%d人哦"%(i,len(office)))
i +=1
for name in office:#不要忘了冒号
print("%s"%name,end="\t")
print("\n")
print("-"*35)#分割线
效果如下:
-
小应用:展示商品列表,做一个购物车应用
已知:products=[["iphone",6999],["MacPro",14800],["小米11",3999],["茅台",1499],["CPA轻松过关",89]]
-
打印列表
print("-------商品列表-------") i = 1 for pro in products: print(i,end="\t") print(pro[0],end="\t") print(pro[1],end="\t") print("\n") i +=1
-
购物车功能的简单实现(不考虑input check模块)
询问用户想买什么,选择编号,将对应商品加入购物车,可以输入q退出,退出后打印购物清单,同时可以返回调整。
-
charts=[]
order="Y"
while order == "Y":
trigger = 6
print("您好,请选择编号,对应商品将加入购物车,输入q退出,退出后将打印购物清单")
while trigger != "q":
trigger = input("选择您的商品编号或退出")
if trigger == "q":
break
charts.append(products[int(trigger) - 1])
sumresult = 0
for chart in charts:
sumresult += chart[1]
print("您所选择的商品如下:")
# print(charts)可以但没必要
print("-------购物车-------")
i = 1
for chart in charts:
print(i, end="\t")
print(chart[0], end="\t")
print(chart[1], end="\t")
print("\n")
i += 1
print("你一共需要支付%d元" %sumresult)
print("还需要修改吗?Y将返回继续添加,N将结束程序")
order = input()
else:
print("购物愉快,一共%d元,再见"%sumresult)
改进角度:可直接指定加车数量的功能,加加加
3.3 元组
-
Tuple元组
- tuple不能修改,小括号,有序
tup1 = (1,2,3,4,55) tup1[0]=100 #直接报错
- 元组可以包含可变对象(例如list),但是对象本身不变
- 不变换电脑角度的话就是地址是不变的
tup1=() #创建了空的元组 tup2=(50) #数据类型变成了整形(相当于是赋值运算了) tup3=(50,) #保证了是元组 tup4=(50,60,70) #标准格式
元组读取:元组也可以切片、步进
tup1=("abc","def",3,56) print(tup1[-1]) print(tup1[1:5])#左闭右开
- tuple不能修改,小括号,有序
-
增加
tup1 = (1,2,3,4,55) tup2 = ("jc","jc") tup= tup1+tup2#新建 tup1=tup1+tup2#覆盖 print(tup) print(tup1)
-
删除
直接删除了元组变量tup1 = (1,2,3,4,55) print(tup1) del tup1 print(tup1)#删了就会显示not定义了
-
修改
一样的~ -
查询
一样的~ -
转换成元组
tuple()
3.4 词典
-
dict
- 无序的对象集合,即存储键值对形式(map)
- 查找键(key)的速度极快
- 提一句其占位符是%s
d= {'M':99,'B':97,'T':78} #字典的形式
-
访问
通过键值对的键名,返回键值info={"name":"Bill","age":18} #利用键名name找到键值Bill print(info["name"])
- 在实际中,如果访问不存在的键会报错(程序卡住),但在数据很多时,没法一个个确认,所以最好搞一个默认值
print(info.get("gender")) #没有找到的话返回None print(info.get("gender","m")) #如果没有找到的话返回m
- 在实际中,如果访问不存在的键会报错(程序卡住),但在数据很多时,没法一个个确认,所以最好搞一个默认值
-
增加
#追加键值对:键名id,键值newID newID = input("您的学号?") info["id"] = newID print(info["id"])
也可以合并字典
dict1.update(dict2)
-
删除
del#删除的对象是键 del info["name"] print(info["name"]) #直接报错,因为没了 #删除的对象是字典 del info
clear
清空字典“数据”info.clear() print(info)#直接空字典
-
修改
info["age"] = 22 #直接修改键值 print(info["age"])
-
查询
实质上是遍历查询#查询所有 键 print(info.keys()) #注意查出来是列表格式 #查询所有 值 print(info.values()) #也是列表格式 #查询所有 项 print(info.items()) #每一个键值对,是一个元组
items不是item
遍历操作时,注意到存在两变量的for循环这种之前没见过的表达方式#键 for key in info.keys(): print(key) #值 for value in info.values(): print(value) #同时遍历 for key,value in info.items(): print("key=%s,value=%s"%(key,value))
- 补充:同时遍历广泛存在于实际中(又操作值又操作下标),使用更简洁的形式完成是重要的目标:
wordlist = ["a","b","c","d","e"] #手工枚举 i = 1 for x in wordlist: print(i, x) i+=1 #枚举函数 for i,x in enumerate(wordlist): print(i,x)
- 补充:同时遍历广泛存在于实际中(又操作值又操作下标),使用更简洁的形式完成是重要的目标:
3.5 集合(很少用上)
- set
- 一组键的集合,没有value但
- set是无序的,不存在重复值(输入重复会自动省略)
s = set([1,23,43,33,33])