高阶python | 字符串高级功能

news2024/10/5 13:07:05

不可变的字符串

python中的数据类型分为可变的和不可变的两种,字符串属于不可变的数据类型。

不可变的数据类型可以作为字典的键使用,例如:

my_dict = {'Lily': 68, 'Harry': 98, 'Lucy': 79}

不可变类型的另一个优点就是有助于进行内部消化,从而提高运行效率。例如:使用元组比使用列表的效率更高。

不可变类型的局限就在于无法“就地”更改。例如:

my_str = 'Hello, Dave, this is Hal.'
my_str[0] = 'H'

第二条语句就是无效的,因为它尝试获取在第一条语句中创建的字符串并修改它。结果Python抛出了TypeError异常。

而以下语句是有效的。

my_str = 'hello'
my_str = 'Hello'

因为每条语句都会创建一个新的字符串,并将其分配给my_str变量。

在python中变量不过是个名字,在上面的操作中,实际上是创建了两个不同的字符串给了两个同名的变量,可以通过id()函数来查看变量的内存地址

my_str = 'hello'
print('第一个my_str内存地址:', id(my_str))
my_str = 'Hello'
print('第二个my_str内存地址:', id(my_str))

第一个my_str内存地址: 2332623983408
第二个my_str内存地址: 2332623983344

所以在程序中,后面出现了和前面一样名字的变量时,只要赋值的值是新的就会产生一个新的变量,而当后面赋值的值与前面的同名变量的值一样才会保留旧的变量,因为python中的不可变数据类型不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,就是不可变数据类型引用的地址的值不可改变,改变对象的值,其实是引用了不同的对象。

数据类型转换

只要变量支持某种转换,那么使用该类型的名称就会引起类型转换,其语法如下:

新数据类型(旧数据对象)

当转换合规就会从旧的数据类型转换成新数据类型,但如果转换不存在,python就会报错。

例如:

s = '45'
n = int(s)
x = float(s)

45
45.0

其中,int转换可以接受第二个参数,此参数可以按不同的进制转换为数字 (例如二进制)

n = int('10001', 2)
print(n)
n = int('1f', 16)
print(n)

17

31

字符串运算符(+、=、*、>等)

字符串也能支持一些数字类型的运算符,但实际用途不同。

例如:

dog1_str = 'Rover'
dog2_str = dog1_str

print(dog1_str == dog2_str)
print(dog1_str == 'Rover')

True
True

在这个例子中,第二个语句为dog1_str引用的数据创建了一个别名dog2_str,因为两个变量所引用的是相同的数据,所以第一个结果为True。

print(id(dog1_str))
print(id(dog2_str))

1731897414448
1731897414448

(但如果之后将dog1_str赋值了新的数据,dog2_str仍然引用'Rover')

第二个相等性测试也返回True,因为只要两个字符串的内容相同,就视为他们相等,它们不一定指向内存中相同的数据。

所以,在使用运算符对字符串进行比较的时候是区分大小写的,可以对字符串使用upper()或lower()函数转换成全大写或全小写,这种方式只对包含ASCII字符的字符串有效。

如果对于使用更为强大的Unicode字符集的字符串,则应该使用专门为此设计的casefold()方法进行不区分大小写只比对内容的比对方式较为安全

例如:

def compare_no_case(str1, str2):
    return str1.casefold() == str2.casefold()

print(compare_no_case('cat', 'CAT'))

True

字符串类型支持的运算符
运算符语法说明
name = str将字符串赋值给指定变量
str1 == str2当str1和str2有相同的内容时返回True,大小写敏感
str1 != str2当str1和str2有不同内容时返回True
str1 < str2

当str1按字母表顺序出现在str2前时返回True,

如' abc'<' def'返回True, 'abc'<'aaa'返回False (查看下面关于顺序的说明)

