python第四章——序列

  • 第四章——序列
  • 4.1列表
  • 4.2元组
  • 4.3字典
  • 4.4集合
  • 4.5字符串(重要)
  • 4.6正则表达式


第四章——序列

概念:序列指一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在索引位置的访问
说明:Python里常用的序列共有5种:列表、元组、字典、集合、字符串
说明:序列中元素的位置,叫做索引,索引值从0开始 ☆


4.1列表

说明:列表用[]表示
说明:list表示列表,且list()是列表函数
说明:列表中可以存放任意数据类型 ☆

ls = [1,2,3.14,"hello",True,[4,5,6]]
print(ls)
print(ls[1])    # 2
print(ls[-1][-1])   # 6
#列表元素操作—增删改
ls.append("world")  # 增
del ls[0]  #[2, 3.14, 'hello', True, [4, 5, 6]]
ls[0]="我真帅"   #['我真帅', 3.14, 'hello', True, [4, 5, 6], 'world']
print(ls)

列表中常用方法:

ls=[1,2,3,4,5,6,7,8,9,3]
print(ls.count(3)) #2(3出现次数)
print(ls.index(3)) #2(3出现位置)
print(ls.sort()) #None  (排序,但是不会输出)
print(ls)
ls.sort(reverse=True) #关键字参数,默认是False(翻转)
print(ls)
 
#内置函数,不是列表的方法
print(len(ls))  #长度 10
print(max(ls))  #最大值 9
print(min(ls))  #最小值 1
print(sum(ls))  #求和48

清空列表::

ls=[1,2,3,4,5,6,7,8,9,3]
ls.clear()  #清空
if ls:  #所有的空都是False
    print("今天周一")

列表合并:

ls1 = [1,2,3]
ls2 = [4,5,6]
ls1.extend(ls2)
print(ls1)

列表插入、移除、内容翻转操作:

ls=[1,2,3,4,5,6,250,7,8,9,3]    # [1, 2, 3, 4, 5, 6]
ls.insert(1,250)    # [1, 250, 2, 3, 4, 5, 6, 250, 7, 8, 9, 3]
print(ls)
 
ls.pop()    # 移除最后一位
print(ls)   # [1, 250, 2, 3, 4, 5, 6, 250, 7, 8, 9]
 
ls.remove(250)
print(ls)   # [1, 2, 3, 4, 5, 6, 250, 7, 8, 9](移除了第一个250)
 
ls=["php","java","html","css"]
ls.reverse()    #内容翻转
print(ls) # ['css', 'html', 'java', 'php']

列表切片: python中特有的写法
列表、元祖、字符串都支持切片,写法都相同

ls = ["php","js","python","linux","mysql","css","c++"]
print(ls[2:4])  # ['python', 'linux'] (从2开始4结束输出2,3。不包括4)
print(ls[2:6:2])    # ['python', 'mysql'] (从2开始,6结束步长为2输出2,4。不包括6)
print(ls[2:])   # 默认切到最后 ['python', 'linux', 'mysql', 'css', 'c++']
print(ls[:4])   # 默认从头开始切。从0开始4结束输出0,1,2,3。不包括4 ['php', 'js', 'python', 'linux']
print(ls[::])   # ['php', 'js', 'python', 'linux', 'mysql', 'css', 'c++']\
print(ls[::2])  # 步长为2切 ['php', 'python', 'mysql', 'c++']

列表进阶:

import random

# 1.空列表
ls = []  # 声明空列表
if ls:
    print("hello")

# 2.数值列表:内置函数list() range()
ls = list(range(1, 10, 2))
print(ls)  # [1, 3, 5, 7, 9]

# 3.随机列表:random模块
ls = list(range(random.randint(1, 10), random.randint(50, 70)))
print(ls)

# 4.列表相加
ls = ["html", "css", "js"]
print("html" in ls)  # True
print("html" not in ls)  # False
print("html" in "hello,html")  # True

# 5.列表相乘
print(ls * 2)  # ['html', 'css', 'js', 'html', 'css', 'js']

# 6.检测列表元素:in关键字
# 说明:5大序列都可以使用in
ls = ["html", "css", "js"]  # True
print("html" in ls)  # False
print("html" not in ls)  # True
print("html" in "hello,html")

# 7.二维列表
ls = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print(ls)   # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(ls[2][1])  # 8

# 8.列表遍历:把所有元素依次取出
ls = ["html", "css", "js", "php", "python", "java"]
for i in ls:
    print(i)
'''
html
css
js
php
python
java

'''
i = 0
while i < len(ls):
    print(ls[i])
    i += 1
'''
html
css
js
php
python
java
'''
# 9.列表推导式:快速生成列表
ls1 = [i for i in range(20)]  # 0到19包括0,19
print(ls1)
ls2 = [i * 2 for i in range(1, 10)]  # [2, 4, 6, 8, 10, 12, 14, 16, 18]
print(ls2)
ls3 = [i * 2 for i in range(1, 100) if i < 20]
# [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38]
print(ls3)

