Spider理论系列-python的数据类型

本文详细介绍了Python中的基本数据类型,包括字符串的格式化、索引和切片、常用操作,以及列表、元组、Set和字典的概念、增删改查方法。重点讨论了如何对这些数据类型进行操作,如字符串的大小写转换、替换、切割,列表的动态修改,元组的不可变性,Set的去重功能,以及字典的键值对操作等。
摘要由CSDN通过智能技术生成

目录

写在前面

数据类型

一.基础数据类型

二.字符串

1.字符串格式化

2.索引和切片

3.常用操作

4.切割和替换

5.查找和替换

6.补充和总结

三.列表

1.列表的概念

2.增删改查

四.元组

五.Set

六.字典

1.概念

2.增删改查

3.循环和嵌套

写在前面

为什么要把数据类型作为理论系列第一章呢?其实呢我们使用爬虫得到的数据需要处理,比如字符串,字典,列表,元组,我们爬取的数据就是这些类型,如何操作数据成为我们想要的.就需要熟练掌握这些数据类型的API,就像spider实战系列爬取一人之下那一文中​​Spider实战系列-抓取《一人之下第三季》_浅辄的技术博客_51CTO博客​​里的密钥解密那一部分,就使用了字符串替换.我个人是学Java出身的,因为Java是驼峰命名,而且还是个强类型语言,但python就不一样,定义一个变量就能使用,哈,其实有时候还是挺不方便的.

所以,爬虫要想学好,下面的数据类型操作要熟练使用.

数据类型

一.基础数据类型

  • int
#int:整数,加减乘除,大小比较
a=10
  • float
#float:小数
a=10.5
print(a)
print(10/3) #小数:数据范围是无限的。整数:在某一个特定的区间内是可以表示的很清楚的
#1~100000000

#0~1
#计算机是一个二进制的产品:0,1
#计算机表示一个小数是会有误差的,
  • boolean
#bool:用来做条件判断的
#     取值范围:True,False
#基础数据类型之间的转化
a ='10'
print(type(a))
b=int(a)#把字符串转化成int()
print(type(b))

a=10        #在python中,所有的非零的数字都是True,零是Fasle
b=bool(a)
print(type(b))
print(b)
while 1:    #死循环,恒为真
    print("给我钱")

s = ""#在python中,所有的非空字符串都是True,空字符串是False
print(bool(s))

#综上,在pythont中,表示空的东西都是False,不空的东西都是True

二.字符串

1.字符串格式化

字符串的格式化问题

#我叫xxx,我住在xxx,我几年xxx岁,我喜欢xxx
name = input("输入你的名字:")
address = input("输入你的地址:")
age = int(input("输入你的年龄:"))
hobby = input("输入你的爱好:")
# %s字符串占位
# %d占位整数
# %f占位小数
s = "我叫%s,我住在%s,我几年%d岁,我喜欢%s" % (name,address,age,hobby)
s1 = "我叫{},我住在{},我几年{},我喜欢{}".format(name,address,age,hobby)
s2 = f"我叫{name},我住在{address},我几年{age},我喜欢{hobby}"# f-string
print(s)

2.索引和切片

# 索引和切片
# 索引:按照位置提取元素
s = "我叫Lee"
# 可以采用索引的方式来提取某一个字符(文字)
print(s[2])  # 程序员都是从0开始数数
print(s[-1])  # -表示倒数

# 切片:从一个字符串中提取一部分内容
s = "我是Lee,你是小黄么"
print(s[3:6])  # 从索引3位置进行切片,切到6结束 坑:切片拿不到第二个位置的元素
# 语法:s[start:end]从start到end进行切片,但是取不到end[start,end)
print(s[0:6])
print(s[:6])  # 如果start是从开头进行切片,可以省略
print(s[6:])  # 从start开始一直截取到末尾
# : 如果左右两端有空白,表示开头或者结尾
print(s[:])

