# 复习字符串
# m ="abc"
# n ='abc'
# p = '''abc'''
#
# print(m is n) # 比较 id
# print(m == n) # 比较value
# print(m==p)
# print(m is p)
'''
# % 字符串的格式化占位符
name = "stevn"
print('%s说:%s' % (name, "好好学习!"))
# r 保留原格式,有r则不发生转义 没有r则发生转义(例如:\')
print(r"%s说:\'哈哈哈\'" % name)
# [ ] [start:end:方向或者步长] 切片、取值
filename = "picture.png"
# 位置都是从零开始,位置也会称作“下标”,或者“索引”
print(filename[5]) # 通过[]可以结合位置获取字母 特点: 只能获取一个字母
# range(1,10) ----类似----> [1:10]
print(filename[0:7]) # 包头不包尾
print(filename[3:7]) # 截取字符串
print(filename[3:]) # 省略的是后面的,表示一直取到字符串的结尾
print(filename[:7]) # 省略的是前面的,表示从0开始取值
# 负数
print(filename[8:-1]) # 8是头,-1是尾,-1是g -1是逆序表示数字
print(filename[:-2])
print(filename[-1:])
print(filename[-5:-1])
# [::-1] 倒序 与 [:]相反 只能用-1表示倒序
print(filename[::-1])
str1 = "abcdefg"
print(str1[-1:-5:-1])
print("------>",str1[0:5:-1]) # 取不到值,因为-1表示倒序取值,那么从0开始往左没有字符串,所以取不到值
print(str1[5:0:-1]) # 能取到值,-1表示倒序,从第5个取到第0个,当然有值
print("------>",str1[5:0:1])
print(str1[:])
# 非-1的负数,在第二个冒号后面表示“倒序的步长”
print(str1[::-2]) # 倒序步长
print(str1[::2]) # 正序步长
'''
'''
# 字符串的内建函数:声明一个字符串,默认可以调用内建函数(系统准备好的一些函数)
# 第一部分: 大小写相关的
# capitalize(), 将字符串的第一个字符串转成大写的标识形式
# title(), 返回的是,每个单词的首字母大写的字符串(驼峰原则) istitle.(), 返回的结果是布尔类型,True or False
# upper(), 将字符串征程全部大写的表示形式 isupper(),
# lower(), 将大写全部转成小写 islower(),
message = "zhaorui is a beautiful girl"
msg = message.capitalize()
print(msg)
msg = message.title()
print(msg)
result = msg.istitle()
print(result)
result = message.istitle()
print(result)
msg = message.upper()
print(msg)
result = msg.lower()
print(result)
'''
'''
# 案例: 产生验证码
s = "ABCDEFGHIJKLMNOPQRSTUVWXZYabcdefghijklmnopqrstuvwxyz1234567891"
print(len(s))
# 四个随机数
code = ""
import random
# IndexError: string index out of range, 例如 s = "abc", print(s[3]) 下标超范围会报错
# Index: 0~ len(s)-1 0~61
for i in range(4):
ran = random.randint(0, len(s) - 1)
code += s[ran] # 连续拼接取得的字母或者数字4次
print("验证码:",code)
# 提示输入验证码
user_input = input("请输入验证码:")
if user_input.lower() == code.lower():
print("验证码正确!")
else:
print("验证码错误!")
'''
# 查找和替换字符串
# find(), rfind(), lfind(), index(), rindex(), lindex(), replace()
s1 = "index lucy lucky goods"
result = "r" in s1
print(result)
# find("要查找的字符",start,end)
position = s1.find("R") # 返回值是-1,则表示没找到
print(position)
position = s1.find("l")
print(position) # 如果可以找到,则返回字母第一次出现的位置
# p =s1.find("l", beg=position) # TypeError: find() takes no keyword arguments
p = s1.find("l", position + 1) # 也符合包头不包尾原则,所以+1跳过第6位
# 可以从指定位置开始,到指定位置结束
p1 = s1.find("o", position + 1, len(s1) - 5)
print(p1)
# http://www.ahtcm.edu.cn/images/20/07/10/17ylf7mft3/list-bg.jpg
url = "http://www.ahtcm.edu.cn/images/20/07/10/17ylf7mft3/list-bg.jpg"
p2 = url.rfind("/") # rfind:表示从右侧开始检索字符串"/"位置
filename = url[p2+1:]
print(filename)
'''
index(str, beg = 0, end = len(string))
跟find 方法一样,只不过如果str不在字符串时,index会报一个异常, 如下:
p = "hello".index("x")
print(p)
'''
# 替换 replace(old, new, max), max指替换的最大次数
'''
s1 = "index lucy lucky goods"
s2 = s1.replace(" ", "#")
print(s2)
s2 = s1.replace(" ", "")
print(s2)
s2 = s1.replace(" ", "#", 2)
print(s2)
'''
# 字符串内建函数: encode:编码 decode:解码
# 编码 网络应用 (中文一般涉及到编码,英文无需使用)
msg = "上课啦,认真听课!"
# gbk 中文 gb2312 简体中文 incode
result = msg.encode("utf-8")
print(result)
# 解码 用什么编码,就用什么解码
m = result.decode("utf-8") # result 已经不是字符串,是b开头的一些被编码的字节,所以真正属于字符串的方法是endode()
print(m)
# 字符串内建函数:startswith() endswith() 返回值都是布尔类型True or False
# startswith判断是否以xxx开头的,endswith判断是否以xxx结尾的
# 应用:文件上传功能 只能上传图片(jpg,png,bmp,gif)
filename = "笔记本.doc"
result = filename.endswith("doc")
print(result)
s = "hello"
result = s.startswith("he")
print(result)
# 文件上传功能 只能上传图片(jpg,png,bmp,gif)
path = input("请选择文件:") # C:\roo\bar\desk_background.jpg
# 分析:要上传文件的路径path----> 文件名 ----> 通过文件名再判断是否图片类型
p = path.rfind("\\") # 不能单用"\",这样系统会认为有转义字符,也不能用r'\'保留格式,都会报错,r'\tabc'斜杠后有字符串则不会报错。 通过rfind函数找到文件名位置
print(p)
filename = path[p+1:] # 找到位置后切片,取出文件名
print(filename)
# 判断是否为图片格式
if filename.endswith("jpg") or filename.endswith("png") or filename.endswith("bmp") or filename.endswith("gif"):
print("是图片文件,允许上传!")
else:
print("不是图片格式,只能上传图片!")
# 练习:
# 给定一个路径,允许上传文件(记事本txt或者图片文件jpg、png等等)
# 如果不是对应格式,允许重新指定上传文件
# 如果符合规则,则提示上传成功
# 复习转义字符: \n 换行 \t 四个空格一个制表位 \r 回车 \' 保留单引号 \" 保留双引号 \\ 保留一根\ 见177行解释
'''
while True:
path = input("请选择文件:") # C:\roo\bar\desk_background.jpg
p = path.rfind("\\")
filename = path[p+1:]
if filename.endswith("jpg") or filename.endswith("png") or filename.endswith("txt"):
print("是规定格式文件,上传成功!")
break
else:
print("不是规定格式文件,请重新上传!")
'''
# isalpha() 判断是否是字母 isdigit() 判断是否是数字, 如下:
# s = "abcd6"
# result = s.isalpha()
# print('result = ', result)
#
# s = "8866"
# result = s.isdigit()
# print('result = ', result)
# 输入数字经常用,但一般会加判断是否是数字,才能int后进行运算,如下:
# sum = 0
# for i in range(3):
# num = input("请输入一个数字:") # 经常遇到输错,输入的不是数字,例如10输入成1o
#
# if num.isdigit():
# num = int(num)
#
# sum += num
#
# print("sum = ", sum)
# 但是for已经固定三次循环,不论你输入正确还是错误,都循环三次,所以这样不合理,输错了判断出来应该不计入计算提示重新输入
# ,所以这个代码不好,用while循环代替,如下:
'''
sum = 0
i = 1
while i<=3:
num = input("请输入一个数字:") # 经常遇到输错,输入的不是数字,例如10输入成1o
if num.isdigit():
num = int(num)
sum += num
print("输入的是数字,第{}累加成功!".format(i))
i += 1 # 如果输入的不是数字,则跳到else语句,i就不会加1,循环不会往前走
else:
print("输入的不是数字,请重新输入!")
print("sum = ", sum)
'''
'''
# join() : "-".join("abc") 将abc用-连接构成一个新的字符串
new_str = "-".join("abc")
print(new_str) # 结果产生新的字符串:a-b-c
# python列表 list1 = ['a','v','e','o','9'] 数组
list1 = ['a','v','e','o','9']
result = "".join(list1)
print(result)
# lstrip rstrip strip
s = " hello "
# s = s.lstrip() # 去除左侧空白
# print(s+"8")
# s = s.rstrip() # 去除右侧空白
# print(s+"8")
s = s.strip() # 同时出去两侧的空白
print(s+"6")
# split() 分割字符串,将分割后的字符串保存到列表中
s = "hello world hello kitty"
result = s.split(" ") # 括号里的空格是切割的依据,表示遇到空格就切割
print(result) # 切割结果:['hello', 'world', 'hello', 'kitty']
result = s.split(" ", 2) # 括号里的数字表示分割的数量
print(result)
result = s.split("o")
print(result) # 切割结果:['hell', ' w', 'rld hell', ' kitty']
# count(args) 求字符串里的args的个数
n = s.count(" ") # 求s里空格的个数
print(n)
m = s.count("h") # 求s里h的个数
print(m)
'''