CC00014.python——|Hadoop&Python.v14|——|Arithmetic.v14|语法:数据结构&字符串.V1|

一、数据结构:字符串
### --- 数据结构:字符串

~~~     在任何一门编程语言中,字符串都是最基础、最重要的数据结构。
~~~     前面我们已经学习过字符串的基本使用方法,现在继续深入的学习更多的知识。
一、字符串的格式化输出:
### --- 格式化运算符

~~~     # 在之前while循环的一个例子中, 有这样一行代码:
print("我跑完了第" + str(lap + 1) + "圈")
~~~     # 这里我们使用了两个加号做了字符串拼接,并且将整形转换成了字符串,现在介绍一种更好的办法,使用格式化输出来打印这句话。
~~~     # 这里的百分号就是格式化符号,跟模运算符一样,但在不同的地方用法不一样。%d是一种占位,表示要显示在这里是一个整数,常

print("我跑完了第%d圈" % 1)
二、用的占位符有以下几种:
占位符 描述
%d 整数占位符
%f 浮点数占位符
%.f 指定精度的浮点数占位符
%s 字符串占位符
%% 输出百分号%
~~~     # 如果给%d 传入一个浮点数,那它会自动将它转换成整数
print("%d" % 3.14) # 输出3
print("%d" % 3.99) # 输出3

~~~     # 转换成整数的规则和类型转换的规则一 样,不会四舍五入。
~~~     # %f的用法有两种,一种就是直接使用,比如
print("%f" % 3.14)
~~~     # 它会输出“3.140000”,后面的0是自动补齐的,如果我们只想要输出小数点后两位,可以这样写:
print("%.2f" % 3.14)
print("%.2f" % 3.1415926)

~~~     # 上面的两行代码输出都是"3.14","%.2f" 这种写法指定了小数点后面的位数,即使浮点数后面的小数部分超出了2位,也只会输出两位。如果不足两位,或者是个整数,会自动补零到两位。
print("%.2f" % 3) # 3.00
print("%.2f" % 3.1) # 3.10
~~~     # %s 是胜任最广泛的占位符,它可以对应任何类型的变量。

print("%s" % 100) # 输出100
print("%s" % 3.14) # 输出3.14
print("%s" % "python") # 输出python
~~~     # 在同一个字符串可以同时使用多个占位符:
report = "%d年%s公司营收增长了百分之%.2f" % (2019, "腾讯", 20.28)
print(report)

~~~     # 当我们需要在字符串输出一个百分比,就需要用到%%,比如说:
report = "%d年%s公司营收增长了%.2f%%" % (2019, "腾讯", 20.28)
print(report)
### --- format函数

~~~     # 除了%运算符外,Python还为我们提供了字符串的format函数提供丰富的格式化。比如说,在输出一个较长的数字时,根据国际惯例,每三位用逗号分隔:
'{:,}'.format(1234567890)
# 1,234,567,890
~~~     # format函数也可以像%那样来格式化多个参数:

report = "{0}年{1}公司营收增长了{2}%".format(2019, "腾讯", 20.28)
print(report)
~~~     # {0}表示第一个参数,{1}{2}表示第二、第三个参数,以此类推。这样做的好处是,如果有参数在字符串出现多次,可以不用重复的传入。
~~~     # 假设这个GDP数据在报告中多处被引用,万一需要修订的话,我们只需要修改一处就行了。

'{0}的GDP为{1:,}...虽然它的GDP只有{1:,}美元,但它的人均GDP高达18万美元'.format("摩纳哥",7100000000)
二、字符串的下标和切片
### --- 字符串其实也是一种序列,可以理解为一串整齐的按顺序排着队的字符,

~~~     组成了字符串,那每个字符在队伍中都有自己的位置,这个位置就是下标,又叫作索引。
CC00014.python——|Hadoop&Python.v14|——|Arithmetic.v14|语法:数据结构&字符串.V1|_第1张图片
~~~     # 如上图,"CHINA"这个字符串,从左往右每一个字符对应了一个下标(索引),需要特别注意的是,在计算机编程中,所有的下标都是从0开始的,当我们要访问一个字符串的第1个字符时,使用的下标应该是0。

"CHINA"[0]
~~~     # 使用中括号加数字的方式,表示要访问的是具体哪个位置上的字符。
"CHINA"[1] # 第2个字符"H"
"CHINA"[4] # 第5个字符"A"