print(s[-3:-1])  # 目前还是只能从左往右切片
print(s[-1:-3])  # 没结果,这是个坑!!!

s = "我爱你"
# 可以给切片添加步长来控制切片的方向
print(s[::-1])  # 一表示从右往左
# 语法:s[start:end:step]从start切到end,每step个元素选出来一个元素

s="abcdefghijklmnopq"
print(s[3:8:2])
print(s[-1:-10:-3])

3.常用操作

# 字符串常用操作
# 字符串的操作一般不会对原字符串产生影响,一般是返回一个新的字符串
# 3.1字符串大小写转换
s = "python"
s1 = s.capitalize()
print(s1)

s = "I have a dream!"
s1 = s.title()  # 单词的首字母大写
print(s1)

s = "I HAVE A DREAM"
s1 = s.lower()  # 变成小写字母
print(s1)

s = "i have a dream"
s1 = s.upper()  # 把所有字母变成大写字母
print(s1)

# 如何忽略大小写来进行判断 =>  upper()
verify_code = "xAd1"
user_input = input(f"请输入验证码({verify_code}):")
if verify_code.upper() == user_input.upper():
    print("验证码正确")
else:
    print("验证码不正确")

4.切割和替换

# 3.2替换和切割(*)
# strip()       去掉字符串左右两端的空白符(空格,\t,\n)
s = "    你好  ,  我是 Lee"
s1 = s.strip()
print(s1)

# 案例
username = input("请输入用户名:").strip()
password = input("请输入密码:").strip()
if username == "admain":
    if password == "123456":
        print("登陆成功")
    else:
        print("登陆失败!")
else:
    print("登陆失败!")

# replace(old,ne)字符串替换
s = "你好呀,我是刘德华"
s1 = s.replace("刘德华", "彭于晏")
print(s1)

a = "hello i am a good man!"
a1 = a.replace("", "")  # 去掉所有的空格
print(a1)

# split(用什么切割) 字符串切割  用什么切,就会损失掉谁,
a = "python_java_c_c#_javascript"
lst = a.split("_")  # 切割之后的结果会放在列表当中
print(lst)
lst = a.split("_java")
print(lst)

5.查找和替换

# 查找和判断
s = "你好啊,我是吴彦祖是"
ret = s.find("我")  # 返回如果是一1就是没有该字符串出现   只会查找出第一次出现的
print(ret)
ret = s.index("我")  # 如果报错就是没有
print(ret)

print("我" in s)  # in可以做条件上的判断
print("我" not in s)

# 判断
name = input("输入你的名字")
# 判断你是不是姓张
if name.startswith("李"):  # 判断字符串是否以KXXXX开头,endwith()
    print("你姓李")
else:
    print("不姓李")

money = input("请输入你的钱")
if money.isdigit():     #判断字符串是否由整数组成,
    money = int(money)
    print("可以花钱了")
else:
    print("对不起,你输入有误")

6.补充和总结

# 补充和总结
s = "hello"
print(len(s))   #length长度
#join()
s = "python_java_c_javascript"
lst = s.split("_")
print(lst)

lst = ["小黄","小楠","小李"]
# 用_把上面的人名连起来
s="_".join(lst)
print(s)
# 总结
"""
1.f“{变量}"格式化一个字符串
2.索引和切片:
    索引:从0开始的.[]
    切片:s[start:end:step],end位置的数据永远拿不到
3.相关操作:
    字符串操作对原字符串是不发生改变的,
    1.upper()在需要忽略大小写的时候
    2.strip()可以去掉字符串左右两端的空白(空格,\t,\n)
    3.replace()字符串替换
    4.split()对字符串进行切割
    5.join()拼接一个列表中的内容成为新字符串
    6.startswith()判断字符串是否以xxx开头
    7.1en()字符串长度(内置函数)
    
    字符串的循环和遍历
    for c in s:
        print(c)
    字符串中的每一个字符
    关于in:
        1.判断xxx是否在xxxx中出现了
        2.for循环
"""