案例:
过滤出小于5000的工资,以列表形式返回
salary = [3500,4800,2200,5000,89000,100000]

# 1)传统方法:
ls=[]
for sal in salary:
    if not sal<5000:
        ls.append(sal)
print(ls)   # [5000, 89000, 100000]
 
# 2)推导式写法:
ls=[sal for sal in salary if sal>=5000]
print(ls)   # [5000, 89000, 100000]

ls =[234,45,66,True,False,‘hello’,‘123’,‘456123aa’,‘Bbbbbbb’,‘sssss’,‘789’,‘BAC’,‘b’,‘ZZZ’,‘232a32’]
要求:
将ls中的纯数字字符串抽取出来,并倒序排列。
需要先了解几件事:

# 1.type()用法
a = 'hello'
print(type(a))      # <class 'str'>
print(type(a)==str)      # True

# 2.ASCII码
# 判断单个字符是不是小写字母?
# 1)传统写法
code = 'x'
num = ord(code)
if num <= 122 and num >= 97:
    print('小写字母')

# 2)直接判断
if code >= 'a' and code <='z':
    print('小写字母')

# 3)直接使用方法判断
if code.islower():
    print('小写字母')

传统方法:

# 要求:将ls中的纯数字字符串抽取出来,并倒序排列。
ls = [234,45,66,True,False,'hello','123','456123aa','Bbbbbbb','sssss','789','BAC','b','ZZZ','232a32']
ls_new = []
for con in ls:
    # 1.方法验证
    # if type(con) == str and con.isdigit():
    #   print(con)
    # 123
    # 789
    # 2.ASCII码验证
    flag = True
    if type(con) ==str:
        # 是字符串
        for i in con:
            if not (i>='0' and i <='9'):
                flag = False
                break
        # 判断flag
        if flag:
            ls_new.append(con)
ls_new.sort(reverse=True)
print(ls_new)   # ['789', '123']

其他方法:

# 要求:将ls中的纯数字字符串抽取出来,并倒序排列。
ls = [234,45,66,True,False,'hello','123','456123aa','Bbbbbbb','sssss','789','BAC','b','ZZZ','232a32']
# 其他方法:all()内置函数
# mysql中any()满足任意一个,all()必须全部满足
ls_new = [i for i in ls if type(i) == str and all((j >='0' and j <= '9')for j in i)]
print(ls_new)   # ['123', '789']

作业:
制作长度为5-10的、个数为10-30的随机小写字母字符串,
以列表形式返回,输出后去掉长度小于8的,
并将符合要求的字符串随机抽取3个,最后从小到大排列输出

import random

ls1=[]
for i in range(random.randint(10,30)):
    a = ""
    for j in range(random.randint(5,10)):
        b=chr(random.randint(97,122))
        a+=b
    ls1.append(a)
#print(ls1)
 
ls2=[]
for k in ls1:
    if len(k)>=8:
        ls2.append(k)
#print(ls2)
 
ls3=[]
for x in range(0,3):
    ls3.append(random.choice(ls2))
ls3.sort()
print(ls3)

步骤更清晰版:

python列表和顺序表区别 python序列和列表_元组


4.2元组

英文:tuple
说明:列表是可变的,元组不可变
说明:元组用小括号( ),列表用中括号[ ]

Is = ["cat","dog","tiger",1024]
It = tuple(Is)#将列表类型变成元组类型,保护数据
print(It)
#('cat', 'dog', 'tiger', 1024)

元组也可以切片
元组里有列表的话,列表内部是可变的

元组切片:

tp = (1,2,3.14, True,['python','java'], 'hello' ,(1,2,3))
print(tp)
print(tp[0])    #1
print(tp[4])    # ['python', 'java']
print(tp[4:])   # (['python', 'java'], 'hello', (1, 2, 3))

注意:当元组中,只有一个元素时,需要用逗号分隔,目的是区分于字符串

tp = (1,2,3,)   #习惯
print(tp)   # (1, 2, 3)
#坑
tp1 = ('hello')
print(type(tp1))    # <class 'str'>
tp2 = ('hello',)
print(type(tp2))    # <class 'tuple'>

元组用法:

# 1.空元组
tp = ()
if tp:
    print('hello')

# 2.数值元组
tp = tuple(range(10))
print(tp)  # (01,23,4,5,6,7,8, 9)

# 3.元组加法乘法
tp1 = (1, 2, 3)
tp2 = (4, 5, 6)
print(tp1 + tp2)  # (1,2,3,4,5,6)
print(tp1 * 2)  # (1,2,3,1,2,3)

# 4.元组删除
# 元组中的删除,是删除整个元组
#tp = ('hello', 'world')
#del tp
#print(tp)  # tp変量不可用

# 5.常用方法
tp = ('hello', 'world', 'html', 'hello', 'java', 'html', 'css', 'js', 'linux', 'html')
print(tp.count('hello'))  # 2
print(tp.index('html'))  # 2    # 写tp里的元素时要注意空格,否则元素不一样
print(tp.index('html', 4, 8))  # 5 可以设置范围

