从一道题开始
听我给你讲一个Python字符串的故事。
首先,我们来看一段代码:
a = ('adfafa','addfdedf' 'abbbbbeadf')
print(min(a))
# 输出结果为:addfdedfabbbbbeadf
输出结果是不是和你想的一样呢?
有没有人能解释下,为什么会是这样的结果呢?
如果能,那就不用浪费时间看下文了。
如果不能,那就跟着我一起来学习下字符串的知识。
s = 'hello world' # 单引号
s = "hello world" # 双引号
s = '''hello world''' # 三单引号
s = """hello world""" # 三双引号
我们知道在Python中,字符串必须是由一对单引号或双引号或三引号包裹起来的。
那么,像'addfdedf' 'abbbbeadf'
这样的写法,Python是怎么识别它的呢?
换句话说,Python是如何判断一个string的呢?
思路方法
「第一步:查找开始标识符」
- 那就看是否是空格,如果不是空格,那就直接报语法错;
- 如果是,那就忽略不计,继续挨着往下检查,循环第一步,直至遇到第一个标识符,也就是开始标识符,才可以进入到第二步;
「第二步:确认开始标识符的类型,并查找相应配对的结束标识符」
- 这里还要判断是单引号,还是双引号;这一步的意义在于告诉计算机在接下来的查找中,要依照什么模样来寻找匹配的那个结束标识符,这一点非常重要。
- 如果是,好了,这就被默认为三引号方式(可以允许中间存在换行符显示为多行的那种),那就直接去找负责结束的另外一组三引号。
- 找到了,好的,他们包裹的中间这一部分就是一个string。再从这里开始重新回到第一步起点1,开始新的一轮查找判断。直到检查完圆括号里最后一个字节符号。
- 在标识符之前之后遇到的空格, 都将被直接忽略。逗号将被认为是分隔新string的标志,并且不允许出现连续的逗号,否则就会报语法错误,如果打印的话,逗号默认被替换成一个空格作为间隔。
- 如果碰巧接下来三个正好就是三引号,那就等于它们什么都没包裹,也就不占任何空间,所以连续6个单引号或双引号,也同样会被忽略不计。
- 没找到,好吧,被耍了,报错: EOL-while scanning string literal.(按Ctrl+C强制结束)
- 如果不是,那之前的两个引号就被忽略不计,再从这里开始重新回到第一步起点1,开始新的一轮查找判断。
- 如果不是,那就挨着去找负责标识结束的另外一个单引号或双引号。
- 找到了,好的,他们包裹的中间这一部分就是一个string。再从这里开始重新回到第一步起点1,开始新的一轮查找判断。
- 没找到,好吧,被耍了,报错: EOL-while scanning string literal.
「第三步:始终检查语法,直至最后一个字节符号」
- 这里面其实还要检查转义字符、格式符等,但为了更清晰地看清思路方法,被我略去了,有兴趣的话可以自行补充。
动手检验
怎么样,看明白了吗?
接下来,我出几道题,你可以上手敲一敲,检查一下学习效果。
# print('dfafadfa''''''''' '''''''x')
# print('a'''''' b ''''''''''c')
# print("''''''''''")
# print('""""""""')
# print("""""""")
# print(""""""""""""""""""")
# print(r"cccc:/\fdj")
# print(r'"a''''''''' b '''''''c'"')
# print(r'"a')
# print('''abc''''d','e')
# print('''abc''''d',,'','e',' f')
# print('''abc''''d ' , '','e',' f')
# print('a',)
# print('abc")
# print( "abc")
# print('a''b''c')
# print('a' 'b' 'c')
怎么样,都做对了吗?如果还有不明白的地方,可以留言给我。
小结
- 字符串标识符必须成对出现;标识符前后的空格都将被忽略不计。
- 逗号作为间隔,只能是单个出现,打印时默认为一个空格。