三.列表

1.列表的概念

# 定义:能装东西的东西
# 在oython中用[]来表示一个列表,列表中的元素通过,隔开
a = ["小黄", "小蓝", "小紫", [1, 2, "小灰", True]]
# 特性:
#   1.也像字符串一样也有索引和切片
#   2.索引如果超过范围会报错
#   3.可以用for循环进行遍历
#   4.用len拿到列表的长度
lst = ["小黄", "小蓝", "小紫", "小红"]
print(lst[0])
print(lst[1:3])
print(lst[::-1])
print(lst[33656])
for item in lst:
    print(item)
print(len(lst))

2.增删改查

# 列表的增删改查
lst = []
# 向列表中添加内容
lst.append("小黄")
lst.append("小岚")
lst.append("小仔")
# insert()插入
lst.insert(0, "小黑")
# extend()可以合并两个列表
lst.extend(["曹操", "刘备", "关羽"])
print(lst)

# 删除
ret = lst.pop(3)  # 给出被删除的索引,返回被删除的元素
print(lst)
print(ret)
lst.remove("小岚")  # 删除某个元素
print(lst)

# 修改
lst[3] = "小希"
print(lst)

# 查询
print(lst[3])  # 直接用索引进行查询操作

# 其他操作
# 排序
lst = [1, 2, 3, "小黄", "Lee"]  # 列表会按照你存放的顺序来保存
print(lst)

lst = [132, 156, 654, 3216, 654, 6872, 6843, 7489]
lst.sort()  # 对列表进行升序排序
lst.sort(reverse=True)  # reverse: 翻转
print(lst)

# 列表的嵌套
lst = ["abc", "def", ["123", "456", ["ghi", "lee", 789], 7]]
print(lst[2][2][0])

lst[2][2][1] = lst[2][2][1].upper()

print(lst)

# 列表的循环删除
lst = ["小黄", "小蓝", "小紫", "小红", "Lee"]
for item in lst:
    if item.startswith("小"):
        lst.remove(item)
print(lst)  # 这样删除会删不干净,因为在删除一个元素后,会补上来一个元素

lst = ["小黄", "小蓝", "小紫", "小红", "Lee"]
temp = []  # 准备一个临时列表,负责存储要删除的内容
for item in lst:
    if item.startswith("小"):
        temp.append(item)  # 把要删除的内容记录下来

for item in temp:
    lst.remove(item)  # 去原列表中进行删除操作
print(lst)

# 安全稳妥的循环删除方式:
#       将要删除的内容保存在一个新列表中,循环新列表,删除老列表

四.元组

# tuple元组,特点:不可变的列表
t = ["小黄", "小李", "小岚"]

print(t)
print(t[1:3])
t[0] = "小楠"  # 'tuple' object does not support item assignment
print(t)

# 你固定了某些数据,不允许外界修改
# 元组如果只有1个元素
t=("小红")
print(t)
print(type(t)) #<class 'str'>

#关于元组的不可变(坑)
t=(1,2,3,["小岚","小吕"])
t[3].append("小黄")
print(t)    #(1, 2, 3, ['小岚', '小吕', '小黄'])

五.Set

# set集合,set集合是无序的
s = {1, 2, "小黑子", 3}
print(type(s))
print(s)

s = {1, 2, 3, "油饼食不食", []}  # unhashable type: 'list'
print(s)
# 不可哈希:python中的set集合进行数据存储的时候.需要对数据进行哈希计算,根据计算出来的哈希值进行存储数据
#         set集合要求存储的数据必须是可以进行哈希计算的,
#         可变的数据类型,list,dict,set
# 可哈希:不可变的数据类型,int,str,tuple,bool

s = set()  # 创建空集合

s.add("一个真正的鳗")
s.add("小黑子")
s.add("ikun")
print(s)

s.pop()  # 由于集合无序,测试的时候没法验证是最后一个,
print(s)

