【重学Python】Day5 长篇:字符串和常用数据结构

字符串和常用数据结构

  • 一、转义字符
  • 二、切片
  • 三、字符串的处理
  • 四、格式化输出
  • 五、列表list
      • 1、列表的基本运算
      • 2、列表的添加、删除元素
      • 3、列表的切片
      • 4、列表的排序
  • 六、生成式和生成器
  • 七、元组
  • 八、集合
  • 九、字典

在Python程序中,如果我们把单个或多个字符用单引号或者双引号包围起来,就可以表示一个字符串。

s1 = '你好'
s2 = "你好"
# 三个单引号或三个双引号的字符串可以换行
s3 = '''
你
好
'''输出:
你好 你好 
你
好

一、转义字符

在字符串中使用\(反斜杠)来表示转义,也就是说\后面的字符不再是它原来的意义,例如:\n不是代表反斜杠和字符n,而是表示换行;而\t也不是代表反斜杠和字符t,而是表示制表符。所以如果想在字符串中表示'要写成\',同理想表示\要写成\\。可以运行下面的代码看看会输出什么。

在 Python 中,end=''print() 函数的一个参数,用于控制输出的结束方式。具体来说,它的作用是防止 print() 函数在输出完毕后自动换行,而是在输出的末尾添加一个空字符串。

end='' 常常位于 print() 函数的末尾,与前一个函数用 ',' 隔开。

s1 = '\'你好\''
s2 = '\n\\你好\\\n'
print(s1, s2, end='')输出:
'你好' 
\你好\

\后面还可以跟一个八进制或者十六进制数来表示字符,例如\141\x61都代表小写字母a,前者是八进制的表示法,后者是十六进制的表示法。也可以在\后面跟Unicode字符编码来表示字符。

s1 = '\141\142\143\x61\x62\x63'
s2 = '\u4e2d\u56fd'
print(s1, s2)输出:
abcabc 中国

如果不希望字符串中的\表示转义,我们可以通过在字符串的最前面加上字母r来加以说明

s1 = r'\'hello, world!\''
s2 = r'\n\\hello, world!\\\n'
print(s1, s2, end='')输出:
\'hello, world!\' \n\\hello, world!\\\n

二、切片

Python为字符串类型提供了非常丰富的运算符,我们可以使用+运算符来实现字符串的拼接,可以使用*运算符来重复一个字符串的内容,可以使用innot in来判断一个字符串是否包含另外一个字符串(成员运算),我们也可以用[][:]运算符从字符串取出某个字符或某些字符(切片运算)。

s1 = 'hello ' * 3
print(s1) # hello hello hello 
s2 = 'world'
s1 += s2
print(s1) # hello hello hello world
print('ll' in s1) # True
print('good' in s1) # False
str2 = 'abc123456'
# 从字符串中取出指定位置的字符(下标运算)
print(str2[2]) # c
# 字符串切片(从指定的开始索引到指定的结束索引)
print(str2[2:5]) # c12
print(str2[2:]) # c123456
print(str2[2::2]) # c246
print(str2[::2]) # ac246
print(str2[::-1]) # 654321cba
print(str2[-3:-1]) # 45

三、字符串的处理

在Python中,我们还可以通过一系列的方法来完成对字符串的处理。

str1 = 'hello, world!'
# 通过内置函数len计算字符串的长度
print(len(str1)) # 13
# 获得字符串首字母大写的拷贝
print(str1.capitalize()) # Hello, world!
# 获得字符串每个单词首字母大写的拷贝
print(str1.title()) # Hello, World!
# 获得字符串变大写后的拷贝
print(str1.upper()) # HELLO, WORLD!
# 从字符串中查找子串所在位置
print(str1.find('or')) # 8
print(str1.find('shit')) # -1
# 与find类似但找不到子串时会引发异常
# print(str1.index('or'))
# print(str1.index('shit'))
# 检查字符串是否以指定的字符串开头
print(str1.startswith('He')) # False
print(str1.startswith('hel')) # True
# 检查字符串是否以指定的字符串结尾
print(str1.endswith('!')) # True
# 将字符串以指定的宽度居中并在两侧填充指定的字符
print(str1.center(50, '*'))
# 将字符串以指定的宽度靠右放置左侧填充指定的字符
print(str1.rjust(50, ' '))
str2 = 'abc123456'
# 检查字符串是否由数字构成
print(str2.isdigit())  # False
# 检查字符串是否以字母构成
print(str2.isalpha())  # False
# 检查字符串是否以数字和字母构成
print(str2.isalnum())  # True
str3 = '  xxx@xxx.com '
print(str3)
# 获得字符串修剪左右两侧空格之后的拷贝
print(str3.strip())

