字符串的驻留机制

#
# 主题:字符串的驻留机制
#if __name__ == '__main__':# 不可变序列:元组、字符串# 驻留机制:# 对于相同的字符串,只保留一份拷贝,# 后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量a = 'python'b = "python"c = '''python'''print(id(a))            # 1430903362144print(id(b))            # 1430903362144print(id(c))            # 1430903362144# 驻留机制的前提条件# 驻留机制在 python 原编译器中会出现,而在后续的集成环境中,如 PyCharm,就不会发生# PyCharm 对字符串进行了优化# 可以在命令行中输入 python 并回车,进入交互式 python,之后输入下列代码验证# 1. 字符串的长度为 0 或 1a = 'a'b = 'a'print(id(a))            # 1610197355576print(id(b))            # 1610197355576# 符合驻留机制的条件# 2. 符合标识符的字符串,即字符串中只有数字、字母、下划线# 3. 字符串只在编译时进行驻留,而不是运行时a = 'abc'b = 'ab' + 'c'              # 在编译时连接字符串c = ''.join(['ab', 'c'])    # 在运行时,调用 join 方法,然后连接字符串print(a is b)               # 符合驻留条件print(a is c)               # 不符合驻留条件# 4. [-5, 256] 之间的整数数字也可发生驻留# sys 包中的 intern 方法强制两个字符串指向同一个对象import sysa = 'ab%'b = 'ab%'print(a is b)               # Falsea = sys.intern(b)print(a is b)               # True# 字符串驻留机制的优点# 优点:# 当需要值相等的字符串时,可以直接从字符串池里拿来使用,避免频繁地创建和校徽,提升效率和节约内存# 注意# 拼接、修改字符串是比较影响性能的# 拼接字符串时,建议使用字符串的 join 方法,而不是 + # join 方法先计算出所有字符串的长度,然后拷贝。这样,就 new 一次对象,效率比 + 高

字符串的查询操作的方法

#
# 主题:字符串的查询操作的方法
#if __name__ == '__main__':s = 'hello, hello'# index 方法# 查找子字符串第一次出现的位置,若不存在,则报错 ValueErrorprint(s.index('lo'))        # 3# find 方法# 查找子字符串第一次出现的位置,若不存在,则返回 -1print(s.find('lo'))         # 3# rindex 方法# 查找子字符串最后一次出现的位置,若不存在,则报错 ValueErrorprint(s.rindex('lo'))       # 10# rfind 方法# 查找子字符串最后一次出现的位置,若不存在,则返回 -1print(s.rfind('lo'))        # 10# 推荐使用 find 方法和 rfind 方法

字符串的大小写转换

#
# 主题:字符串的大小写转换
#if __name__ == '__main__':s = 'hello, python's1 = 'Hello, Python'# 字符串中所有字符都转成大写字母a = s.upper()print(s, id(s))             # hello, python 2250561907376print(a, id(a))             # HELLO, PYTHON 2250561907312# upper 方法生成新对象# 字符串中所有字符都转成小写字母b = a.lower()print(a, id(a))             # HELLO, PYTHON 3022125492656print(b, id(b))             # hello, python 3022125492784# lower 方法生成新对象# 字符串中所有大写字母转成小写字母,把所有小写字母都转成大写字母c = s1.swapcase()print(s1, id(s1))           # Hello, Python 1664029387440print(c, id(c))             # hELLO, pYTHON 1664029434800# swapcase 方法生成新对象# 第一个字符转为大写,其余字符转换为小写d = s.capitalize()print(s, id(s))             # hello, python 2055284947312print(d, id(d))             # Hello, python 2055284990704# capitalize 方法生成新对象# 字符串中每个单词的第一个字符都转为大写,其余字符都转为小写e = s.title()print(s, id(s))             # hello, python 2003960162928print(e, id(e))             # Hello, Python 2003960210480

字符串内容对齐