s.remove("小黑子")
print(s)

# 热想要修改,先删除,再新增
s.remove("小黑子")
s.add("我家哥哥")
print(s)

for item in s:
    print(item)
# 交集,并集,差集
s1 = {"哥哥", "下蛋", "一个真正的鳗"}
s2 = {"ikun", "小黑子", "哥哥"}

print(s1 & s2)  # 交集
print(s1.intersection(s2))

print(s1 | s2)  # 并集
print(s1.union(s2))

print(s1 - s2)  # 差集
print(s1.difference(s2))

# 重要的作用:可以去除重复
s1 = {"周杰伦", "昆凌", "蔡依林", "侯佩岑"}
print(s1)
s1.add("周杰伦")
print(s1)

lst = ["周杰伦", "昆凌", "蔡依林", "侯佩岑", "周杰伦", "昆凌", "蔡依林", "侯佩岑", "周杰伦", "昆凌", "蔡依林", "侯佩岑"]
print(lst)
print(set(lst))
print(list(set(lst)))  # 去除重复之后的数据是无序的。

使用set集合去重的操作

baseRes = []
needRes = []
# FunList .append('a')       #可添加值
baseRes = ['/XiuRen/12286.html', '/XiuRen/12286_1.html', '/XiuRen/12286_2.html', '/XiuRen/12286_3.html', '/XiuRen/12286_4.html', '/XiuRen/12286_5.html', '/XiuRen/12286_6.html', '/XiuRen/12286_7.html', '/XiuRen/12286_8.html', '/XiuRen/12286_9.html', '/XiuRen/12286_10.html', '/XiuRen/12286_11.html', '/XiuRen/12286_12.html', '/XiuRen/12286_13.html', '/XiuRen/12286_14.html', '/XiuRen/12286_15.html', '/XiuRen/12286_16.html', '/XiuRen/12286_17.html', '/XiuRen/12286_18.html', '/XiuRen/12286_19.html', '/XiuRen/12286_20.html', '/XiuRen/12286_21.html', '/XiuRen/12286_22.html', '/XiuRen/12286_23.html', '/XiuRen/12286_24.html', '/XiuRen/12286_25.html', '/XiuRen/12286_26.html', '/XiuRen/12286_27.html', '/XiuRen/12286_28.html', '/XiuRen/12286_29.html', '/XiuRen/12286_1.html', '/XiuRen/12286.html', '/XiuRen/12286_1.html', '/XiuRen/12286_2.html', '/XiuRen/12286_3.html', '/XiuRen/12286_4.html', '/XiuRen/12286_5.html', '/XiuRen/12286_6.html', '/XiuRen/12286_7.html', '/XiuRen/12286_8.html', '/XiuRen/12286_9.html', '/XiuRen/12286_10.html', '/XiuRen/12286_11.html', '/XiuRen/12286_12.html', '/XiuRen/12286_13.html', '/XiuRen/12286_14.html', '/XiuRen/12286_15.html', '/XiuRen/12286_16.html', '/XiuRen/12286_17.html', '/XiuRen/12286_18.html', '/XiuRen/12286_19.html', '/XiuRen/12286_20.html', '/XiuRen/12286_21.html', '/XiuRen/12286_22.html', '/XiuRen/12286_23.html', '/XiuRen/12286_24.html', '/XiuRen/12286_25.html', '/XiuRen/12286_26.html', '/XiuRen/12286_27.html', '/XiuRen/12286_28.html', '/XiuRen/12286_29.html', '/XiuRen/12286_1.html']   #可是预先设置
print(baseRes)
needRes= list(set(baseRes ))
print(needRes)    #不重复但是乱序
needRes.sort(key=baseRes .index)
print(needRes)    #不重复且按原序

六.字典

1.概念

# 首先,字典是以键值对的形式进行存储数据的
# 字典的表示方式:{key:value,key2:value,key3:value}
dic = {"jay": "周杰伦", "鸡哥": "蔡徐坤"}