四、格式化输出

a, b = 5, 10
print('%d * %d = %d' % (a, b, a * b))输出结果:
5 * 10 = 50

当然,我们也可以用字符串提供的方法来完成字符串的格式,代码如下所示。

a, b = 5, 10
print('{0} * {1} = {2}'.format(a, b, a * b))输出结果:
5 * 10 = 50

Python 3.6以后,格式化字符串还有更为简洁的书写方式,就是在字符串前加上字母f,我们可以使用下面的语法糖来简化上面的代码。

a, b = 5, 10
print(f'{a} * {b} = {a * b}')输出结果:
5 * 10 = 50

五、列表list

列表是值的有序序列,每个值都可以通过索引进行标识,定义列表可以将列表的元素放在[]中,多个元素用逗号分隔,可以使用for循环对列表进行遍历,也可以使用[],[:]运算符对列表中的一个或多个元素操作。

1、列表的基本运算

list1 = [1,2,3]
print(list1)
list2 = ['world'] * 2
print(list2)
print(len(list1))
print(list1[0])
print(list1[-2])
list1[2] = 666
print(list1)
for index in range(len(list1)):print(list1[index])
for elem in list1:print(elem)
for index,elem in enumerate(list1):print(index,elem)
# 通过enumerate函数处理列表之后再遍历可以同时获得元素索引和值输出结果:
[1, 2, 3]
['world', 'world']
3
1
2
[1, 2, 666]
1
2
666
1
2
666
0 1
1 2
2 666

2、列表的添加、删除元素

list1 = [1,3,5,7,9,100]
#添加元素
list1.append(666)
list1.insert(888,999)
# 合并两个列表
list1 += [111,222]
print(list1)
print(len(list1))
if 100 in list1:list1.remove(100)
print(list1)
#从指定位置删除元素
list1.pop(0)
print(list1)
list1.pop(len(list1)-1)
print(list1)
#清空列表
list1.clear()
print(list1)输出:
[1, 3, 5, 7, 9, 100, 666, 999, 111, 222]
10
[1, 3, 5, 7, 9, 666, 999, 111, 222]
[3, 5, 7, 9, 666, 999, 111, 222]
[3, 5, 7, 9, 666, 999, 111]
[]

3、列表的切片

animals = ['monkey','rabbit','tiger','lion']
animals += ['snake','elephant','giraffe']
#切片
animals2 = animals[1:4]
print(animals2)
#通过完整切片来复制列表
animals3 = animals[:]
print(animals3)
animals4 = animals[-2:-1]
print(animals4)
#通过反向切片获得倒转的列表
animals5 = animals[::-1]
print(animals5)输出结果:
['rabbit', 'tiger', 'lion']
['monkey', 'rabbit', 'tiger', 'lion', 'snake', 'elephant', 'giraffe']
['elephant']
['giraffe', 'elephant', 'snake', 'lion', 'tiger', 'rabbit', 'monkey']

4、列表的排序

animals = ['monkey','rabbit','tiger','lion','snake','elephant','giraffe']
# sorted函数返回列表排序后的拷贝不会修改传入的列表
animals2 = sorted(animals)
# 在列表的 reverse() 方法中,设置 reverse=True 可以将列表中的元素倒序排列
animals3 = sorted(animals,reverse=True)
# # 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序
animals4 = sorted(animals,key=len)
print(animals)
print(animals2)
print(animals3)
print(animals4)
# 给列表对象发出排序消息直接在列表对象上进行排序
animals.sort(reverse=True)
print(animals)输出结果:
['monkey', 'rabbit', 'tiger', 'lion', 'snake', 'elephant', 'giraffe']
['elephant', 'giraffe', 'lion', 'monkey', 'rabbit', 'snake', 'tiger']
['tiger', 'snake', 'rabbit', 'monkey', 'lion', 'giraffe', 'elephant']
['lion', 'tiger', 'snake', 'monkey', 'rabbit', 'giraffe', 'elephant']
['tiger', 'snake', 'rabbit', 'monkey', 'lion', 'giraffe', 'elephant']

六、生成式和生成器

利用列表的生成式语法创建列表

f = [x for x in range(1, 10)]
print(f)
f = [x + y for x in 'ABCDE' for y in '1234567']
print(f)
f = [x ** 2 for x in range(1, 1000)]
print(f)

或者利用yield关键字将一个普通函数改造成生成器函数

def fib(n):a, b = 0, 1for _ in range(n):a, b = b, a + byield adef main():for val in fib(20):print(val)if __name__ == '__main__':main()