# 6.max() min() sum() len()
# 7.元组推导式

tp = (i for i in range(1, 20) if i > 10)
print(tp)  # <generator object <genexpr> at 0x000002258A4DD8E0> generator 生成器
# <>表示対象
print(tuple(tp))  # (11, 12, 13, 14, 15, 16, 17, 18, 19) .

# 8.元组拆包(自动映射)
a, b, c = (1, 2, 3)
print(a)    # 1
print(b)    # 2
print(c)    # 3

# 补充:
# 列表与元组转换:
ls =[1,2,3]
tp = tuple(ls)
print(tp)   # (1,2,3)

tp = (4,5,6)
ls = list(tp)
print(ls)   # [4,5,6]

练习题:
制作元素由元组组成的列表,并以列表形式输出所有元组中出现频率最高的元素
要求:元组中的元素个数随机,元组中元素数值随机,列表中的元素个数随机

import random

ls1 = []
ls2 = []

for i in range(1, 5):
    ls = []
    for j in range(random.randint(6, 10)):
        ls.append(random.randint(11, 15))
    ls1.append(tuple(ls))
print(ls1)

ls2 = [int(x) for item in ls1 for x in item]
print(ls2)

con = [0 for i in range(20)]
for k in ls2:
    con[k] += 1
# print(con)
a = max(con)
ls3 = []
for x in range(20):
    if a == con[x]:
        ls3.append(x)
print(ls3)

步骤更清晰版:

python列表和顺序表区别 python序列和列表_python列表和顺序表区别_02


4.3字典

说明:dict()是字典函数
说明:字典与列表类似,都是可变序列,但字典是无序的,而列表和元组都是有序的 ☆
说明:有序意味着有索引值的概念 ☆
说明:字典保存的内容是键值对的形式 ☆
键值对:类似新华字典中的拼音和汉字,拼音就是key,汉字就是value
特点:键是唯一的,值可以重复 ☆
总结:列表用中括号[ ],元组用小括号( ),字典用花括号{ }

# 字典
# 类似JSON格式(爬虫的时候会涉及)
# JSON和XML两个数据格式(JSON网络传输、XML配置文件)
dt = {
    'id':10,
    'username':'root',
    'password':'123456',
    'age':1,
    'sex':1,    #值可以重复
    'id':20     #20会把10覆盖(键不能重复)
}
 
print(dt)   #{'id': 20, 'username': 'root', 'password': '123456', 'age': 1, 'sex': 1}

常见用法:

# 1.空字典
import random
 
dt = {}
if dt:
    print('hello')
 
# 2.映射函数zip()
ls1 = [1,2,3]
ls2 = ['a','b','c']
print(dict(zip(ls1,ls2)))   # {1: 'a', 2: 'b', 3: 'c'}
print(dict(zip(ls2,ls1)))   # {'a': 1, 'b': 2, 'c': 3}
 
# zip扩展:
ls=['hello','php','js']
tp=(1,2,3)
for i,j in zip(ls,tp):
    print(i,j)
#hello 1
#php 2
#js 3
 
# 3.关键字参数
dt = dict(id=10,user='admin',pwd='123456')
print(dt)   # {'id': 10, 'user': 'admin', 'pwd': '123456'}
 
# 4.清空字典
if dt.clear():
    print('hello')
 
# 5.增删改查
dt = {'id':10,'user':'admin','pwd':'123456'}
# 查
print(dt['id']) # 10(如果key不存在,报异常)
print(dt.get('pwd'))    # 123456(如果key不存在,返回None)
 
# 增:键不存在
dt['sex']='女'
# 改:键存在
dt['id']=20
print(dt)   # {'id': 20, 'user': 'admin', 'pwd': '123456', 'sex': '女'}
 
# 删
del dt['user']
print(dt)   # {'id': 20, 'pwd': '123456', 'sex': '女'}
 
# 6.遍历字典
import random
 
dt = {'id':10,'user':'admin','pwd':'123456'}
for i in dt:
    print(i)    #键
    print(dt[i])    #值
print('==========')
for k,v in dt.items():
    print(k,v)
print('==========')
for key in dt.keys():
    print(key)
print('==========')
for value in dt.values():
    print(value)
 
# 7.字典推导式(少)
dt = {i:random.randint(1,10) for i in range(10)}
print(dt)
 
# 8.in关键字
# 默认找的是key
dt = {'id':10,'user':'admin','pwd':'123456'}
if 'id' in dt:
    print('hello')  #hello

字典方法:

# 1.字典删除
dt = {'id':10,'user':'root','pwd':'123456','address':'哈尔滨'}
dt.pop('id')	# 删除
print(dt)   # {'user': 'root', 'pwd': '123456', 'address': '哈尔滨'}
 
