写点什么

挑战 30 天学完 Python:Day4 数据类型 - 字符串 str

作者:MegaQi
  • 2022-10-15
    上海
  • 本文字数:8273 字

    阅读完需:约 1 分钟

挑战30天学完 Python:Day4数据类型-字符串str

🎉 本系列为 Python 基础学习,原稿来源于 github 英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过 30 天完成正儿八经的系统化实践。此系列适合零基础同学,会简单用但又没有系统学习的使用者。总之如果你想提升自己的 Python 技能,欢迎加入《挑战 30 天学完 Python》。

作者:大奇 MegaQi | Info 签约作者 ,专注测试开发技术实战干货分享,欢迎访问主页长期关注。

Python 字符串

文本就是字符串数据类型,任何数据类型写成文本形式都是字符串。被单引号(''),双引号("") 或三个引号括起来的也都是字符串。在 Python 中有很多不同的方法和内置函数来处理字符串数据类型。其中检查字符串长度方法使用len()

创建字符串

# 一个字符串可以是单个字符也是多个letter = 'P' print(letter)               # Pprint(len(letter))          # 1
# 字符串应该被单或双引号包裹 “Hello, Python”greeting = 'Hello, Python!'print(greeting) # Hello, Python!print(len(greeting)) # 14
sentence = "I hope you are enjoying 30 days of Python Challenge"print(sentence)
复制代码


多行字符串是通过使用三重单引号(''')或双引号(""")创建。参考下面的例子:

multiline_string = '''I am a teacher and enjoy teaching.I didn't find anything as rewarding as empowering people.That is why I created 30 days of python.'''print(multiline_string)
# 另外一种方式做了同样的事情multiline_string = """我是技术传播者,喜欢教学和分享.我发现没有任何事情能比赋予人们知识更有意义.那就是我为什打造“挑战30天学习完Python“的原因."""print(multiline_string)
复制代码

字符串连接

我们可以将字符串连接在一起,合并或者连接称之为字符串联。看下例子:

first_name = 'Mega'last_name = 'Qi'space = ' 'full_name = first_name  +  space + last_nameprint(full_name) # Meaga Qi
# 使用内置函数len()查看字符串长度print(len(first_name)) # 4print(len(last_name)) # 2print(len(first_name) > len(last_name)) # Trueprint(len(full_name)) # 7
复制代码

字符串转义

在 Python 和其他编程语言中,\ 后面跟一个字符是转义序列。让我们看看最常见的转义字符:

  • \n: 换行

  • \t: 制表符 (8 空格)

  • \: 反斜杠

  • ': 单引号 (')

  • ": 双引号 (")


这里补充下为啥有转义,因为像引号在上边说过是做为包裹字符文本使用的。如果想在一个字符串中使用这个引号字符就会导致处理错误。例如 print("我是"引号"字符串") 就无法正确识别字符串双引号开闭区间了。所以需要通过\转义来告诉程序这是不同的字符。


继续,先让我们看下使用转义字符的实际例子。请自己在 python shell 或者编辑器中编写代码执行。

# 换行符print('I hope everyone is enjoying the Python Challenge.\nAre you ?') 
# 添加制表符或四个空格print('Days\tTopics\tExercises') print('Day 1\t5\t5')print('Day 2\t6\t20')print('Day 3\t5\t23')print('Day 4\t1\t35')
# 字符串中带反斜杠print('This is a backslash symbol (\\)')
# 字符串种使用双引号print('In every programming language it starts with \"Hello, World!\"')
# 输出结果I hope every one is enjoying the Python Challenge.Are you ?Days Topics ExercisesDay 1 5 5Day 2 6 20Day 3 5 23Day 4 1 35This is a backslash symbol (\)In every programming language it starts with "Hello, World!"
复制代码

字符串格式化

旧式字符串格式化(%运算符)

在 Python 中有很多方式对字符串格式化操作。这这小节里我们将讲解其中一些。操作符“%”用于格式化包含在“元组”(固定大小的列表)中的一组变量。与包含普通文本和“参数说明符”的格式字符串一起使用。


这些特殊符号有:

  • %s - 字符

  • %d - 整数

  • %f - 浮点数

  • "%.数字 f" - 浮点数固定小数点后几位