~~~     # 第5个字符"A"是这个字符串的最后一个,我们也可以这样来访问:
"CHINA"[-1] # 最后一个字符"A"
"CHINA"[-2] # 倒数第二个字符"N"
### --- 使用负数下标可以从右往左访问,这种写法是Python特有的,非常的快捷,对于任意长度的字符串,

~~~     我们都可以使用-1来获取它的最后一个字符,
~~~     注意使用负数下标是是从-1开始的,因为-0也是0,产生重复了。
~~~     切片操作也是Python的一大特色,极大简化了序列访问和操作,
CC00014.python——|Hadoop&Python.v14|——|Arithmetic.v14|语法:数据结构&字符串.V1|_第2张图片
CC00014.python——|Hadoop&Python.v14|——|Arithmetic.v14|语法:数据结构&字符串.V1|_第3张图片
~~~     # 上面的切片将会得到"CHI",切片操作是以冒号隔开两个下标,冒号左边的代表开始下标,右边的代表结束下标,特别需要注意的是,结尾下标表示截取到该下标前一个位置的下标。那[0:3],一共截取了3-0=3个字符,从0开始数,0、1、2,恰好是三个。

"CHINA"[0:3]
CC00014.python——|Hadoop&Python.v14|——|Arithmetic.v14|语法:数据结构&字符串.V1|_第4张图片
"CHINA"[0:6] # CHINA所以如果我们用[0:0]这种写法,将会得到一个空的字符串,
"CHINA"[0:0] # 空字符串
"CHINA"[0:-1] # CHIN

~~~     # 那如果想得到切片出整个字符串,可以这样写
"CHINA"[0:6] # CHINA
~~~     # 但一般我们都会这样写,冒号右边的省略,表示一直截取到最后一个字符。
"CHINA"[0:] # CHINA

~~~     # 事实上,前面的0也可以不写,冒号左边为空表示从第一个字符开始截取。
# 从0到末尾
"CHINA"[:] # CHINA
# 从0到第3个
"CHINA"[:3] # CHI
# 从第3个到末尾
"CHINA"[2:] # INA
~~~     # 如果想要隔一个字符取一个,可以这样写
# 每隔两个字符截取一个
"CHINA"[::2] # CIA

~~~     # 第二个冒号表示截取步长,这里的2表示每两个字符取一个,如果不传,默认就是每一个都取。步长也可以为负数,如果传递了一个负数,则表示是从右往左进行截取。
# 从右往左每隔两个两个字符截取一个
"CHINA"[::-2] # AIC
~~~     # 所以,如果想倒序输出一个字符串,可以这样写

"CHINA"[::-1] # ANIHC
三、字符串函数
### --- 字符串本身有很多函数,前面其实已经学习过一个format函数,我们再来介绍几个其他的常用函数:

~~~     # 去除空白字符函数
~~~     # 先来了解一下什么是空白字符,空白符包括空格、换行(\n)、制表符(\t)。
print("A\tB\tC\nD\tE\tF")
~~~     # 在控制台里会整齐的输出成这样:
A B C
D E F
~~~     # 在C后面有一个\n换行符,所以D才会显示在了第二行。而ABC、DEF之间的空白则是\t制表符造成的。
~~~     # 按键盘上的空格键会产生一个空格,按回车键则会产生一个换行符,按Tab键则会产生一个制表符,用户在输入数据的时候有时候经常会误输入这几个字符,所以在在处理用户输入的数据时,要先去除头尾的空白字符。
password = "123"
input_password = " 123"
print(password == input_password)

~~~     # print输出为False,由于在1前面有一个空格,导致了密码校验失败,所以必须对用户的输入先进行处理password = "123"
password = "123"
input_password = " 123"
print(password == input_password.strip())
~~~     # 我们在input_password后面加了一个函数strip(),现在输出变成了True。strip函数的作用就是去除字符串首尾的所有空白字符。
" abc ".strip()
"\t abc \n".strip()

~~~     # 得到的将是字符串"abc",但是strip函数并不会去除掉字符串之间的空白字符
" a b c ".strip()

~~~     # 得到的结果是"a b c",只去掉了首尾空白字符,保留了中间的。
~~~     # 另外还有 lstrip 和 rstrip 函数,分别去除字符串左边和右边的空白字符
" abc ".lstrip() # 结果'abc '
" abc ".rstrip() # 结果' abc'
~~~     # 大小写操作
~~~     # 这个比较简单,我们直接看代码。