七、元组

python中的元组和列表类似,也是一种容器数据,可以用一个变量来存储多个数据,元组中的元素不能修改。

#定义元组
t = ('伟大',1949,True,'北京')
print(t)
# 获取元组中的某个元素
print(t[2])
#遍历元组中的值
for x in t:print(x)
#重新给元组赋值
#不能t[0] = 'xxx',而是需要把元组转换为列表后再赋值
t_list = list(t)
print(t_list)
t_list[0] = '中国'
t_list[1] = 2024
print(t_list)
t2 = tuple(t_list)
print(t2)输出:
('伟大', 1949, True, '北京')
True
伟大
1949
True
北京
['伟大', 1949, True, '北京']
['中国', 2024, True, '北京']
('中国', 2024, True, '北京')

思考:为什么已经有了列表这种数据结构,还需要元组呢?

  1. 不可变性的优势:元组的不可变性使得它在某些情况下更安全和可靠。当你需要确保数据在程序执行过程中不会被意外修改时,使用元组可以避免因误操作导致的数据不一致。
  2. 性能方面:元组的结构相对简单,在一些场景下,比如频繁读取数据而较少修改的情况下,元组的性能可能会略好于列表。
  3. 用途方面:元组常常用于表示一些相互关联的、具有固定顺序的元素,比如坐标、日期等。它可以明确地传达数据的结构和意义,并且由于其不可变性,有助于保持数据的完整性。而列表则更适合用于动态地存储和操作数据,如添加、删除元素等。

八、集合

在 Python 中,集合(set)是一种无序且不包含重复元素的数据结构。

集合具有以下特点:

  1. 不允许重复元素:集合会自动去除重复的元素。
  2. 无序性:集合中的元素没有固定的顺序。

集合支持一些常见的操作,如添加元素、删除元素、集合的并集、交集、差集等。

# 创建集合的字面量语法
set1 = {1, 2, 3, 3, 3, 2}
print(set1)
print('Length =', len(set1))
# 创建集合的构造器语法(面向对象部分会进行详细讲解)
set2 = set(range(1, 10))
set3 = set((1, 2, 3, 3, 2, 1))
print(set2, set3)
# 创建集合的推导式语法(推导式也可以用于推导集合)
set4 = {num for num in range(1, 100) if num % 3 == 0 or num % 5 == 0}
print(set4)# 添加删除元素
set1.add(4)
set1.add(5)
set2.update([11, 12])
set2.discard(5)
if 4 in set2:set2.remove(4)
print(set1, set2)
print(set3.pop())
print(set3)# 集合的交集、并集、差集、对称差运算
print(set1 & set2)
# print(set1.intersection(set2))
print(set1 | set2)
# print(set1.union(set2))
print(set1 - set2)
# print(set1.difference(set2))
print(set1 ^ set2)
# print(set1.symmetric_difference(set2))
# 判断子集和超集
print(set2 <= set1)
# print(set2.issubset(set1))
print(set3 <= set1)
# print(set3.issubset(set1))
print(set1 >= set2)
# print(set1.issuperset(set2))
print(set1 >= set3)
# print(set1.issuperset(set3))输出结果:
{1, 2, 3}
Length = 3
{1, 2, 3, 4, 5, 6, 7, 8, 9} {1, 2, 3}
{3, 5, 6, 9, 10, 12, 15, 18, 20, 21, 24, 25, 27, 30, 33, 35, 36, 39, 40, 42, 45, 48, 50, 51, 54, 55, 57, 60, 63, 65, 66, 69, 70, 72, 75, 78, 80, 81, 84, 85, 87, 90, 93, 95, 96, 99}
{1, 2, 3, 4, 5} {1, 2, 3, 6, 7, 8, 9, 11, 12}
1
{2, 3}
{1, 2, 3}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12}
{4, 5}
{4, 5, 6, 7, 8, 9, 11, 12}
False
True
False
True

九、字典

Python 中的字典(dict)是一种非常重要的数据结构。

字典是由键值对组成的,它具有以下特点:

  1. 键的唯一性:字典中的键必须是唯一的。
  2. 无序性:字典中的元素没有固定的顺序。

字典的每个元素都是由一个键和一个值组成的“键值对”,键和值通过冒号分开。字典提供了高效的键值查找、添加、修改和删除操作。