str1 > str2当str1按字母表顺序出现在str2后时返回True,如'def'>'abc'返回True,' def'>'xyz'返回False
str1 <= str2当str1按字母表顺序出现在str2前或两者内容相同时返回True
str1 >= str2当str1按字母表顺序出现在str2后或两者内容相同时返回True
str1 + str2连接两个字符串,就是将str2的内容粘贴到str1末尾。例如,'Big'+'Deal'结果为'BigDeal'
str1 * n将该字符串连接到自身n次,其中n是一个整数,例如,'Goo’* 3的结果为'GoGooGoo'
n * str1与str1 * n相同
str1 in str2如果字符串str1整体包含在str2中,则返回True
str1 not in str2如果字符串str1不包含在str2中,则返回True
str is obj如果str和obj指向内存中的同-对象,则返回True。该运算符在将字符串与None或未知类型对象进行比较时很有用
str is not obj

如果str和obj指向内存中的不同对象,则返回True

Pyth

在字符串的拼接时使用“+”运算符,不会自动在中间添加空格,所以必须手动添加,“ ' ' ”也是字符串类型,例如:

first = 'will'
last = 'Shakespeare'
full_name = first + ' ' + last
print(full_name)

will Shakespeare

还有在创建一个分割线的时候也可以通过运算符来快速完成

divider_str = '-' * 30
print(divider_str)

------------------------------

目前为止,使用乘法运算符来创建是最效率的方式。

注意,不要滥用 is 和 is not 运算符。这两个运算符测试两个值在内存中是否是相同的对象。可以理解为是在比对象的唯一标识符是否相等,而并非比较变量的值。如果单纯的想要比值是否一致应使用(==)运算符。例:

a = [1, 2]
b = [1, 2]
print(id(a))
print(id(b))
print(a is b) 
print(a == b)

1929803551168
1929807299776
False
True

索引和切片

 对于索引和切片,我更倾向于自己总结的数轴模型

 python中切片语法如下表

python字符串的切片语法
语法得到的字符串
string[beg:end]从 beg 开始到 end(不包含)的字符串
string[:end]从头一直到 end(不包含)的字符串
string[beg:]从 beg 一直到结尾的字符串
string[:]整个字符串,该操作会复制原字符串
string[beg: end: step]从 beg 到 end (不包含)的字符串,字符之间的索引间隔为 step

ad

假设要删除字符串开头和结尾的双引号,则可以

king_str = '"Harry VIII"'

new_str = king_str[1:-1]
print(new_str)

Harry VIII

从字符串中每3个字符取一个

a_str = 'AbcDefGhiJklMnoP'
print(a_str[::3])

ADGJMP 

由切片的规则,我们得出下面这些有趣的结论:

  1. 如果 beg 和 end 均为正索,则 end-beg 给出切片的最大长度
  2. 要获取包含原字符串前 N个字符的字符串,使用 string[:N]
  3. 要获取包含原字符串最后N个字符的字符串,使用string[-N:]。
  4. 要创建字符串的完整副本,使用 string[:]。

单字符函数

python中有两个函数是为长度为1的字符串设计的。这两个函数是弹字符函数,虽然它们的操作的对象也是字符串类型。

ord(str)       #返回字符的数字编码

chr(n)         #将ASCII/Unicode编码转换成一个字符

ord 函数接受一个字符串参数,但是如果字符串长度大于 1,则会引发TypeError异常。可以使用此函数返回对应字符的ASCII或Unicode编码。例如下面的示例显示字母A的ASCI码为十进制 65。

print(ord('A'))

65

用join函数构建字符串

前面我们说过,可以用加法运算符来拼接一个新的字符串。

例如:我们欲想要得到“Big Bad John”,我们可以

a_str = 'Big '
a_str = a_str + 'Bad '
a_str = a_str + 'john'
print(a_str)

他们都使用了相同的变量名,并为他们分配了一个新字符串,以下语句同样有效

a_str = 'Big '
a_str += 'Bad '
a_str += 'John'
print(a_str)

Big Bad John

这种构建字符串的方法对于少量对象的情况是没啥问题,但当需要拼接的散碎字符串数量庞大的时候,这个看起来“简洁”的例子则会使python一次又一次的在内存中创建全新的字符串。

一种更好的方法就是使用join方法

new_str.join(list)

此方法会将所有的字符串一次性全部拼接成一个新字符串,在运行时比上面的传统案例快速很多。在代码量上也会减少很多,例如:

def print_nice(a_lst):
    s = ''
    for item in a_lst:
        s += item + ', '
    if len(s) > 0:
        s = s[:-2]
    print(s)


print_nice(['John', 'Paul', 'George', 'Ringo'])
def print_nice(a_lst):
    print(', '.join(a_lst))

print_nice(['John', 'Paul', 'George', 'Ringo'])

John, Paul, George, Ringo

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

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

相关文章

ISO_IEC_7816-3

介绍 ISO/IEC 7816 是一系列标准&#xff0c;规定了集成电路卡和此类卡的使用 互换。 这些卡是用于在外部世界和卡中的集成电路之间协商的信息交换的识别卡。 作为信息交换的结果&#xff0c;卡传递信息&#xff08;计算结果、存储的数据&#xff09;和/或修改其内容&#xff0…

高级第一个月考试题

1.什么是Vue框架&#xff1f; Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;并且还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工具链以及各种支持…

Unity之ShaderGraph节点介绍 Artistic艺术效果

前言 Artistic&#xff08;艺术效果&#xff09;  1、Adjustments&#xff08;图像调节&#xff09;   1) Chennel Mixer&#xff08;通道混合器&#xff09;   2) Contrast&#xff08;对比度&#xff09;   3) Hue&#xff08;色调偏移&#xff09;   4) Invert Co…

layui框架学习(24:弹出层模块_消息框提示框)

弹出层模块layer是Layui的重要模块&#xff0c;layui官网教程中的原话是&#xff1a;“layer 作为 Layui 的代表性组件”。弹出层模块layer的作用主要是在页面中以消息框、弹出框等形式进行信息提醒、信息交互等操作&#xff0c;类似于C/S架构中的MessageBox.Show、自定义窗口的…

AcrelCloud-6000安全用电云平台在某景区的应用

摘要 我国历史文化悠久&#xff0c;拥有相当丰富的历史文化遗产&#xff0c;而古建筑作为文化遗产的重要组成部分&#xff0c;体现着中华民族的生命力和创造力&#xff0c;蕴含了丰富的物质价值和精神价值。根据国家文物局近些年公布的数据&#xff0c;每年都发生十多起文物建筑…

ThingsBoard教程(五二):规则节点解析 AWS SNS Node, AWS SQS Node

AWS SNS Node Since TB Version 2.0 节点将消息发布到AWS SNS(亚马逊简单通知服务)。 配置: 主题ARN模式 - 可以直接设置消息发布的主题名称,也可以使用模式,该模式将使用消息元数据解析为实际的ARN主题名称。 AWS Access Key ID和AWS Secret Access Key是具有编程访问…

chatgpt赋能python:PythonUSBKey:安全可靠的数字身份验证

Python USBKey&#xff1a;安全可靠的数字身份验证 介绍 Python USBKey是一种安全可靠的数字身份验证工具&#xff0c;它基于Python编程语言开发&#xff0c;便于跨平台使用&#xff0c;并支持多种加密算法&#xff0c;使得加密安全性更高。 Python USBKey能够保护您的隐私&…

C++中string的用法

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 前言&#xff1a;Hello各位小伙伴们好&#xff01;欢迎来到本专栏CSTL的学习&#xff0c;本专栏旨在帮助大家了解…

chatgpt赋能python:Pythonthreading:什么是线程及其使用

Python threading&#xff1a;什么是线程及其使用 在计算机科学中&#xff0c;线程是指操作系统能够进行调度和分派的最小单位。在 Python 中&#xff0c;线程允许程序在执行过程中并行完成多个任务。线程是并发编程的核心元素之一&#xff0c;使开发人员能够轻松地编写并行代…

Golang中互斥锁和读写互斥锁

目录 互斥锁 使用互斥锁的示例代码 读写互斥锁 读写互斥锁的示例代码 互斥锁 在Golang中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是一种基本的同步原语&#xff0c;用于实现对共享资源的互斥访问。互斥锁通过在代码中标记临界区来控制对共享资源的访问&#xff0c…

LC-3 机器码编程实验