val = dic["jay"]
print(val)
# 字典的key必须是可哈希的数据类型
# 字典的value可以是任何数据类型
dic = {[]: 123}
print(dic)  # unhashable type: 'list'

dic={"ikun":["小黑子1号","小黑子2号"]}

2.增删改查

dic = dict()

dic["ikun"] = "小黄"
dic[1] = "123"
dic["ikun"] = "Lee"  # 覆盖前面的元素

print(dic)

dic.setdefault("湖南", "臭豆腐")  # 设置默认值.如果以前已经有了湖南了,setdefault就不起作用了
dic.setdefault("湖南", "胡辣汤")
print(dic)

# 删除
dic.pop("jay")  # 根据key去删除
print(dic)

# 查询
print(dic["jay"])
print(dic.get('jay'))
print(dic["jay10086"])  # 如果key不存在,程序会报错. 当你确定你的key是没问题的,可以用
print(dic.get('jay10086'))  # 如果key不存在,程序返回None. 程序返回None.当不确定你的key的时候,可以用

# None
a = None  # 单纯的就是空,表示没有的意思
print(type(a))


# 小案例
dic = {
    "小黑子1号": "油饼食不食",
    "小黑子2号": "香精煎鱼",
    "小黑子3号": "我家哥哥下蛋你别吃",
    "小黑子4号": "一个真正的鳗",
    "小黑子5号": "香翅捞饭食不食"
}
name = input("输入你想看的小黑子话")
val = dic.get(name)
if val is None:
    print("你不是我们ikun的一员")
else:
    print(val)

3.循环和嵌套

  • 循环
dic = {
    "小黑子1号": "油饼食不食",
    "小黑子2号": "香精煎鱼",
    "小黑子3号": "我家哥哥下蛋你别吃",
    "小黑子4号": "一个真正的鳗",
    "小黑子5号": "香翅捞饭食不食"
}
# 1.可以用for循环,直接拿到key
for key in dic:
    print(key, dic[key])

# 2.希望把所有的ky全都保存在一个列表中
print(list(dic.keys()))  # 拿到所有的key了

# 3.希望吧所有的value都放在一个列表中
print(list(dic.values()))

# 4.直接拿到字典中的key和value
print(dic.items())
for key,val in dic.items():   #可以拿到所有的key 和 val
    # key = item[0]
    # val = item[1]
    # print(key, val)
    #key,val = item
    print(key,val)

a, b = (1, 2)  # 元组或者列表都可以执行该操作,该操作被称为解构(解包)
print(a)
print(b)
  • 嵌套
ikun = {
    "name": "小黄",
    "age": 20,
    "quotes": {
        "quote1": "油饼食不食",
        "quote2": "香精煎鱼",
        "hobby": {
            "be1": "唱",
            "be2": "跳",
            "be3": "rap"
        }
    },
    "behave": [
        {"行为1": "唱", "哥哥1": "鲲鲲"},
        {"行为2": "跳", "哥哥2": "下蛋"},
        {"行为3": "rap", "哥哥3": "篮球"}
    ]
}

# 小黄语录的爱好的行为1
be1 = ikun["quotes"]["hobby"]["be1"]
print(be1)
# 小黄语录的爱好be2改为篮球
ikun["quotes"]["hobby"]["be2"] = "篮球"
print(ikun)
dic = {
    "1号小黑子": "油饼食不食",
    "2号小黑子": "香精煎鱼",
    "3号小黑子": "我家哥哥下蛋你别吃",
    "4号小黑子": "一个真正的鳗",
    "5号小黑子": "香翅捞饭食不食"
}

temp = []   # 存放即将要别除的key
for key in dic:
    if key.startswith("1"):
        temp.append(key)      #dictionary changed size during iteration

for t in temp:   #循环列表,删除字典中的内容
    dic.pop(t)
print(dic)

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值