# 创建字典的字面量语法
scores = {'梅西':'足球', '奥沙利文':'台球','乔丹':'篮球'}
print(scores)
# 创建字典的构造器语法
items1 = dict(one=1, two=2, three=3, four=4)
# 通过zip函数将两个序列压成字典
items2 = dict(zip(['a', 'b', 'c'], '123'))
# 创建字典的推导式语法
items3 = {num: num ** 2 for num in range(1, 10)}
print(items1, items2, items3)
# 通过键可以获取字典中对应的值
print(scores['梅西'])
print(scores['奥沙利文'])
# 对字典中所有键值对进行遍历
for key in scores:print(f'{key}: {scores[key]}')
# 更新字典中的元素
scores['刘翔'] = '田径'
scores['Simple'] = '电竞'
scores.update(郭晶晶='跳水', 马龙='乒乓球')
print(scores)
if '柯洁' in scores:print(scores['柯洁'])
print(scores.get('柯洁'))
# get方法也是通过键获取对应的值但是可以设置默认值
print(scores.get('柯洁', '围棋'))
# 删除字典中的元素
print(scores.popitem())
print(scores.popitem())
print(scores.pop('梅西', '足球'))
# 清空字典
scores.clear()
print(scores)输出结果:
{'梅西': '足球', '奥沙利文': '台球', '乔丹': '篮球'}
{'one': 1, 'two': 2, 'three': 3, 'four': 4} {'a': '1', 'b': '2', 'c': '3'} {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
足球
台球
梅西: 足球
奥沙利文: 台球
乔丹: 篮球
{'梅西': '足球', '奥沙利文': '台球', '乔丹': '篮球', '刘翔': '田径', 'Simple': '电竞', '郭晶晶': '跳水', '马龙': '乒乓球'}
None
围棋
('马龙', '乒乓球')
('郭晶晶', '跳水')
足球
{}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GaussDB轻量化运维管理工具介绍

前言 本期课程将从管理平台的架构出发&#xff0c;结合平台的实例管理、实例升级、容灾管理和监控告警的功能和操作介绍&#xff0c;全面覆盖日常运维操作&#xff0c;带您理解并熟练运用GaussDB运维平台完成运维工作。 一、GaussDB 运维管理平台简介 开放生态层 友好Web界面…

OWASP发布十大开源软件安全风险及应对指南

​ 最近爆发的XZ后门事件&#xff0c;尽管未酿成Log4j那样的灾难性后果&#xff0c;但它再次敲响了警钟&#xff1a;软件供应链严重依赖开源软件&#xff0c;导致现代数字生态系统极其脆弱。面对层出不穷的安全漏洞&#xff0c;我们需要关注开源软件 (OSS)风险 &#xff0c;改进…

通过代理IP实现匿名网上冲浪

目录 前言 一、代理IP的原理 1.1 什么是代理IP&#xff1f; 1.2 代理IP的工作原理 二、使用代理IP实现匿名网上冲浪的代码示例 三、如何获取代理IP 四、使用代理IP的注意事项 五、总结 前言 在互联网上冲浪是我们生活中常见的一项活动&#xff0c;然而&#xff0c;在某…

XiaodiSec day017 Learn Note 小迪安全学习笔记

XiaodiSec day017 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 day 17 主要内容&#xff1a; php 框架 thinkPHPyiilaravel 使用 fofa 搜索 thinkphp 市面上 thinkphp5 版本较多 url 结构 域名/.php(文件名)/index(目录)/index(函数名)模块名-控…

XL7015输出12V电源设计

描述 XL7015是一款高效、高压降压型DC-DC转换器&#xff0c;固定150KHz开关频率&#xff0c;可提供最高0.8A输出电流能力&#xff0c;低纹波&#xff0c;出色的线性调整率与负载调整率。XL7015内置固定频率振荡器与频率补偿电路&#xff0c;简化了电路设计。PWM控 制 环 路 可 …

Android 组件提供的状态保存(saveInstanceState)与恢复(restoreInstanceState)

在Android的组件Activity中&#xff0c;有这样一对方法: onSaveInstanceeState 和 onRestoreInstanceState 这两对方法&#xff0c;可以让我在Activiy被异常销毁时&#xff0c;保存状态&#xff1b;以及在Activity重建时&#xff0c;恢复状态。 比如&#xff1a;当我们在输入…

只有IP没有域名怎么实现HTTPS访问

只有IP地址没有域名可以实现HTTPS访问&#xff1f;虽然通常情况下SSL证书是与域名关联并颁发的&#xff0c;但确实存在针对IP地址发放的SSL证书。这种类型的证书允许服务器通过HTTPS协议为其公网IP地址提供安全的Web服务。这意味着用户可以直接在浏览器中输入服务器的IP地址&am…

免翻!全球最大免费书库Zlibrary最新镜像,国内可直接访问,赶紧下书

刚刚&#xff0c;“知识大航海”群里&#xff0c;有位群友分享了一个Zlibrary镜像地址&#xff0c;感谢这位群友的热心分享&#xff0c;这个地址国内可以直接访问&#xff01; 在“王不留”GZ号&#xff0c;写“zlib”四个字母&#xff0c;有Zlibrary镜像网址、官方网址&#x…

搜维尔科技:如何选择最佳的xsens动作捕捉设备

xsens介绍 如何选择最佳的xsens动作捕捉设备 选择最佳的 Xsens 动作捕捉设置并不总是像我们希望的那样简单。根据每个人的情况&#xff0c;会有不同的选择、要求和挑战。 这就是我们创建此博客的原因&#xff1a;帮助您做出最适合您的决定。 您已经决定继续使用 Xsens 了吗…

神经网络进阶

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

19 使用MapReduce编程统计超市1月商品被购买的次数

首先将1月份的订单数据上传到HDFS上&#xff0c;订单数据格式 ID Goods两个数据字段构成 将订单数据保存在order.txt中&#xff0c;&#xff08;上传前记得启动集群&#xff09;。 打开Idea创建项目 修改pom.xml&#xff0c;添加依赖 <dependencies><dependency>…

微软发布Phi-3 Mini,性能媲美GPT-3.5、Llama-3,可在手机端运行

前言 微软发布了最新版的Phi系列小型语言模型(SLM) - Phi-3。这个系列包括3个不同参数规模的版本&#xff1a;Phi-3 Mini (38亿参数)、Phi-3 Small (70亿参数)和Phi-3 Medium (140亿参数)。 Phi系列模型是微软研究团队开发的小规模参数语言模型。从第一代Phi-1到第二代Phi-2&…

想把MP3音频转换成OGG格式需要什么工具?四种你不知道的音频转换工具在这里

​一&#xff0c;引言 随着数字音乐的发展&#xff0c;音频格式的种类也日益增多。MP3和OGG是其中两种常见的音频格式&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。有时&#xff0c;我们可能需要将MP3格式的音频转换为OGG格式&#xff0c;以满足特定的需求。本文…

JavaEE初阶——多线程(六)——线程池

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第六篇文章,关于线程池 如果有不足的或者错误的请您指出! 目录 3.线程池3.1标准库的线程池3.2 标准库自己提供的几个工厂类3.3自己实现一个线程池完成大体框架接下来完…

LangChain的核心模块和实战

主要模型 LLM:对话模型, 输入和输出都是文本Chat Model: 输入输出都是数据结构 模型IO设计 Format: 将提示词模版格式化Predict: langchain就是通过predict的方式调用不同的模型, 两个模型的区别不大, Chat Model 是以LLM为基础的.Parese: langchain还可以对结果进行干预, 得…

解决Oracle锁表的方法

在实际工作中&#xff0c;并发量比较大的项目&#xff0c;经常会出现锁表的问题&#xff0c;下面我将复现这个问题&#xff0c;并给出解决方法。 一、问题复现 1、session1修改aabb表的B字段为迪迦奥特曼&#xff0c;但是不提交该事务。 2、session2也修改这行的这个字段。 发…

Prompt-to-Prompt Image Editing with Cross Attention Control

Prompt-to-Prompt Image Editing with Cross Attention Control TL; DR&#xff1a;prompt2prompt 提出通过替换 UNet 中的交叉注意力图&#xff0c;在图像编辑过程中根据新的 prompt 语义生图的同时&#xff0c;保持图像整体布局结构不变。从而实现了基于纯文本&#xff08;不…

终于有人把“Linux云计算路线”整理出来了,收藏起来,随时查看

一&#xff0c;计算机硬件 二&#xff0c;计算机网络 三&#xff0c;Linux系统管理 四&#xff0c;构建Linux服务系统&#xff0c;数据库&#xff0c;程序及Web服务 五&#xff0c;消息队列&#xff0c;web集群&#xff0c;系统及软件优化&#xff0c;智能化监控&#xff0c;海…

【大语言模型LLM】-基础语言模型和指令微调的语言模型

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

每日一题:Spring 框架中都用到了哪些设计模式❓

Spring 框架中使用了许多设计模式&#xff0c;以下列举一些比较重要的&#xff1a; 单例模式&#x1f525;&#xff1a;Spring 的 Bean 默认是单例模式&#xff0c;通过 Spring 容器管理 Bean 的生命周期&#xff0c;保证每个 Bean 只被创建一次&#xff0c;并在整个应用程序中…