#
# 主题:字符串内容对齐
#if __name__ == '__main__':s = 'hello, python'# 居中对齐# 第1个参数指定宽度,第2个参数指定填充符,第2个参数可选,默认是空格,若设置宽度小于实际宽度则返回原字符串print(s.center(20, '*'))            # ***hello, python****print(s.center(20))                 #    hello, pythonprint(s.center(10, '#'))            # hello, python 返回原字符串# 左对齐# 第1个参数指定宽度,第2个参数指定填充符,第2个参数可选,默认是空格,若设置宽度小于实际宽度则返回原字符串print(s.ljust(20, '*'))             # hello, python*******print(s.ljust(20))                  # hello, pythonprint(s.ljust(10))                  # hello, python 返回原字符串# 右对齐# 第1个参数指定宽度,第2个参数指定填充符,第2个参数可选,默认是空格,若设置宽度小于实际宽度则返回原字符串print(s.rjust(20, '*'))             # *******hello, pythonprint(s.rjust(20))                  #        hello, pythonprint(s.rjust(10))                  # hello, python 返回原字符串# 右对齐# 左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,若指定的宽度小于字符串的长度,返回字符串本身print(s.zfill(20))                  # 0000000hello, pythonprint(s.zfill(10))                  # hello, python 返回原字符串s1 = '-800'print(s1.zfill(10))                 # -000000800

字符串劈分(分割)操作

#
# 主题:字符串劈分(分割)操作
#if __name__ == '__main__':s = 'hello world python'# 从字符串左边开始分割,默认的分割字符是空格字符串,返回的结果的类型是 list# 通过参数 sep 指定分割字符串的字符# 通过参数 maxsplit 指定分割字符串时最大的分割次数,在经过最大次分割之后,剩余的子串会单独作为一部分lst = s.split()             # 默认以空格分割print(lst)                  # ['hello', 'world', 'python']print(s.split(sep = 'o'))   # ['hell', ' w', 'rld pyth', 'n']print(s.split(sep = 'o', maxsplit = 2)) # ['hell', ' w', 'rld python']# 从字符串右边开始分割,默认的分割字符是空格字符串,返回的结果的类型是 list# 通过参数 sep 指定分割字符串的字符# 通过参数 maxsplit 指定分割字符串时最大的分割次数,在经过最大次分割之后,剩余的子串会单独作为一部分lst = s.rsplit()  # 默认以空格分割print(lst)                  # ['hello', 'world', 'python']print(s.rsplit(sep='o'))    # ['hell', ' w', 'rld pyth', 'n']print(s.rsplit(sep='o', maxsplit=2))  # ['hello w', 'rld pyth', 'n']

字符串的判断操作

#
# 主题:字符串的判断操作
#if __name__ == '__main__':s = 'hello, python'# 判断字符串是否为合法标识符print('1', s.isidentifier())       # False# isidentifier 方法判断是否为合法标识符# 合法标识符相关规定详见第1章print('2', '张三'.isidentifier())    # True# 判断字符串是否全部由空白字符(如回车、换行、水平制表符)组成print('3', '\t'.isspace())         # True# 判断字符串是否全部由字母组成print('4', 'hello'.isalpha())       # Trueprint('5', 'hello,'.isalpha())      # Falseprint('6', 'hello张三'.isalpha())    # True# 判断字符串是否全部由十进制数字组成print('7', '123'.isdecimal())       # Trueprint('8', '123四'.isdecimal())      # Falseprint('9', 'ⅠⅡⅢ'.isdecimal())       # False# 判断字符串是否全部由数字组成print('10', '123'.isnumeric())      # Trueprint('11', '123四'.isnumeric())     # Trueprint('12', 'ⅠⅡⅢ'.isnumeric())      # True# 判断字符串是否全部由字母和数字组成print('13', 'abc1'.isalnum())       # Trueprint('14', '张三123'.isalnum())      # Trueprint('15', 'abc!'.isalnum())       # False

字符串的替换和合并

#
# 主题:字符串的替换和合并
#if __name__ == '__main__':s = 'hello,python,python,python'# 替换字符串# 第1个参数指定被替换的子字符串,第2个参数指定替换子字符串的字符串,第3个参数指定最大替换次数(可选)# 返回替换后得到的字符串,替换前的字符串不发生变化s1 = s.replace('python', 'java')s2 = s.replace('python', 'java', 2)print(s1, id(s1))          # hello,java,java,java 2958341037272print(s, id(s))             # hello,python,python,python 2958340910016print(s2)                   # hello,java,java,python# replace 方法返回新对象# 合并字符串# 将列表或元组中的字符串合并为一个字符串# join 方法返回新对象lst = ['hello', 'java', 'python']out = '|'.join(lst)print(lst, id(lst))         # ['hello', 'java', 'python'] 2537298027080print(out, id(out))         # hello|java|python 2537305168464t =  ('hello', 'java', 'python')print(''.join(t))           # hellojavapythonprint('*'.join('python'))   # p*y*t*h*o*n