# 2.字典生成
# 说明:fromkeys第一个参数一定是序列,第二个参数是默认值
dt = {}
print(dt.fromkeys([1,2,3])) # {1: None, 2: None, 3: None}
print(dt.fromkeys(['id','user','pwd'],'hello')) # {'id': 'hello', 'user': 'hello', 'pwd': 'hello'}
print(dt.fromkeys((4,5,6),'xxx'))   # {4: 'xxx', 5: 'xxx', 6: 'xxx'}
print(dt.fromkeys('hello')) # 键不能重复 {'h': None, 'e': None, 'l': None, 'o': None}

两种等价的随机字典生成方式:
第一种:

import random
ls=[]
for i in range(1,21):
    ls.append(i)
print(ls)
ls2 = []
for j in range(1,21):
    ls2.append(random.randint(50,100))
dt={ls[m]:ls2[m] for m in range(0,20)}
print(dt)

第二种:

import random
dt = {i:random.randint(50,100) for i in range(1,20)}
print(dt)
# 3.移除最后一项
dt = {'id':10,'user':'root','pwd':'123456','address':'哈尔滨'}
dt.popitem()
print(dt)   # {'id': 10, 'user': 'root', 'pwd': '123456'}
 
# 4.设置默认值
dt = {'id':10,'user':'root','pwd':'123456','address':'哈尔滨'}
dt.setdefault('sex','男')    #如果没有,就是添加
dt.setdefault('user','hello')   #如果有,就不设置
print(dt)
 
# 5.更新字典
dt = {'id':10,'user':'root','pwd':'123456','address':'哈尔滨'}
dt.update({'id':20})
dt.update({'user':'hello','age':10})
dt.update([('pwd','666'),('user','admin'),('sex','男')])
print(dt)
 
# 6.深浅拷贝
# copy()方法(二维以上)
# 浅拷贝:改变拷贝的内容时,原先内容也会被修改(类似快捷方式,指向的还是原先位置)
# 深拷贝:改变拷贝的内容时,原先内容不会被修改(就是完全复制出来一份)
# 一维:(默认深拷贝)
dt = {'id':10}
dt_new = dt.copy()
dt_new['id']=20
print(dt)   #{'id': 10}
 
# 二维:
# 1.浅拷贝
import copy
dt = {'con':{'user':'hello'}}
dt_new=dt.copy()
dt_new['con']['user']='admin'
print(dt)   # {'con': {'user': 'admin'}}    浅拷贝
 
# 2.深拷贝
dt = {'con':{'user':'hello'}}
dt_new=copy.deepcopy(dt)
dt_new['con']['user']='admin'
print(dt)   # {'con': {'user': 'hello'}}    深拷贝

字典方法:JSON数据格式
作用:用作网络数据传输 web网页
结构:BS机构软件(WEB端)
浏览器->服务器 发送请求Request
服务器->浏览器 接收响应Request(JSON数据)
格式:类似字典,JSON格式非常严格,必须使用双引号
注意:JSON文件中不允许写注释,多余的空行也不要有,但纯数字可以不加引号

import json
# json.loads()   将json数据格式的字符串转成字典(方便操作)
# json.dumps()  将字典转成json数据格式的字符串
 
sr = '{"id":10,"user":"root","pwd":"123456","con":"hello"}'
dt = json.loads(sr)
print(dt)   # {'id': 10, 'user': 'root', 'pwd': '123456', 'con': 'hello'}
print(type(dt))     # <class 'dict'>
print(dt['pwd'])    # 123456
 
# 需求:把整个字典作为数据进行返回(字符串)
dt = {'a':10,'b':20,'c':30}
sr = json.dumps(dt)
print(sr)   # {"a": 10, "b": 20, "c": 30}
print(type(sr)) # <class 'str'>
 
# 扩展:多层
res = '[{"id":10,"user":"hello"},{"pwd":["php","html"]},{"sex":"男","con":{"a":10,"b":20}}]'
ls = json.loads(res)
print(ls)
print(ls[1]['pwd'][1])  # html

练习题

# 1.找到公告的键,以列表形式返回 ['a','c']
# 2.找到公告的值,以列表形式返回 [250,20,30]
# 3.找到公告的键值,以字典形式返回 [{'c':20},{'res':123}]
 
dt1 = {'a':10,'b':20,'c':30,'d':250}
dt2 = {'a':250,'c':30,'e':20,'f':70}
dt3 = {'x':250,'y':255,'a':20,'c':30}
ls1=[]
ls2=[]
ls3=[]
dt={}
dt4={}
for i in dt1.keys():
    if i in dt2.keys() and i in dt2.keys():
        ls1.append(i)
print(ls1)
 
for j in dt1.values():
    if j in dt2.values() and j in dt2.values():
        ls2.append(j)
print(ls2)
  
for a ,b in dt1.items():
    if a in dt2.keys() and a in dt2.keys():
            if dt2[a]==b and dt3[a]==b:
                dt[a]=b
print(dt)

更清晰的写法:

python列表和顺序表区别 python序列和列表_python_03