一、实验目的 分析和理解试验指定的需解决问题。利用LC-3的机器代码设计实现相关程序。通过LC-3仿真器调试和运行相关程序并得到正确的结果。 二、实验内容 利用LC-3的机器代码计算一个16位的字中有多少位是“1”&#xff0c;程序从x3000开始&#xff0c;需计算的字存储在x3…

智能集成式电力电容器在山东某环保材料制造厂中的应用

摘要&#xff1a;分析智能集成式电力电容的工作原理及功能&#xff0c;结合山东环保材料制造厂配电现状&#xff0c;选择经济可靠的方案&#xff0c;智能电容过零投切与低功耗&#xff0c;解决了继电器投切产生涌流的问题&#xff1b;接线简单&#xff0c;扩容方便&#xff0c;…

chatgpt赋能python:Python实现Word合并

Python实现Word合并 在日常工作和生活中&#xff0c;我们经常需要处理Word文档。有一种情况是需要将多个Word文档合并成一个&#xff0c;并且保留原有的格式和样式。这个时候&#xff0c;Python就派上用场了。 Word文档的结构 在了解怎样合并多个Word文档之前&#xff0c;我…

手机修复老照片软件有哪些?手机修复老照片的软件哪个好?

随着智能手机与数码相机的广泛普及&#xff0c;越来越多的小伙伴爱上了拍照。那么面对这些拍下来美美的照片&#xff0c;随着时间的不断流逝&#xff0c;它们终会磨损、损坏或者褪色。其实我们可以通过手机上的一些软件来帮助我们修复这些老照片&#xff0c;那么手机修复老照片…

ISO证书“带标”与“不带标”的区别是什么?

ISO9001质量管理体系认证是企业产品获得“通行绿卡”的最直接最有效的途径。 通过认证在打破贸易壁垒&#xff0c;提高产品知名度&#xff0c;降低生产成本&#xff0c;提高经济效益&#xff0c;维护消费者权益&#xff0c;减少重复审核负担等方面的作用越来越为企业界所共知。…

使用Cpolar+freekan源代码 搭建属于自己的在线视频网站

文章目录 1.前言2.本地网页搭建2.1 环境使用2.2 支持组件和环境设置2.3 支持组件选和环境设置2.4 网页安装2.5 测试和使用2.6 问题解决 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDNprobezy的文章&#xff1a;使用Cpolarfreekan源码…

三线制Pt100隔离器在掘进机电机保护系统中的应用

摘要&#xff1a;三线制Pt100隔离器相较于二线制的更加稳定可靠&#xff0c;在中低温地区有广泛的应用。掘进机电机保护系统中&#xff0c;利用三线制Pt100隔离器将热电阻信号转换为线性4-20mA电流信号&#xff0c;经过A/D转化&#xff0c;传输至PLC并显示&#xff0c;通过实时…

OpenCV中的图像处理3.10(九)二维直方图与反投影

目录 3.10.3 直方图--3&#xff1a;二维直方图目标绪论OpenCV中的二维直方图Numpy中的2D直方图绘制二维直方图 3.10.4 直方图 - 4&#xff1a;直方图反投影目标理论Numpy中的算法OpenCV中的反投影其他资源 翻译及二次校对&#xff1a;cvtutorials.com 编辑者&#xff1a;廿瓶鲸…

前端新员工入职,需要为你的新电脑安装一些环境,开发工具

目录 一.先安装个谷歌浏览器&#xff0c;稳定版。 二.安装公司日常交流软件 三.安装个VSCode 四.安装nvm 五.vue-cli的安装和配置 六.安装git 配置git账号 拉取线上仓库到本地 一些常用git命令 七.其他工具 网络抓包工具&#xff1a;whistle 反向代理工具&#xff1…

雪花算法记录

引子 伴随着业务的日渐庞大&#xff0c;单库单表的数据库可能无法支持业务的读写&#xff0c;需要对数据库进行分库分表。 原来数据库中&#xff0c;通常使用自增id的方式生成主键。分库分表之后&#xff0c;如果仍然采用原来的方式&#xff0c;在多个表之间主键会发生重复。 …