# 仅字符name = 'MeagaQi'language = 'Python'formated_string = 'I am %s. I teach %s' %(name, language)print(formated_string)
# 字符和数字radius = 10pi = 3.14area = pi * radius ** 2# 表示浮点后边保留两位小数formated_string = 'The area of circle with a radius %d is %.2f.' %(radius, area)
python_libraries = ['Django', 'Flask', 'NumPy', 'Matplotlib','Pandas']formated_string = 'The following are python libraries:%s' % (python_libraries)print(formated_string)
# 输出结果I am MeagaQi. I teach PythonThe following are python libraries:['Django', 'Flask', 'NumPy', 'Matplotlib', 'Pandas']
复制代码

新式字符串格式化(str.format)

这个格式化方式在 Python3 中增加并使用。


name = 'MegaQi'language = 'Python'formated_string = 'I am {}. I teach {}'.format(name, language)print(formated_string)# 输出I am MegaQi. I teach Python
a = 4b = 3print('{} + {} = {}'.format(a, b, a + b))print('{} - {} = {}'.format(a, b, a - b))print('{} * {} = {}'.format(a, b, a * b))print('{} / {} = {:.2f}'.format(a, b, a / b))print('{} % {} = {}'.format(a, b, a % b))print('{} // {} = {}'.format(a, b, a // b))print('{} ** {} = {}'.format(a, b, a ** b))# 输出4 + 3 = 74 - 3 = 14 * 3 = 124 / 3 = 1.334 % 3 = 14 // 3 = 14 ** 3 = 64
# 字符和数字radius = 10pi = 3.14area = pi * radius ** 2formated_string = 'The area of a circle with a radius {} is {:.2f}.'.format(radius, area) # 2 digits after decimalprint(formated_string)# 输出The area of a circle with a radius 10 is 314.00.
复制代码

字符串插入/f-string 格式化

另一种新的字符串格式化是插值。f-string是以字符串以 f 开头,然后将数据注入到相应的位置。 这种新方式是 Python 3.6 之后加入标准库的。官方文档描述说要比上边两种方式都快,因为 f-string 是运行时渲染的表达式,而不是常量值。

a = 4b = 3print(f'{a} + {b} = {a +b}')       # 7print(f'{a} - {b} = {a - b}')      # 1print(f'{a} * {b} = {a * b}')      # 12print(f'{a} / {b} = {a / b:.2f}')  # 1.33print(f'{a} % {b} = {a % b}')      # 1print(f'{a} // {b} = {a // b}')    # 1print(f'{a} ** {b} = {a ** b}')    # 64
复制代码

Python 字符串作为字符序列

Python 字符串是字符序列,并与其他 Python 有序对象序列(列表和元组)共享它们的基本访问方法。从字符串中提取单个字符的最简单方法是将它们解包到相应的变量中。

解包字符

language = 'Python'a,b,c,d,e,f = language # 将序列字符拆分到变量中print(a) # Pprint(b) # yprint(c) # tprint(d) # hprint(e) # oprint(f) # n
复制代码

索引访问

在程序中计数从零开始。因此字符串的第一个字母的下标为 0,字符串的最后一个字母的长度是字符串的长度减 1。



language = 'Python'first_letter = language[0]print(first_letter) # Psecond_letter = language[1]print(second_letter) # ylast_index = len(language) - 1last_letter = language[last_index]print(last_letter) # n
复制代码


如果我们想从右边开始,我们可以使用负索引。-1 是最后一个索引。

language = 'Python'last_letter = language[-1]print(last_letter) # nsecond_last = language[-2]print(second_last) # o
复制代码

字符串切片

在 python 中,我们可以将字符串切成子字符串。语法格式 str[beginIndex:endIndex:step],并且取值结果为[begin,end) 半开区间即含头不含尾。步长不设置情况下默认为 1。

language = 'Python'first_three = language[0:3] # 下角标从0开始到3,但不包括3,等同于language[0:3:1]print(first_three) #Pytlast_three = language[3:6]print(last_three) # hon
# 切片时跳过字符串用法step_str = language[0:5:2] # 表示中间各一个获取print(step_str) # Pto
# 其他一些处理方法last_three = language[-3:] # 从倒数第3位开始到最后print(last_three) # honlast_three = language[3:] # endIndex不设置默认到末尾print(last_three) # hon
复制代码

倒叙取值

在 Python 要对字符串进行倒序很容易。就是利用分片语法。解释下例子:即表示将开始的值设置成最后一位,结束的值设置成第一位,反向从右到左。

greeting = 'Hello, World!'print(greeting[::-1]) print(greeting[-1::-1])# !dlroW ,olleH
复制代码

切片时跳过字符

通过将 step 参数传递给 slice 方法,可以在切片时跳过字符。

language = 'Python'pto = language[0:6:2]print(pto) # Pto
复制代码

字符串方法

在 Python 中还有很多字符串方法来处理格式。以下将通过一些例子展示。


  • capitalize() :将字符串的第一个字符转换为大写字母

challenge = 'thirty days of python'print(challenge.capitalize()) # 'Thirty days of python'
复制代码


  • Count() :返回字符串中给定字符出现次数。语法 count(substring, start=.., end=..)。其中 start 为开始索引,end 为结束索引。

challenge = 'thirty days of python'print(challenge.count('y')) # 3print(challenge.count('y', 7, 14)) # 1, 只统计索引范围7-14(不含14)内y的个数print(challenge.count('th')) # 2
复制代码


  • endswith() :检查字符串是否以指定的结尾结束。

challenge = 'thirty days of python'print(challenge.endswith('on'))   # Trueprint(challenge.endswith('tion')) # False
复制代码


  • expandtabs() :方法把字符串中的 tab 符号 \t 转为空格,tab 符号 \t 默认的空格数是 8。在第 0、8、16...等处给出制表符位置,如果当前位置到开始位置或上一个制表符位置的字符数不足 8 的倍数则以空格代替。

challenge = 'thirty\tdays\tof\tpython'print(challenge.expandtabs())   # 'thirty  days    of      python'print(challenge.expandtabs(10)) # 'thirty    days      of        python'
复制代码


  • find() :返回子字符串第一次出现的索引,如果没有找到则返回-1。

challenge = 'thirty days of python'print(challenge.find('y'))   # 5,thirty单词中第一出现的 yprint(challenge.find('th'))  # 0,thirty单词中第一出现的 thprint(challenge.find('ths')) # -1,整个字符串中没有出现连续的 ths 返回-1 表示没有找到
复制代码


  • rfind() :返回子字符串最后一次出现的索引,如果没有找到则返回-1。

challenge = 'thirty days of python'print(challenge.rfind('y'))  # 16,pyhton单词中最后出现的 yprint(challenge.rfind('th')) # 17,python单词中最后出现的 thprint(challenge.find('ths')) # -1
复制代码


  • Format() :将字符串格格式化输出。次内容在上边详细讲过了,这里再举些例子。

name = 'MegaQi'age = 18job = 'tester'country = 'China'sentence = 'I am {}. I am a {}. I am {} years old. I live in {}.'.format(name, age, job, country)print(sentence) # 输出# I am MegaQi. I am a 18. I am tester years old. I live in China.
radius = 10pi = 3.14area = pi * radius ** 2result = 'The area of a circle with radius {} is {}'.format(str(radius), str(area))print(result) # 输出# The area of a circle with radius 10 is 314
复制代码


  • index() :返回给定值第一个匹配项的索引位置,函数形式index(x[, start[, end]]) ,其中附加参数可指定开始(默认 0)和结束(默认-1)位置。如果子字符串没有匹配则抛出了 ValueError 异常。


区别说明:index()函数和 find()函数功能类似。区别在于找不到的返回值不同,前者返回-1,后者异常 ValueError: substring not found

challenge = 'thirty days of python'sub_string = 'da'print(challenge.index(sub_string))  # 7print(challenge.index(sub_string, 9)) # error
复制代码


  • rindex(): 返回给定值最后一个匹配项的索引位置,同样有扩展参数来制定查找开始和结束位置。函数使用参考上述。

challenge = 'thirty days of python'sub_string = 'da'print(challenge.rindex(sub_string))  # 7print(challenge.rindex(sub_string, 9)) # error
复制代码


  • isalnum(): 检查字符串是否仅为字符数字组合

challenge = 'ThirtyDaysPython'print(challenge.isalnum()) # True
challenge = '30DaysPython'print(challenge.isalnum()) # True
challenge = 'thirty days of python'print(challenge.isalnum()) # False, 空格不属于alphanumeric(字母数字)的组合
challenge = 'thirty days of python 2019'print(challenge.isalnum()) # False
challenge = 'thirty@123'print(challenge.isalnum()) # False
复制代码


  • isalpha(): 检查是否所有字符串元素都是字母字符(a-z 和 a-z)

challenge = 'thirty days of python'print(challenge.isalpha()) # False, 空格也不属于字母字符范畴
challenge = 'ThirtyDaysPython'print(challenge.isalpha()) # True
num = '123'print(num.isalpha()) # False
复制代码


  • isdecimal(): 检查字符串中的所有字符是否都是十进制(0-9)

challenge = 'thirty days of python'print(challenge.isdecimal())  # False
challenge = '123'print(challenge.isdecimal()) # True
challenge = '\u00B2'print(challenge.isdecimal()) # False
challenge = '12 3'print(challenge.isdecimal()) # False 注意有空字符所以不符合数字检查
复制代码


  • isdigit(): 检查字符串中的所有字符是否都是数字(0-9 和一些用于数字的其他 unicode 字符)

challenge = 'Thirty'print(challenge.isdigit()) # False
challenge = '30'print(challenge.isdigit()) # True
challenge = '\u00B2'print(challenge.isdigit()) # True 如果你使用 print('\u00B2') 打印会看到输出是2
复制代码


  • isnumeric(): 检查字符串中的所有字符是否都是数字或与数字相关的(很像 isdigit(),但接受更多的符号,比如½)

num = '10'print(num.isnumeric()) # True
num = '\u00BD' # print('\u00BD') = ½print(num.isnumeric()) # True
num = '10.5'print(num.isnumeric()) # False
复制代码


  • isidentifier(): 检查一个有效的标识符,即检查一个字符串是否是一个有效的变量名

challenge = '30DaysOfPython'print(challenge.isidentifier()) # False, 因为是数字开头不是一个有效的变量名,具体可回顾Day2:变量和内置函数
challenge = 'thirty_days_of_python'print(challenge.isidentifier()) # True
复制代码


  • islower(): 检查字符串中的所有字母字符是否都是小写

challenge = 'thirty days of python'print(challenge.islower()) # True
challenge = 'Thirty days of python'print(challenge.islower()) # False
challenge = '30天Python学习挑战'print(challenge.islower()) # False 中文不是英文字母
复制代码


  • isupper(): 检查字符串中的所有字母字符是否都是大写

challenge = 'thirty days of python'print(challenge.isupper()) #  False
challenge = 'THIRTY DAYS OF PYTHON'print(challenge.isupper()) # True
复制代码


  • join(): 返回一个连接后的字符串

web_tech = ['HTML', 'CSS', 'JavaScript', 'React']
result1 = ' '.join(web_tech)print(result1) # 'HTML CSS JavaScript React'
result2 = '# '.join(web_tech)print(result2) # 'HTML# CSS# JavaScript# React
复制代码


  • strip(): 剔除开头和结尾符合指定字符,并返回新的字符串

challenge = 'thirty days of pythoonnn'print(challenge.strip('noth')) # 'irty days of py'
复制代码


  • replace(): 字符串替换

challenge = 'thirty days of python'print(challenge.replace('python', 'coding')) # 'thirty days of coding'
复制代码


  • split(): 字符串拆分, 使用给定的字符串或空格(不指定时候默认)字符

challenge = 'thirty days of python'print(challenge.split()) # ['thirty', 'days', 'of', 'python']
challenge = 'thirty, days, of, python'# 注意对比下两个输出的区别print(challenge.split(', ')) # ['thirty', 'days', 'of', 'python']print(challenge.split(',')) # ['thirty', ' days', ' of', ' python']
复制代码


  • title(): 字符串中所有单词首字母大写

challenge = 'thirty days of python'print(challenge.title()) # Thirty Days Of Python
复制代码


  • swapcase(): 将字符串中所有大写字符转小写,反之小写转大写

challenge = 'thirty days of python'print(challenge.swapcase())   # THIRTY DAYS OF PYTHON
challenge = 'Thirty Days Of Python'print(challenge.swapcase()) # tHIRTY dAYS oF pYTHON
复制代码


  • startswith(): 检查某字符串是否已某个特殊字符串值开始

challenge = 'thirty days of python'print(challenge.startswith('thirty')) # True
challenge = '30 days of python'print(challenge.startswith('thirty')) # False
challenge = '挑战30天学完python'print(challenge.startswith('挑战')) # True
复制代码


✍️ 以上字符串方法很多,也都是简单举个例子,并没有展开讲,因为平常编程中常用的可能就几个,如splitreplacejoinstripindexfind。所以不必纠结全部记住,也不要奢望看一次就会用。熟练在编程中使用一定是一种肌肉记忆。


🌕 你是一个具有非凡潜力的人。恭喜你已经完成第四天学习的挑战,在 Python 编程伟大的道路上前进了 4 步。趁热打铁让我们做一些练习巩固下吧。

第 4 天练习

  1. 将这些单词字符 'Thirty', 'Days', 'Of', 'Python' 格式化输出一串字符 'Thirty Days Of Python'

  2. 用不同的格式方式连接单字符串 'Coding', 'For' , 'All' 为'Coding For All'.

  3. 声明一个变量名为 company 并初始化值为 "Coding For All"

  4. 使用_ print()_ 打印字符串变量 company 的值

  5. 使用_ len() _获取 company 字符串值的长度并输出

  6. 使用 upper() 函数将 company 变量值全部转成大写

  7. 使用 lower() 函数将 company 变量值全部转成小写

  8. 利用 capitalize(), title(), _swapcase() _这三个方法函数对其字符串"coding for all"进行操作输出

  9. 通过切片(slice)的方式,提取字符串 "Coding For All string" 第一个单词"Coding"

  10. 使用 index, find 或者其它方法,检查"Coding For All"是否包含指定的字符串

  11. 字符串 'Coding For All' 将 Coding 替换成其他单词

  12. 使用 replace 方法或其他方法将 Python for Everyone 更改为 Python for All

  13. 通过方法 _split() _使用空格字符拆分 'Coding For All' 并输出

  14. "Facebook, Google, Microsoft, Apple, IBM, Oracle, Amazon"通过逗号进行拆分

  15. Coding For All 下角标为 0 的字符是什么?

  16. Coding For All 最后索引的字符是什么?

  17. Coding For All 索引 10 的字符是什么?

  18. 将 'Python For Everyone' 首字母提取组成一个缩写并给一个新字符变量

  19. 使用 index 找到字符 'C' 在 'Coding For All' 中第一次出现的位置

  20. 使用 index 找到字符 'I' 在 'Coding For All People' 中最后次出现的位置

  21. 使用 index 或 find 查找单词"because"在以下句子中第一出现的位置: 'You cannot end a sentence with because because because is a conjunction'

  22. 使用 rindex 或 rfind 查找单词"because"在以下句子中最后一次出现的位置: 'You cannot end a sentence with because because because is a conjunction'

  23. 从语句"You cannot end a sentence with because because because is a conjunction"中剔除出多余的 'because because because'

  24. 用一种方法分别找出第首次和最后一次出现 '因为' 的位置,语句:'你不能用因为因为因为来结束一个语句'

  25. 检查“Coding For All”是否以子字符“Coding”开头

  26. 检查“Coding For All”是否以子字符“Coding”结束

  27. 移除' Coding For All ' 左右两边的空格.

  28. 以下哪句使用 isidentifier() 方法检查会返回 True,并回忆它验证了什么?

  • 30DaysOfPython

  • thirty_days_of_python


  1. 有一个包含 python 使用库名称列表。请使用 join 将其用空格连成一个字符串。

  2. 使用换行转译符将一句话换行输出,最后的输出结果如下:

I am enjoying this challenge.I just wonder what is next.
复制代码


  1. 使用制表符转义序列写出以下内容

Name      Age     Country   CityAsabeneh  250     Finland   Helsinki
复制代码


  1. 使用字符格式化方法显示一下内容:

radius = 10area = 3.14 * radius ** 2The area of a circle with radius 10 is 314 meters square.
复制代码


  1. 使用格式化的方式计算和输出以下内容:

8 + 6 = 148 - 6 = 28 * 6 = 488 / 6 = 1.338 % 6 = 28 // 6 = 18 ** 6 = 262144
复制代码


🎉 CONGRATULATIONS ! 🎉

英文原文:Day 4 - Strings


如喜欢通过“点赞👍收藏❤️关注➕”鼓励作者大奇

文章中如有错误或疑问欢迎指正和交流。

发布于: 刚刚阅读数: 2
用户头像

MegaQi

关注

InfoQ签约作者 |公众号: 大奇测试开发 2018-02-15 加入

分享一些系列测试平台开发教程,也记录一些自己研究的技术,遇到的问题,总之想分享一些干货内容,愿给这个行业贡献微不足道的力量,不断突破不断成长。

评论

发布
暂无评论
挑战30天学完 Python:Day4数据类型-字符串str_挑战30天学完Python_MegaQi_InfoQ写作社区