字符串的比较

#
# 主题:字符串的比较
#if __name__ == '__main__':# 用到的运算符:>, >=, <, <=, ==, !=# 比较规则:首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比下去,#         直到两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,其余字符不会继续比较# 比较原理:比较字符时,比较的是其原始值,调用 ord 方法可以得到指定字符的原始值#       调用 chr 方法可以得到原始值对应的字符print('apple' > 'app')              # Trueprint('apple' > 'banana')           # Falseprint(ord('a'), ord('b'))           # 97 98print(chr(97), chr(98))             # a bprint(ord('杨'))                     # 26472print(chr(26472))                   # 杨# == 是判断是否值相等,is 是判断是否地址相等a = b = 'python'c = 'python'print(a == b)                       # Trueprint(b == c)                       # Trueprint(a is b)                       # Trueprint(a is c)                       # True

字符串的切片操作

#
# 主题:字符串的切片操作
#if __name__ == '__main__':# 字符串是不可变类型,故不具备增删改操作。切片操作产生新对象s = 'hello,python's1 = s[:5]s2 = s[6:]s3 = '!'newStr = s1 + s3 + s2print(s1)               # helloprint(s2)               # pythonprint(newStr)           # hello!python# 完整写法 [start: end: step]print(s[0:5:1])         # helloprint(s[::2])           # hloptoprint(s[::-1])          # nohtyp,ollehprint(s[-6::1])         # python

格式化字符串

#
# 主题:格式化字符串
#if __name__ == '__main__':# % 作占位符# %s 对应字符串,%i 或 %d 对应整数,%f 对应浮点数name = '张三'age = 20print('我是%s,今年%d岁' % (name, age))           # 我是张三,今年20岁print('%10d' % 99)                              #         99 其中,10 表示宽度print('%f' % 3.1415926)                         # 3.141593print('%.3f' % 3.1415926)                       # 3.142 其中,.3 表示小数点后三位,即精度print('%10.3f' % 3.1415926)                     #      3.142# {} 作占位符print('我叫{0},今年{1}岁'.format(name, age))     # 我叫张三,今年20岁print('{0:.3}'.format(3.1415926))               # 3.14 其中,.3 表示的是一共是三位数print('{0:.3f}'.format(3.1415926))              # 3.142 其中,.3f 表示的是3位小数print('{:.3f}'.format(3.1415926))               # 3.142print('{:10.3f}'.format(3.1415926))             #      3.142 其中,10表示宽度# print('{1:10.3f}'.format(3.1415926))          # 冒号前面的是索引,对应的是format()中的元素# f-string 即,f'字符串' 格式print(f'我叫{name},今年{age}岁')                 # 我叫张三,今年20岁

字符串的编码转换

#
# 主题:字符串的编码转换
#if __name__ == '__main__':# 编码:字符串转换为二进制数据(bytes)# 解码:bytes 类型的数据转换为字符串类型# 二进制数据用于数据传输s = '天涯共此时'# 编码print(s.encode(encoding = 'GBK'))           # b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1'# 在 GBK 编码方式中,一个中文占2个字节print(s.encode(encoding = 'utf-8'))         # b'\xe5\xa4\xa9\xe6\xb6\xaf\xe5\x85\xb1\xe6\xad\xa4\xe6\x97\xb6'# 在 utf-8 编码中,一个中文占3字节# 解码# byte 代表一个二进制数据(字节类数据)# GBK 编码得到的数据必须使用 GBK 解码,utf-8编码得到的数据必须使用 utf-8 解码byte = b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1'byte1 = b'\xe5\xa4\xa9\xe6\xb6\xaf\xe5\x85\xb1\xe6\xad\xa4\xe6\x97\xb6'print(byte.decode(encoding = 'GBK'))        # 天涯共此时print(byte1.decode(encoding = 'utf-8'))     # 天涯共此时