# 将所有字符变成大写
"china".upper() # CHINA
# 将字符串的首字母变成大写
"china".capitalize() # China
# 将所有字符变成小写
"CHINA".lower() # china
# 将每个单词的首字母变成大写
"i have a dream".title() # I Have A Dream
四、字符串判断:判断字符串是否以指定的字符串开头或者结尾
函数 说明
startwith 是否以指定的字符串开头
endswith 是否以指定的字符串结尾
isdigit 是否是一串数字
islower 是否全是小写字母
isupper 是否是大写字母
### --- 查找与替换

~~~     # 在前面智能密码锁的案例中,我们用过in来判断一个字符串是否被包含在另一个字符中
password = '123'
input_pwd = '456123789'
password in input_pwd # True
~~~     # 这样可以判断出是input_pwd中是否有password,但如果想要知道password在input_pwd中的确切位置,就需要使用find函数
input_pwd.find(password) # 结果是3

~~~     # 结果是3。在input_pwd中寻找password,找到了,且它的出现的位置是3,也就是第4个字符。如果没有找到则会返回-1
input_pwd.find("notexists") # 结果是-1
~~~     # 除了find函数,index函数也有相同的功能,唯一的区别是 ,index函数如果没有找到相应的字符串就会报错
input_pwd.index(password) # 结果是3
# 这行代码将会在运行时报错
input_pwd.index("notexists")

~~~     # count函数能够查找出指定的字符串一共出现了几次,如果没有出现,则返回0。
"abba".count('a') # 2
'abba'.count('c') # 0
~~~     # replace函数提供了替换字符串中某些部分的功能

"abba".replace('a', 'b') # 结果是'bbbb'
'apple banana'.replace('apple', 'orange')
# 结果是'orange banana'
### --- 字符串长度

~~~     # 字符串本身没有测量长度的函数,需要借助一个Python内置函数len。
len("China") # 5
len("") # 0
len("a") # 1
~~~     # len函数非常重要,它不光可以测量字符串的长度,也可以测量其他所有有长度的对象。
r = range(10)
len(r) # 10
四、综合案例:
### --- 异常号码数据分析

~~~     结合以上的字符操作知识,可以开发一个电话号码识别程序,用户输入一串数字,
~~~     程序识别它是不是一个有效的电话号码,如果是有效电话号码,
~~~     我们再识别它是一个固定电话号码、手机号码、还是400号码。用户输入"exit"后,程序退出。
~~~     这是一个稍微复杂的需求,在动手写代码之前,我们先分析一下需求。
~~~     先列举一下常见的几种电话号码形式,手机号码是11位的,以1开头,
~~~     不同运营商的前三位不一样,由于三位太多了,我们就以前两位来判断,包括:13,15,17,18,19
~~~     再看固定号码,区号+电话号码的方式,区号可能是三位(010),也可能是四位(0888),
~~~     电话号码是8位,那加起来一共是11位或12位。
~~~     最是400电话,这个特征很明显,以400开头,共10位。
### --- 实现代码如下:

# 11位
# 13 15 17 18 19
# 区号+电话号码  010, 0888 + 8位=11位或12位
# 400电话:400开头,10位
# 当用户输入exit的时候,程序退出

cellphone_number_start = "13 15 17 18 19"
telephone_number_start = "010 021 022 025 0888 0555"
# 13812345678

while True:
    num = input("请输入一个电话号码:\n")
    if num.strip() == 'exit':
        break
    if not num:
        print("电话号码不能为空")
        continue
    num = num.strip()
    if not num.isdigit():
        print("您输入的是一个无效电话号码")
        continue
    if num[:2] in cellphone_number_start and len(num) == 11:
        print("这是一个手机号码")
        continue
    if num.startswith('0'):
        # 01088888888
        # 088812345678
        if (len(num) == 12 and num[:4] in telephone_number_start) or \
                (len(num) == 11 and num[:3] in telephone_number_start):
            print("这是固定电话号码")
            continue
    if num.startswith('400') and len(num) == 10:
        print("这是一个广告电话")
        continue
    print("无法识别该号码")

你可能感兴趣的:(字符串,python,正则表达式,人工智能,编程语言)