练习题:
制作键为0-9的数字,值为70-100之间的随机数字典,字典输出后,将字典中值高于80的数据过滤再次输出

import random
dt_={}
 
dt=dt_.fromkeys([i for i in range(10)])
for key in dt.keys():
    dt[key]=random.randint(70,100)
print(dt) 
 
dt_new ={}
for k,v in dt.items():
    if v<=80:
        dt_new[k]=v
print(dt_new)

字典练习题:
统计随机列表(数字类)中元素出现的频度,统计结果以字典形式返回

import random
ls=[]
for i in range(random.randint(10,20)):  # 或者用ls=[random.randint(10,20) for i in range(10)]  代替for循环
    j=random.randint(5,10)
    ls.append(j)
print(ls)
dt={}
for k in ls:
    if k not in dt:    #为了高效,大大减少判断次数
        dt[k]=ls.count(k)
print(dt)

4.4集合

集合保存不重复的元素,所以主要用途就是去重
集合不可存放列表、字典、集合,只能放元组及其他基本类型
集合是无序、可变的序列

st = {41,2,22,3,1,2}
print(st)

总结:
1.无序:存储和输出的顺序不一定一致
2.去重:自动去掉重复的元素

集合常见用法:

# 1.空集合
st={}
print(type(st))     # <class 'dict'>
st = set()
print(type(st))     # <class 'set'>
if st:
    print('hello')
 
# 2.相互转换
#目的就是去重
# 列表、元组、字符串,都可以转集合 
ls = [1,2,2,3,3,3,2,1,2]
ls = list(set(ls))
print(ls)       # [1, 2, 3]
 
# 3.集合添加
st = {1,2,3,4}
st.add('hello')     # 添加一个整体
st.update('world')      # 拆分
st.update([123,456])    # 添加多个
print(st)   # {1, 2, 3, 4, 'l', 456, 'w', 'hello', 'o', 'r', 123, 'd'}
 
# 4.集合删除
st = {1,2,3,4}
st.remove(2)
print(st)   # {1, 3, 4}
 
# 5.集合清空
st = {1,2,3,4}
st.clear()
print(st)   # set()
 
# 6.集合遍历
st = {1,2,3,4}
for i in st:
    print(i)
 
# 7.特有属性
# 交集&、并集|、差集-
# 前提:一定是两个集合之间
st1 = {'php','js','python','css','html','linux','java'}
st2 = {'php','c++','R','Go','html','mysql','shell'}
print(st1 & st2)    # 交集 {'html', 'php'}
print(st1 | st2)    # 并集 {'shell', 'php', 'linux', 'java', 'css', 'mysql', 'js', 'Go', 'R', 'c++', 'html', 'python'}
print(st1 - st2)    # 差集 {'java', 'js', 'python', 'css', 'linux'}
print(st2 - st1)    # 差集 {'shell', 'R', 'mysql', 'Go', 'c++'}

总结:列表、元组、字典、集合的区别:

python列表和顺序表区别 python序列和列表_元组_04

练习题:

# 制作一个字典,键为26个大写字母,值为随机数值的元组,
# 并找出所有元组共有的数值,以列表形式返回
import random
dt = {chr(key):tuple(random.randint(5,10)for i in range(15,35))for key in range (65,91)}
print(dt)
 
# ①不用集合
st=set(dt['A'])
#del dt['A']    #提升性能
ls1 = []
for k in st:    #集合可以遍历
    flag = 1
    for m in dt.values():     #m就是各个元组
        if k not in m:
            flag = 0
            break
    if flag:
        ls1.append(k)
print(ls1)
 
# ②使用集合
st = set(dt['A'])
del dt['A']
#print(st,end='****')
for n in dt.values():
    #print(set(n))
    st = st & set(n)
print(list(st))

练习题:

# 随机打乱数组
import random
ls = [1,2,3,4,5]
random.shuffle(ls)  # 随机打乱
print(ls)
 
# 自己写:
ls =    
length = len(ls)-1
for i in range(length):
    index = random.randint(0,length-i)
    tmp = ls[index]
    ls[index] = ls[length-i]
    ls[length-i] = tmp
print(ls)

4.5字符串(重要)

str()是字符串函数
说明:程序对字符串的处理非常多,开发一个项目,基本上就是不断处理字符串,所以字符串很重要

字符串常见用法:

# 1.拼接
print('hello'+'world')  # helloworld
 
# 2.长度:len()
# 说明: len()函数获取序列长度
dt = {'id':10,'user':'root'}
print(len(dt))  # 2
st = {1,2,3,4,2}
print(len(st))  # 4
sr = 'hello'
print(len(sr))  # 5
 
# 3.编码:utf-8/gbk
# 场景:统计字符串长度(中文)
sr = 'hello,老师真帅。'
print(len(sr))  # 11(默认一个中文算一个长度)
sr_encode = sr.encode('utf-8')
print(sr_encode)    # b'hello,\xe8\x80\x81\xe5\xb8\x88\xe7\x9c\x9f\xe5\xb8\x85\xe3\x80\x82'
# 解码:decode()
print(sr_encode.decode('utf-8'))    # hello,老师真帅。
print(len(sr.encode('utf-8')))  # 编码 21 (一个中文算3个长度,句号也算)
print(len(sr.encode('gbk')))    # 编码 16 (一个中文算两个长度)
 