python源码中的学习笔记_第7章_字符串相关推荐

  1. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  2. CNN入门详解及TensorFlow源码实现--深度学习笔记

    CNN入门详解及TensorFlow源码实现–深度学习笔记 ##一.卷积神经网络 ###1.简介 卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出 ...

  3. android源代码 abi,Android内核源码Abi目录学习笔记

    好记性不如烂笔头,今天要学习的是Android中Abi目录下的代码.下面是基本的学习的笔记的汇总. 首先是include中的头文件的说明. 在cxxabi的头文件中主要需要掌握下面的几个点: 1.这个 ...

  4. vue 拷贝 数组_vue源码中值得学习的方法

    最近在深入研究vue源码,把学习过程中,看到的一些好玩的的函数方法收集起来做分享,希望对大家对深入学习js有所帮助.如果大家都能一眼看懂这些函数,说明技术还是不错的哦. 1. 数据类型判断 Objec ...

  5. python提取发票信息发票识别_(附完整python源码)基于tensorflow、opencv的入门案例_发票识别二:字符分割...

    (附完整python源码)基于tensorflow.opencv的入门案例_发票识别二:字符分割 发布时间:2018-05-14 20:16, 浏览次数:1201 , 标签: python tenso ...

  6. 《Python源码剖析》读书笔记

    <Python源码剖析>电子书下载 http://download.csdn.net/detail/xiarendeniao/5130403 Python源码在官网有下载链接,用ctags ...

  7. stl源码剖析_《STL源码剖析》学习笔记——空间配置器

    目录 1. 空间配置器概述 2. 构造和析构基本工具 3. 空间的配置与释放,std::alloc 4. 内存基本处理工具 1. 空间配置器概述 从STL的实现角度来看,空间配置器的位置尤为重要,整个 ...

  8. puppet最新源码包安装学习笔记

    最近去面试了2家大的电商网站的运维工作,公司对系统的自动化管理,虚拟化,mysql集群,系统性能的优化和shell及python编程的要求都比较高,虽然没有面试成功,但也明白了2013年自己学习的目标 ...

  9. 源码 状态机_LLVM学习笔记(1)--初探源码

    一直耳闻LLVM相比于GCC: well documented 架构灵活,前后端解耦符合龙书的讲解 昨天读到了一篇虽然概括却很周到的llvm入门导引 陈钦霖:LLVM Pass入门导引​zhuanla ...

  10. 从Mybatis源码中,学习到的10种设计模式

    一.前言:小镇卷码家 总有不少研发伙伴问小傅哥:"为什么学设计模式.看框架源码.补技术知识,就一个普通的业务项目,会造飞机不也是天天写CRUD吗?" 你说的没错,但你天天写CRUD ...

最新文章

  1. Linux下的多线程编程
  2. b站前端大佬_最强UP主:罗翔老师,你凭什么打败B站千万粉大佬老番茄?
  3. UVALive 7040 Color
  4. PMCAFF | 蓝港研发总监:游戏产品如何进行数据分析?内附核心数据分析实例子
  5. C#3.0学习笔记(8)浅谈接口interface
  6. 一个阿里云 MYSQL 服务 RDS 下的查询优化
  7. CSS3 Media Queries在iPhone4和iPad上的运用
  8. 从新手机到老股票 闲鱼为何会沦为骗子与营销的新平台?
  9. 前端快速开发插件emmet,炫技必备
  10. Qt Console Application
  11. 考公 | 张小龙讲申论(2019地市级真题)
  12. rman备份遇到的设置rman导致数据库变慢的原因
  13. 基于时空注意力的图卷积网络在路段级交通预测中的应用
  14. 完美解决:调用sklearn出现诸如ImportError: cannot import name ‘LogisticR‘ from ‘sklearn.linear_model‘ (D:\Progr
  15. arcgis新建图层信息复制_ArcGIS中的数据库之间复制和粘贴数据
  16. 访问服务器上的图片显示404,vue run build打包之后服务器端访问图片404
  17. ai专家人工智能讲师老师叶梓老师《人工智能概念入门》培训人工智能项目咨询-8
  18. 基于PaddlePaddle框架的BP神经网络的鲍鱼年龄的预测
  19. 餐厅食材采购信息管理系统的设计与实现
  20. 【React项目架构 】+后台管理系统cms实操

热门文章

  1. 一个功能强大超级好用的图表组件Dundas Chart
  2. SQL结构化数据查询语言培训讲义
  3. TCP加速机制是如何加速的?
  4. Java和C的关系及发展历程
  5. 实验二(第一部分,第二部分)
  6. linux网络 (三):网络测试
  7. 中国统计网又出干货了——会员分层与顾客忠诚度分析
  8. java day45【JQuery 高级:动画,遍历,事件绑定,案例,插件】
  9. 搜索框+ 定时器+Bug解决
  10. Tensorflow 搭建自己的神经网络(四)