Python全栈开发-Python基础教程-04字符串和散列类型

字符串和散列类型

一. 字符串

之前我们简单提到了字符串的格式化方法,现在我们将继续深入讨论其详细方法
更多详细字符串函数操作请参考 字符串函数操作大全

1.1 字符串的修改—replace()

首先我们尝试通过下标赋值来修改更新字符串

str1 = "hello,world"
str1[1] = '0'        #将str1中下标为1的字符改为o

输出结果:

Traceback (most recent call last):
  File "C:\Users\admin\Desktop\new.py", line 2, in <module>
    str1[1] = '0'
TypeError: 'str' object does not support item assignment

由此可见,字符串和列表不同,不能修改,通常称为字符串的不可变,如果要修改字符串,那么需要调用字符串内置的方法并且重新赋值

replace() 函数

描述:返回字符串str的副本,所有old子字符串被替换为new字符串。

语法:str.replace(old, new, count) -> str 返回字符串str的副本

  • old —— 将被替换的子字符串。
  • new —— 新子字符串,用于替换old子字符串。
  • count —— 替换的次数,默认全部替换。

程序示例:

s = "i love python python "
print(s.replace("o","w")) #默认字符串中的全部"o" 全部替换为"w"
print(s.replace("o","w",2)) #只替换掉前两个子字符串 "o"
print(s.replace("python","c++"))  #子字符串可以是多个字符。
print(s.replace("python","c++",1))

运行结果:

i lwve pythwn pythwn 
i lwve pythwn python 
i love c++ c++ 
i love c++ python 

1.2 字符串的切割—split()

描述:拆分字符串。通过指定分隔符sep对字符串进行分割,并返回分割后的字符串列表。