# 4.截取:
# 切片:索引
# 列表、元组、字符串都可以切片(集合、字典是无序的,没有索引值,所以无法切片)
sr = 'hello,python'
print(sr)
print(sr[6:])    # python
 
# 5.分割:
sr = 'php,html,css,java,python,c'
ls = sr.split(',')
print(ls)   # ['php', 'html', 'css', 'java', 'python', 'c']
 
# 6.替换
sr = 'hello'
print(sr.replace('ll','xx'))    # hexxo
print(sr)   # hello
# 注意方法的返回值
 
# 7.检索
# count() 检索出现多少次
# index() 检索首次的索引
sr = 'hello,python,php'
print(sr.count('p'))   # 3
print(sr.index('p'))   # 6(没有报错)
print(sr.find('p'))    # 6(比较友好,没有返回-1)
 
# 8.大小写转换
# 场景:验证码
# ASCII大小写完全两个值
sr = 'hello'
print(sr.lower())   # hello
print(sr.upper())   # HELLO
 
# 9.去掉空格
# 场景:搜索
# 注意:空格也算字符
sr = ' he llo  '
print(len(sr))  # 9
print(sr.strip())   # he llo 去掉左右两边的空格(空白:换行符也可以去掉)
# 注意:中间空格无法去掉
sr = 'xhello'
print(sr.strip('x'))    # hello
 
# 10.格式化
# 1)print('f')
# 2)format()
# 3)拼接 +
 
sr = 'hello {},操作真{}~'
print(sr.format('帅哥',6))    # hello 帅哥,操作真6~
sr = 'hello,%s,你真%s~'
print(sr % ('帅哥','帅'))  # hello,帅哥,你真帅~

专题用法:

# 1.关于转换
# 字符串->列表
# 字符串->元组
# 字符串->集合
# 字符串->字典 (不行)
sr = 'hello'
print(list(sr))     # ['h', 'e', 'l', 'l', 'o']
print(tuple(sr))    # ('h', 'e', 'l', 'l', 'o')
print(set(sr))      # {'h', 'o', 'e', 'l'}
 
# 2. join()方法
# 写法:str.join(序列)
# 前提:序列中的元素类型必须是字符串
# ls = [1,2,3]
ls = ['python','css','java','html','c++']
sr = '/'.join(ls)
print(type(sr))     # <class 'str'>
print(sr)          # python/css/java/html/c++
 
# 3.判断纯字符串中的类型
sr = '123'
print(sr.isdigit())     # 纯数字
 
# 4.其他方法
sr = 'hello'
print(sr.capitalize())  # Hello
# 说明:字符串对象里封装了很多方法,如果有些方法不知道,可以用其他逻辑方法进行处理
# 但更多记住这些内置的方法,就能够提升编程效率

is开头
1、isspace判断指定的字符串是否全部由空白字符组成。
2、isalpha判断指定的字符串是否全部由字母组成。
3、isdecimal。
判断指定字符串是否全部由十进制数字组成。
4、Isnumeric。
判断指定的字符串是否全部由数字组成。
5、Isalnum。
判断指定的字符串是否全部由字母和数字组成。

print('\t  \r     \n'.isspace())    # True
print('abc'.isalpha())   # True
print('abc1'.isalpha())  # False
print('123'.isdecimal())        # True
print('123六Ⅵ'.isdecimal())     # False
print('123六Ⅵ'.isnumeric())     # True
print('123六Ⅵa'.isnumeric())    # False
print('abc123六Ⅵ'.isalnum())    # True
print('abc123六Ⅵ!'.isalnum())   # False

练习题:

# 去掉所有空格
sr = " he llo , wor ld! "
# 方法(1)
s = ''
for i in sr:
    if i != ' ':
        s += i
print(s)    # hello,world!
# 方法(2)
s=''
for i in sr.strip().split():    # sr.strip(rm):  rm为要深处的字符序列,rm为空时,默认删除空白符
    s += i
print(s)    # hello,world!
# 方法(3)
s = ''.join(sr.split(' '))  # join:用分隔符连接字符串中的元素,这里的''就是分隔符
print(s)    # hello,world!
# 方法(4)
s = sr.replace(' ','')
print(s)    # hello,world!
# 方法(5)
import re
s = re.sub(' ','',sr)   # 用sub函数来查询替换
print(s)    # hello,world!

练习题:

# 将字符串改为字典,要求键为选项,值为内容,
# 并按字母顺序排序。
# 法一:
sr = "B.JavaWeb,D.PythonWeb,A.Java大数据,C.Python人工智能"
print({i[0]:i[2:] for i in sorted(sr.split(','))})
# 法二:
ls = sr.split(',')
ls.sort()
ls_new = []
dt={}
for i in ls:
    ls_new.append(tuple(i.split('.')))
