1字符串是不可变的数据类型,我们看到的变化实质上上字符串指向了新的内存空间,原先内存空间的值并不会改变。
2三重引号详解
作用1:三个单引号或者双引号可以注释
作用二:三个双引号可以定义多行字符串 注意隐藏的换行符
注意:Ctrl+\ 可以快速注释
3删除字符和字符串
字符串是不可变的,只能通过赋一个空字符串或者使用del语句来清空或者删除一个字符串
s1=" "
del s1
4字符串的基本特性
连接符(+)
重复操作符(*)
计算长度len(s1)
索引: s1[i] 获取特定偏移的元素 正向索引(0,1,2,3) 反向索引(-1,-2,-3,-4)
切片s1[i:j]:提取对应部分作为一个序列
切片的下边界默认为0,上边界默认为字符串长度
切片s1[i:j:k] k为递增步长
s1[:] 获取偏移量从0到末尾之间的元素 是有效拷贝的方法之一
s1[::-1] 是实现字符串反转的一种方法
成员操作符 in ,not in 如果在返回True 否则返回False
验证回文串 s==s[::-1]
s='abcdefgh'
s[::2] #aceg
s[1::2] #bdfh
s[:] #abedefgh
s[::-1] #hgfedcba
6string模块
string.ascii_letters(字母)
string.ascii_lowercase(小写)
string.ascii_uppercase(大写)
string.digits(数字)
string.whitespace(空格)
string.punctuation(标点符号)
#encoding=utf-8
"""
编写一个检查 Python 有效标识符的小脚本,名字是 idcheck.py。
要求:Python 标识符必须以字母或下划线开头
1). 只检查长度大于等于 2 的标识符
2). 以字母或者下划线开始
3). 后面要跟字母,下划线或者或数字
"""
# 导入string模块
import string
while True:
#name = raw_input("请输入标识符: ")
name = input("请输入标识符: ")
if name == 'exit':
print("欢迎下次使用表示符检测器....")
exit(0) # 退出程序, 0代表的是正常退出
# 1). 只检查长度大于等于 2 的标识
if len(name) >= 2:
# pass # 占位符
# 2). 以字母或者下划线开始
if name[0] == '_' or name[0] in string.ascii_letters:
# pass # 占位符
# 3). 后面要跟字母,下划线或者或数字, hello@hhhh
for item in name[1:]:
if not (item == '_' or item in string.ascii_letters+string.digits):
print('Error: 后面没有跟字母,下划线或者数字')
break # 跳出循环
else: # 当正常遍历字符串结束,要执行的内容
print('OK: 正确的变量名')
break
else:
print('Error: 没有以字母或者下划线开始')
else:
print('Error: 长度小于2')
#运行结果:
E:\software-python\Anaconda3\python.exe G:/python-westos/code_python/code-laoshi/day03_codexin/03_idcheck_标识符检测器.py
请输入标识符: 1python
Error: 没有以字母或者下划线开始
请输入标识符: _python
OK: 正确的变量名
7字符串内建方法
#字符串的判断:
str = "happy"
print(str.isalnum()) # 判断所有字符都是数字或者字母
print(str.isalpha()) # 判断所有字符都是字母
print(str.isdigit()) # 判断所有字符都是数字
print(str.islower()) # 判断所有字符都是小写
print(str.isupper()) # 判断所有字符都是大写
print(str.istitle()) # 判断所有单词都是首字母大写,像标题
print(str.isspace()) # 判断所有字符都是空白字符、\t、\n、\r
#运行结果为:
True
True
False
True
False
False
False
#字符串的转换:
str = "www.westos.com"
print(str.upper()) # 把所有字符中的小写字母转换成大写字母
print(str.lower()) # 把所有字符中的大写字母转换成小写字母
print(str.capitalize()) # 把第一个字母转化为大写字母,其余小写
print(str.title()) # 把每个单词的第一个字母转化为大写,其余小写
#运行结果:
WWW.WESTOS.COM
www.westos.com
Www.westos.com
Www.Westos.Com
案 例 3 检 测 大 写 字 母 \color{#FF3030}{案例3 检测大写字母} 案例3检测大写字母
#检测输入的单词,如果是大写或者小写或者标题,输出True,否则输出Faulse
word = input(">> ")
if word.isupper() or word.islower() or word.istitle():
print(True)
else:
print(False)
8字符串开头和结尾匹配
#字符串的开头和结尾匹配:
filename = "hello.log"
if filename.endswith(".log"): #判断文件名是否以.log结尾
print(filename)
else:
print("error file")
url1 = "file:///mnt"
url2 = "file://172.25.254.250/pub/"
url3 = "http:..172.25.254.250/index.html"
if url1.startswith("http://"): #判断url1是否以http://开头
print("爬取网页......")
else:
print("不能爬取网页")
#运行结果:
hello.log
不能爬取网页
9字符串的数据清洗
常用的数据清洗方法有:字符串操作、正则表达式和第三方库。
常用数据清洗的字符串操作有截取、替换、查找和分割。
- 截取:str[开始位置 : 结束位置 : 间隔位置] #默认开始位置为0#
- 替换:str.replace(‘被替换的内容’,‘替换后的内容’) #replace()方法 替换字符串后仅为临时变量,需重新赋值才能保存#
- 查找:str.find(‘要查找的内容’,[开始位置,结束位置]) #默认从0开始,返回目标第一个内容的位置,若未查找到,则返回-1#
- 分割:str.split(‘分割符’,分割次数) #分割后,返回一个列表类型数据
注:字符串操作可以解析HTML,但纯字符串解析HTML会导致代码冗长,不便维护。字符串操作一般用于个别数据清洗,且数据具有一定的特征。
#用户登录系统
import getpass #导入getpass模块,不显示输入的密码
name = input("UserName: ").strip() #输入用户名,并删除开头和末尾的空格
password = getpass.getpass('Password: ').strip()
if name == 'root' and password == 'redhat':
print("用户%s登录成功" %(name))
else:
print("用户%s登录失败" %(name))
#运行结果:
UserName: root
Password:
用户root登录成功
10字符串的位置定调整
>>> s = 'python'
>>> s.center(40) #默认时用空格补齐
' python '
>>> s.center(40,'*')
'*****************python*****************'
>>> s.ljust(40,'-')
'python----------------------------------'
>>> s.rjust(40,'-')
'----------------------------------python'
>>>
11字符串的搜索,统计
>>> s = 'hello python'
>>> s.find('l')
2
>>> s.find('w')
-1
>>> s.index('l')
2
>>> s.index('w')
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
s.index('w')
ValueError: substring not found
>>> s.count('o')
2
>>>
注意:find和index都是索引的作用,但find在索引时,对于寻找不到的字符会报出-1 的结果,而index索引的过程中,如果 不存在,直接会报错。
12字符串的分离与拼接
>>> phone = '132-6754-9876'
>>> phone = '132-6754-9876'
>>> phone.replace('-','')
'13267549876'
>>> phone.replace('-',' ')
'132 6754 9876'
>>> ip = '172.25.254.888'
>>> ip.split('-')
['172.25.254.888']
案例4:Ip检测器
编写一个函数来验证输入的字符串是否是有效的 IPv4 ?
1). IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 -255, 用(".")分割。 比如,172.16.253.1;
2). IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
#ip = '172.25.254.100'
ip = input('IP: ')
# 1). 判断是否为IPv4?是否为4段?
items = ip.split('.') # ['172', '25', '254', '100']
if len(items) == 4:
# 2). IPv4 地址由十进制数, 其范围为 0 - 255
for item in items: # item = '172', '25', '254', '100'
# IPv4 地址内的数不会以 0 开头。 (item.startswith('0') and len(item)!=1)
if not(0 <= int(item) <= 255) or (item.startswith('0') and len(item)!=1):
print('Error')
break
else:
print('OK')
else:
print('Error')
#运行结果:
IP: 172.25.254.886
Error
IP: 172.25.254.190
OK
案例5:用户输入字符串"hello xiao mi", 返回字符串信息"mi-xiao-hello"
#思路:
"""
string = "hello xiao mi"
# 1). 以空格为分隔符分割字符串
items = string.split(' ')
# 2). 对列表的所有元素通过切片的方式进行反转
items = items[::-1]
# 3). 通过join方法以'-'为连接符进行拼接
result = '-'.join(items)
print(result)
"""
代码:
string = input(">> ")
print('-'.join(string.split()[::-1]))
运行结果:
>> hello xiao mi
mi-xiao-hello
13其他内置方法
- cmp() 根据字符串的 ASCII 码值进行比较(py3取消)
- len() 返回字符串的字符数
- max() and min() 返回最大或者最小的字符,(按照 ASCII 码值排列)
- enumerate() 枚举对象同时列出数据和数据下标
- zip() 将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
>>> s = 'hello'
>>> for item in enumerate(s):
print(item)
(0, 'h')
(1, 'e')
(2, 'l')
(3, 'l')
(4, 'o')
>>> for index,value in enumerate(s):
print("index=%s,value=%s" %(index,value))
index=0,value=h
index=1,value=e
index=2,value=l
index=3,value=l
index=4,value=o
>>> for a,b,c in zip('abc','123','ABC'):
print(a,b,c)
a 1 A
b 2 B
c 3 C
>>>
14实战练习
(1)检测大写字母 detect-capital
#代码:
word = input(">> ")
if word.isupper() or word.islower() or word.istitle():
print(True)
else:
print(False)
#结果:
>> USA
True
>> FlaG
False
(2)学生出勤记录 student-attendance-record
#代码如下:
""
学生出勤记录:
难点:不超过两个连续的L,可以转换为LLL出现的次数小于1即可
"""
records = input(">>> ")
print(records.count('A') <= 1 and records.count('LLL') < 1)
#结果:
>>> PPALLP
True
>>> PPALLL
False
(3)机器人能否返回原点 robot-return-to-origin
"""
机器人能否返回原点
分析:要使得机器人回到远点,则必须相反动作的次数相同即可,即moves.count('L')=moves.count('R')并且
moves.count('U')=moves.count('D')
"""
moves = input(">> ")
print(moves.count('L') == moves.count('R') and moves.count('U') == moves.count('D'))
结果:
>> UD
True
>> LL
False
(5)小学生计算能力测试系统(综合)
设计一个程序,用来实现帮助小学生进行算术运算练习,它具有以下功能:
提供基本算术运算 (加减乘)的题目,每道题中的操作数是随机产生的,
练习者根据显示的题目输入自己的答案,程 序自动判断输入的答案是否正确并显示出相应的信息。
最后显示正确率。
import random #导入随机模块
start = input("输入测试数字的大小范围(start,默认是0) >> ")
end = input("输入测试数字的大小范围(end,默认是0) >>")
count = input("输入测试题目数量(默认为10) >>")
#1).给定start.end.count默认值
start = 0 if not start else int(start)
end = 10 if not end else int(end)
count = 10 if not count else int (count)
input("任意键进入测试......")
#print(start.end.count)
#4)显示正确率
right_count = 0
#3).循环count次出count道题目
print("小学生计算能力测试系统".center(50,'*'))
for item in range(count):
#2).每道题中的随机数是随机产生的,练习者根据现实的题目输入自己的答案
num1 = random.randint(start,end)
num2 = random.randint(start,end)
operator = random.choice('+-')
#print (num1,num2,operator)
user_result = int(input('%s %s %s ='%(num1,operator,num2)))
right_result = eval("%s%s%s" %(num1,operator,num2))
if user_result == right_result:
print("回答正确")
right_count +=1
else:
print("回答错误")
print("正确率: %.2f %%"%((right_count / count)*100))
#测试:
输入测试数字的大小范围(start,默认是0) >> 100
输入测试数字的大小范围(end,默认是0) >>100
输入测试题目数量(默认为10) >>5
任意键进入测试......
*******************小学生计算能力测试系统********************
100 - 100 =0
回答正确
100 + 100 =200
回答正确
100 - 100 =0
回答正确
100 - 100 =0
回答正确
100 + 100 =100
回答错误
正确率: 80.00 %
参考自https://blog.csdn.net/daidadeguaiguai/article/details/103342790