语法: str.split(sep=None, maxsplit=-1) -> list of strings 返回 字符串列表 或str.split(sep=None, maxsplit=-1)[n]

  • sep —— 分隔符,默认为空格,但不能为空即(")。
  • maxsplit —— 最大分割参数,默认参数为-1。
  • [n] —— 返回列表中下标为n的元素。列表索引的用法。

程序示例:

str1 = "i love python"
str2 = "https://www.baidu.com"
str3 = "scriptscript"
str4 = "i \n love \n python"
print(str1.split())         #默认空格分割。
print(str2.split("."))      #以"."为分隔符,maxsplit默认为-1
print(str2.split(".",-1))   #maxsplit为-1
print(str2.split(".",1))    #以"."为分隔符,分割一次。
print(str2.split(".")[1])   #分割后,输出列表中下标为1的元素
print(str3.split("<")[1].split(">")[0])
print(str4.split("\n"))     #可用于去掉字符串中的"\n" "\t"等

运行结果:

['i', 'love', 'python']
['https://www', 'baidu', 'com']
['https://www', 'baidu', 'com']
['https://www', 'baidu.com']
baidu
i love python
['i ', ' love ', ' python']

1.3 字符串的查找—find()

描述:查找字符串中指定的子字符串sub第一次出现的位置,可以规定字符串的索引查找范围。若无则返回 -1。

语法:str.find(sub,start,end) -> int 返回整数

  • sum —要索引的子字符串。
  • start —索引的起始位置。默认值为0。
  • end —索引的结束位置。默认值为字符串长度len(str)。
  • [start,end) 不包括end。

程序示例:

str = "i love python"
print(str.find("o"))      #索引子字符串"o"
print(str.find("0",4))    #索引起始位置为4 索引范围为:ve python
print(str.find("o",4,12)) #索引起始位置为4,结束位置为12 索引范围为:ve pytho
print(str.find(""))
print(str.find(" "))      #返回第一个空格出现的位置。
print(str.find("k"))      #索引子字符串"k",不存在,返回-1

运行结果:

3
-1
11
0
1
-1

1.4 字符串的转义

在需要在字符中使用特殊字符时,python 用反斜杠 \ 转义字符。如下表:
Python全栈开发-Python基础教程-04字符串和散列类型_第1张图片
程序示例:

print('this\tis\ta\tapple')    #制表符
print('this\\tis\\ta\\tapple') #转义反斜杠
print('python\ngood')          #换行符
print('python\\good')          #转义反斜杠
print('what\'s your name')     #取消单引号
print(r'this\tis\ta\tapple')   #以原格式输出

运行结果:

this	is	a	apple
this\tis\ta\tapple
python
good
python\good
what's your name
this\tis\ta\tapple

1.5 字符串的编码—encode()

encode() 方法为字符串类型(str)提供的方法,用于将 str 类型转换成 bytes 类型,这个过程也称为“编码”。

encode() 方法的语法格式如下:

str.encode([encoding="utf-8"][,errors="strict"])

注意,格式中用 [ ] 括起来的参数为可选参数,也就是说,在使用此方法时,可以使用 [ ] 中的参数,也可以不使用。

该方法各个参数的含义如下表所示。
Python全栈开发-Python基础教程-04字符串和散列类型_第2张图片

注意,使用 encode() 方法对原字符串进行编码,不会直接修改原字符串,如果想修改原字符串,需要重新赋值。

程序示例:

print('落空空'.encode('utf-8'))
print('落空空'.encode('gbk'))

运行结果:

b'\xe8\x90\xbd\xe7\xa9\xba\xe7\xa9\xba'
b'\xc2\xe4\xbf\xd5\xbf\xd5

decode()

和 encode() 方法正好相反,decode() 方法用于将 bytes 类型的二进制数据转换为 str 类型,这个过程也称为“解码”。

decode() 方法的语法格式如下:

bytes.decode([encoding="utf-8"][,errors="strict"])

该方法中各参数的含义如下表所示。
Python全栈开发-Python基础教程-04字符串和散列类型_第3张图片
程序实例:

str1 = '落空空'.encode('utf-8')
print('落空空'.encode('utf-8'))
print(str1.decode('utf-8'))

运行结果:

b'\xe8\x90\xbd\xe7\xa9\xba\xe7\xa9\xba'
落空空

1.6 其他字符串方法

程序实例:

str1 = 'this Is a Apple'
str2 = '     python     '
print(str1.upper())         #全变成大写
print(str1.lower())         #全变成小写
print(str1.capitalize())    #首字母大写
print(str1.title())         #标题形式,单词字母大写
print(str2.strip())         #去掉两边空格
print(str2.rstrip())        #去掉右边空格
print(str2.lstrip())        #去掉左边空格

运行结果:

THIS IS A APPLE
this is a apple
This is a apple
This Is A Apple
python
     python
python     

二. 字典

2.1 字典的概念

字典也是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据。

比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。

为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value。形象地看,字典中 key 和 value 的关联关系如下图所示:
Python全栈开发-Python基础教程-04字符串和散列类型_第4张图片
由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。

程序既可使用花括号语法来创建字典,也可使用 dict() 函数来创建字典。实际上,dict 是一种类型,它就是 Python 中的字典类型。

在使用花括号语法创建字典时,花括号中应包含多个 key-value 对,key 与 value 之间用英文冒号隔开;多个 key-value 对之间用英文逗号隔开。

2.2 字典的创建

程序实例:

scores = {'语文': 89, '数学': 92, '英语': 93}
print(scores)
empty_dict = {}   # 空的花括号代表空的dict
print(empty_dict) # 使用元组作为dict的key
dict2 = {(20, 30):'good', 30:'bad'}
print(dict2)

运行结果:

{'语文': 89, '数学': 92, '英语': 93}
{}
{(20, 30): 'good', 30: 'bad'}

需要指出的是,元组可以作为 dict 的 key,但列表不能作为元组的 key。这是由于 dict 要求 key 必须是不可变类型,但列表是可变类型,因此列表不能作为元组的 key。

2.3 字典的访问

程序实例:

dict1 = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'}
print(dict1['ob1']) #通过key来访问value
print(dict1['ob4']) #如果用字典里没有的键访问数据,会输出错误
for key in dict1:  #访问所有值
    print(key,dict1[key])

运行结果:

computer
Traceback (most recent call last):
  File "C:\Users\admin\Desktop\new.py", line 3, in <module>
    print(dict1['ob4']) #如果用字典里没有的键访问数据,会输出错误
KeyError: 'ob4'
ob1 computer
ob2 mouse
ob3 printer

2.4 字典元素的添加修改—update()

程序实例:

dict1 = {'ob1':'computer', 'ob2':'mouse'}
dict2={'ob3':'printer'}
dict1.update(dict2)    #update()方法可以用来将一个字典的内容添加到另外一个字典中
print(dict1)
dict1['ob4'] = 'book'  #对不存在的key赋值,也属于字典的更新修改
print(dict1)

运行结果:

{'ob1': 'computer', 'ob2': 'mouse', 'ob3': 'printer'}
{'ob1': 'computer', 'ob2': 'mouse', 'ob3': 'printer', 'ob4': 'book'}

2.5 字典元素的删除

程序实例:

dict = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'}
del dict['ob1'] #能删单一的元素
print(dict)

dict1={'ob1':'computer','ob2':'mouse','ob1':'printer'}
dict1.clear() #删除字典中所有元素
print(dict1)

dict1 = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'}
del dict1     #删除整个字典,删除后访问字典会抛出异常
print(dict1)

dict1 = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'}
dict1.pop('ob1') #删除指定key对应的value
print(dict1)
dict1.popitem()  #随即删除键值对
print(dict1)

运行结果:

{'ob2': 'mouse', 'ob3': 'printer'}
{}
Traceback (most recent call last):
  File "C:\Users\admin\Desktop\new.py", line 11, in <module>
    print(dict1)
NameError: name 'dict1' is not defined
{'ob2': 'mouse', 'ob3': 'printer'}
{'ob2': 'mouse'}

三. 集合

3.1 集合的概念

1.集合是一个可变容器
2.集合内的数据对象都是唯一的(不能重复)
3.集合是无序的存储结构,集合内的数据没有先后关系
4.集合是可迭代对象
5.集合相当于是只有键没有值得字典(键就是集合中的数据)
6.集合内的元素是不可变的

3.2 集合的创建

注意:当集合内有重复元素时,输出集合会自动将重复元素去掉

程序实例:

s = {1,2,3,1,2,3,4,5}  #注意这里运行后无重复
print(s)      
print(type(s))         #集合类型
s1 = {1}
print(s1)

运行结果:

{1, 2, 3, 4, 5}
<class 'set'>
{1}

3.3 集合的运算

3.3.1 交集 &

程序实例:

s1 = {1,2,3}
s2 = {2,3,4}
s3 = s1 & s2
print(s3)

运行结果:

{2, 3}
3.3.2 并集 |

程序实例:

s1 = {1,2,3}
s2 = {2,3,4}
s3 = s1 | s2
print(s3)

运行结果:

{1, 2, 3, 4}
3.3.3 差集

程序实例:

s1 = {1,2,3}
s2 = {2,3,4}
s3 = s1 - s2
print(s3)

运行结果:

{1}

3.4 集合的增删改查

3.4.1 添加add() update()

add()
程序实例:

set1 = {1,2,3,4,5}
set1.add(6)   #添加新元素
print(set1)
set1.add(1)   #添加已有元素不变
print(set1)

运行结果:

{1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5, 6}

update()
程序实例:

set1 = {1,2,3,4,5}
set1.update('6')  #不能直接添加数字类型,因为数字类型不可迭代
print(set1)       

set1.update('abc')
print(set1)      

set1.update([1,7,8,9])
print(set1)     

运行结果:

{1, 2, 3, 4, 5, '6'}
{1, 2, 3, 4, 5, 'b', 'a', '6', 'c'}
{1, 2, 3, 4, 5, 'b', 'a', 7, 8, 9, '6', 'c'}
3.4.2 删除

程序示例:

set1 = {1,2,3,4,5}
set1.pop()          #随机删除一个元素,将元素值返回
print(set1)
set1.remove(2)      #指定删除一个元素,找不到就会报错
print(set1)
set1.clear()        #清空整个集合
print(set1)
del set1            #删除整个集合
print(set1)

运行结果:

{2, 3, 4, 5}
{3, 4, 5}
set()
Traceback (most recent call last):
  File "C:\Users\admin\Desktop\new.py", line 9, in <module>
    print(set1)
NameError: name 'set1' is not defined
3.4.3 查询

由于集合是无序的又没有索引,所以查询集合元素只有一种,那就是循环,如下:
程序实例:

set1 = {1,2,3,4,5}
for s in set1:
    print(s)

运行结果:

1
2
3
4
5
3.4.4 集合判断

程序实例:

set1 = {1,2,3}
set2 = {'a','b','c'}
set3 = {1,2,'a'}
print(set1.isdisjoint(set2))  #没有交集返回Ture
print(set1.isdisjoint(set3))  #有交集返回False
print(set1.issubset(set2))    #判断集合1是否包含于集合2 包含返回Ture
print(set1.issubset(set3))    #判断集合1是否包含于集合3 不包含返回False

运行结果:

True
False
False
False

四. 作业

本节作业:

1、 找出两个列表中相同元素,并打印出来
2、统计一串字符中,每个字母 a~z的出现次数,忽略大小写
3、利用26个字母和10个数字,随机生成10个8位密码
4、判断用户输入的是不是一个手机号码,并且是不是以13开头的手机号

上节答案

1.for循环99乘法表

#for循环九九乘法表
for i in range(1,10):
    for j in range(1,i+1):
        print(f'{j}x{i}={i*j}',end='\t')#可以使用多种格式化方式这只是其中一种
        j += 1
    print()
    i += 1

运行结果:

1x1=1	
1x2=2	2x2=4	
1x3=3	2x3=6	3x3=9	
1x4=4	2x4=8	3x4=12	4x4=16	
1x5=5	2x5=10	3x5=15	4x5=20	5x5=25	
1x6=6	2x6=12	3x6=18	4x6=24	5x6=30	6x6=36	
1x7=7	2x7=14	3x7=21	4x7=28	5x7=35	6x7=42	7x7=49	
1x8=8	2x8=16	3x8=24	4x8=32	5x8=40	6x8=48	7x8=56	8x8=64	
1x9=9	2x9=18	3x9=27	4x9=36	5x9=45	6x9=54	7x9=63	8x9=72	9x9=81

2、一个列表中有重复元素,编写程序,移除重复元素
列表:li = [1,1,1,2,2,3,3,3,3,3,3,4,4,5,6,5,6]

方法1:

#方法一
li = [1,1,1,1,1,2,2,2,3,3,3,3,4,4,5,6,5,6]
for i in li.copy():
    if li.count(i) > 1:
        li.remove(i)
print(li)

运行结果:

[1, 2, 3, 4, 5, 6]

方法2:

#方法二
li = [1,1,1,1,1,2,2,2,3,3,3,3,4,4,5,6,5,6]
li1 = []
for i in li:
    if i not in li1:
        li1.append(i)
print(li)
print(li1)

运行结果:

[1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 6, 5, 6]
[1, 2, 3, 4, 5, 6]

你可能感兴趣的:(python基础,python,字符串)