dt.update(ls_new)
print(dt)

4.6正则表达式

说明:正则是专门用来处理字符串的一个规则
为什么要用正则:

需求1:判断用户名长度为[8,16]位

uname = input('请输入用户名:')
# 验证合法性:
if len(uname)>=8 and len(uname)<=16:
    print('合法')
else:
    print('非法')
# 似乎没毛病

需求2:判断密码长度为[8,16]位,字符只能是英文或数字或下划线,且要大写字母开头 (逻辑处理):

username = input('用户名:')
length = len(username)
if length>=8 and length<=16:    # 密码长度为[8,16]位
    code = ord(username[0])
    if code>=65 and code<=90:   # 大写字母开头
        i=1
        flag=1 # 设置标志位
        while i <=length-1:
            z = ord(username[i])
            if not((z>=48 and z<=57) or (z>=65 and z<=90) or (z>=97 and z<=122) or z==95):  # 字符只能是数字或英文或下划线
                flag=0
                break
            i+=1
        if flag==1:
            print('合法')
        else:
            print('对不起,密码必须由数字、英文或下划线组成!')
    else:print('对不起,大写字母开头')
else:
    print('对不起,长度不合要求')
# 思路是利用ASCII码,用正常的逻辑代码可以实现,但很麻烦,麻烦就违背了编程的宗旨

# 正则写法:

import re
uname = input('请输入用户名:')
if re.match(r'^[A-Z][A-Za-z0-9_]{7,15}$',uname):
    print('合法')
else:
    print('非法')

re.match:尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match就返回none (只匹配字符串的开始)
re.findall:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空

1.常用正则符号(输入法要切成英文):
^开头:Shift+6
$结尾:Shift+4
情景1:匹配用户输入的内容是否合法:需要开头结尾
情景2:对内容进行部分匹配:不需要用开头结尾
.表示任意一个字符:除了换行\r\n(英文句号)
+表示1个或多个字符(至少1个)【向左修饰原则】
?表示0个或1个字符【向左修饰原则】
*表示0个或多个字符【向左修饰原则】

例:

import re
sr = 'hello,world'
# res = re.findall(r'l',sr)   # ['l', 'l', 'l']
res = re.findall(r'l+',sr)  # ['ll', 'l']
# res = re.findall(r'l?',sr)  # ['', '', 'l', 'l', '', '', '', '', '', 'l', '', '']
# res = re.findall(r'l*',sr)  # ['', '', 'll', '', '', '', '', '', 'l', '', '']
print(res)
import re
#sr = 'hello,world'
# res = re.findall(r'hel',sr) # ['hel']
 
#sr = 'hxllo,world'
# res = re.findall(r'h.l',sr) # ['hxl']
# res = re.findall(r'h.+l',sr)    # ['hxllo,worl'] 默认贪婪匹配(尽可能多匹配)
# res = re.findall(r'h.+?l',sr)   # ['hxl'] 默认懒惰匹配(尽可能少匹配)
 
sr = 'h123xxx456xxxllo,world'
# 扩展需求:就要123xxx456xxx
res = re.findall(r'h(.*?)l',sr) # ['123xxx456xxx']
# res = re.findall(r'h(.*)l',sr)  ['123xxx456xxxllo,wor']
print(res)

.*?表示非贪心算法,表示要精确的配对;加括号表示只获取() 之间的数据
.*表示贪心算法,表示要尽可能多的匹配

花括号{}: {n}表示重复n次: {6}表示重复6次【向左修饰原则】
{n,}表示至少重复n次【向左修饰原则】
{n,m}表示重复n-m次:闭区间【向左修饰原则】

import re
#sr = 'hello,world'
# res = re.findall(r'l+',sr)      #['ll', 'l']
# res = re.findall(r'l{2}',sr)    # ['ll']
 
#sr = 'hello,world,helllo'
#res = re.findall(r'l{2}',sr)    # ['ll', 'll']
#print(res)
 
sr = 'hello,world,hellllo'
#res = re.findall(r'l{2}',sr)    # ['ll', 'll', 'll']
#res = re.findall(r'l{2,}',sr)   # ['ll', 'llll']
res = re.findall(r'l{1,3}',sr)  # ['ll', 'l', 'lll', 'l']
print(res)

中括号[]: [xyz]表示取x或取y或取z:只取单个字符
[0-9]表示取任意一个数字
[a-z]表示取任意一个小写字母
[A-Z]表示取任意一个大写字母
[^xyz]表示取反,也就是除了x或y或z取其他字符
[\u4e00-\u9fa5]表示任意一个汉字,有6w+个

import re
#sr = 'hello,world!'
# res = re.findall(r'[helo]',sr)  # ['h', 'e', 'l', 'l', 'o', 'o', 'l']
# res = re.findall(r'[helo]+',sr)     # ['hello', 'o', 'l']
# res = re.findall(r'[a-z]+',sr)      # ['hello', 'world']
 
sr = 'hello,world!帅哥,美女!123,456!'
# res = re.findall(r'[0-9]+',sr)  # ['123', '456']
res = re.findall(r'[\u4e00-\u9fa5]+',sr)        # ['帅哥', '美女']
print(res)

|表示选择,或者关系:

import re
sr = 'hello,xyz!world!'
# res = re.findall(r'[xyz]',sr)   # ['x', 'y', 'z']
res = re.findall(r'hello|xyz',sr)   # ['hello', 'xyz']
print(res)

反斜线:
正斜线:/
\d 匹配数字:相当于0-9(重要)
\D 匹配非数字
\w 匹配英文、数字、下划线、汉字(重要)
\W 匹配非英文、数字、下划线、汉字
\s 匹配空白符:空格、换行(文件操作IO)
\S匹配非空白(不包括换行)

import re
sr = 'hello,123,帅哥!~'
# 匹配英文、数字、中文
res = re.findall(r'\w+',sr)     # ['hello', '123', '帅哥']
# 匹配纯数字
res2 = re.findall(r'\d+',sr)    # ['123']
res3 = re.findall(r'[A-Za-z]+',sr)
print(res3)     # ['hello']

\表示转义符:把带有特殊意义的字符,转成普通字符
r 表示原生字符串:写在规则前面(结论:规则前要加r)
r可以理解为固定写法:有的需要转义,有的不需要,就直接写r就全不要了

import re
sr = 'hello,\d!'
#res = re.findall('\\\d',sr)    # ['\\d']
res = re.findall(r'\\d',sr) # ['\\d']
print(res)

案例:验证手机号是否合法,要求1开头,后面数字位3到9且长度刚好为有10位,

import re
tel = input('请输入手机号:')
if re.match(r'^1[3456789]\d{9}$',tel):
    print('合法')
else:
    print('非法')

re模块下五种常用方法:match/findall/search/split/sub

1)re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match就返回none (只匹配字符串的开始)

import re
ls = ['Hello,world','hello,python','hi,hello','123,hello','hello']
pattern = r'hello.*'
for i in ls:
    res = re.match(pattern,i)
    if res:
        print(res.group())  # match对象获取需要更进一步,不能直接print(res)否则会出现<_sre.SRE_Match object; span=(0, 12), match='hello,python'>这样
    else:
        print(res)
'''
None
hello,python
None
None
hello
'''

2)使用findall()方法进行匹配:在整个给定字符串中,搜索所有符合正则规则的字符串
3)使用search()方法进行匹配:在整个字符串中搜索第1个匹配的值(天然懒)

import re
sr = 'hello,py_css,py_html,py_python'
pattern = r'py_[a-z]+'
res = re.search(pattern,sr)
print(res)      # <_sre.SRE_Match object; span=(6, 12), match='py_css'>
print(res.group())  # py_css  search对象获取需要更进一步

4)使用sub()替换字符串:把符合正则规则的字符串,进行替换成指定的字符串

import re
sr = '恭喜13888889999用户喜中双色球1000w大奖!'
# 需求:将电话号码变成****
res = re.sub(r'1[123456789]\d{9}','****',sr)    # 恭喜****用户喜中双色球1000w大奖!
print(res)

5)使用split()分割字符串:把符合正则规则的字符串,分割出来(分割的规则,就是正则的规则)

import re
sr = 'php!python@css#html$js%sql^c++*java,mysql8'
# 需求:获取所有语言名称
res = re.split(r'[!@#&%^*$,]',sr)
print(res)      # ['php', 'python', 'css', 'html', 'js', 'sql', 'c++', 'java', 'mysql8']
import re
sr = "恭喜13877779999喜中双色球1000w大奖,15788001122用户也中了。"
res = re.sub(r'(1[0123456789]\d{1})(\d{4})(\d{4})',r'\1****\3',sr)  #\1表示第1个分组的内容,\3表示第3个分组的内容
print(res)  # 恭喜138****9999喜中双色球1000w大奖,157****1122用户也中了。
# 2.小练习
import re
sr = "12.一代天骄成吉思汗,只识弯弓射大雕。9.须晴日,看红装素裹,分外妖娆。2.千里冰封,5.惟余莽莽;3.万里雪飘,4.望长城内外,6.大河上下,1.北国风光,7.顿失滔滔。8.山舞银蛇,原驰蜡象,欲与天公试比高。11.惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。13.俱往矣,数风流人物,还看今朝。10.江山如此多娇,引无数英雄竞折腰。"
# res1 = re.findall(r'\d+[^\d]+',sr)    
res1 = re.findall(r'\d+\D+',sr)
print(res1)
dt = {}
for i in res1:
    res2 = i.split('.')
    dt[res2[0]] = res2[1]
print(dt)
for j in range(len(dt)):
    print(dt[str(j+1)])

python列表和顺序表区别 python序列和列表_html_05