字符串常用方法:

一般常用

print(a.index("b"))#找元素下标,如果找的元素不存在,会报错
print(a.find("b"))#找元素下标,找不到会返回 -1
print(a.index("b",0,2))#在下标0-2之间找
print(a.find("b",3))#在下标3开始找
print(a.strip(''))#去掉字符串两边的空格和两边的换行符,中间的空格换行符去不掉
print(a.lstrip())#去掉左边空格
print(a.rstrip())#去掉右边空格
print(a.strip('.jpg'))#传值,去掉两边有这个值的指定的字符串
print(a.lower()) #把字符串都变成小写的,应用在注册账号,输入验证码,统一转成大写/小写
print(a.upper()) #把字符串都变成大写的
print(a.count("a"))#统计字符串中出现某个字符的个数
print(a.isdigit())#判断这个字符串是否为整数
print(a.isalnum())#只要字符串里不包含符号,就返回true,字母数字就是true,有符号返回false,空格也返回false
print(a.isalpha())#如果是字母或者汉字那就返回true,其他都返回false
字符串格式化共四种方法:
1)"+"  2)%s占位符  3)format()  4)3.6版本以上,可直接写f,f"{phone}"
msg = "你好,{name},今天的日期是{date}"
print(msg.format(name="xiaohei",date="2021-04-28"))
msg1 = "你好,{name},今天的日期是{date}".format(name="xiaohei",date="2021-04-28")
msg2 = "你好,{},今天的日期是{}".format("xiaohei","2021-04-28")

sql = "insert into user values ('%s','%s','%s','%s','%s','%s','%s')" %(id,
    password,name,phone,eamil,count,login_time)#一一对应易出错
sql = "insert into user values ('{id}','{name}','{phone}','{eamil}','{addr}','{login_time}')".format(
    name="xxx",id="xxx",email="xxx",add="xx",phone="xxx")#用format更直观些

msg.format_map()#里面传字典
msg3 = "你好,{name},今天的日期是{date}".format_map({"name":"xiaobai","date":"2021-04-28"})

phone="13714719000"
msg4 = f"你的手机号是{phone}"
msg = "你好,亲爱的老师"
print(msg.startswith("你好")) #判断字符串是否以xx开头
file_name = "a.jpg"
print(file_name.endswith(".jpg"))#判断字符串是不是以xx结尾
num = "5"
print(num.zfill(6)) #补0的,是字符串总长度为6,结果为000005
msg = "nihao,nice to meet you"
new_msg = msg.replace("nihao",'hello')#替换,前旧后新
new_msg = msg.replace("nihao",'hello').replace(" ",'',2)#替换空格为空,替换前两次的

不常用

a = "acv"
print(a.title())#每个词首字母大写
print(a.istitle())#判断每个词首字母大写,为True
print(a.capitalize())#第一个词首字母大写
print(a.isspace())#判断是否为空格,空格为True
print(a.center(50,'*'))#总长度为50,a值在中间,不够以*补充
print(a.isupper())#判断是否全部都为大写字母
print(a.islower())##判断是否全部都为小写字母

特别常用

stus = 'xiaohei,xiaobai,xiaolan'
print(stus.split(',') )#分割字符串的,分割之后他会返回一个list
print(stus.split()) #如果没有指定字符串,那么就按空字符串来分隔,空格换行符也算空字符串.
                    # stus里面没有空字符串,那就将整个元素放在一个list里面,list里面只有一个元素

stu_list = ['xiaohei', 'xiaobai', 'xiaolan']
s='123'
stu_str = '-'.join(stu_list)  # 用-来连接list里面每一个元素,将list变成字符串,必须用join方法
stu_str = '-'.join(s)#也可传入字符串连接

非空即真,非零即真:

a=""
b=[]
c={}
d=0
f=None

username = input("username:").strip()
if not username:
    print("username不能为空")
else:
    print("username",username)

username = input("username:").strip()
if username:
    print("username", username)
else:
    print("username不能为空")

切片操作:

切片就是list范围取值的一种方式,顾头不顾尾
list = list(range(1,11)) #生成器,取[1-10],顾头不顾尾,[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
在python2里面,range(1,11)生成[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]放内存
在python3里面,range(1,11)生成range(1,11)放内存,省内存,需用list(range(1,11))转化下
print(list[-1:-5:-1])#结果为[10, 9, 8, 7],写负数需加上尾部的-1
li = [1,2,3,4,5]
print(li[::-1])#结果为[5, 4, 3, 2, 1]
print(li[1:3])#结果为[2, 3]
print(li[:3]) #0:3,结果为[1, 2, 3]
print(li[2:5]) #0:3,结果为[3, 4, 5]
print(li[2:]) #2:5,结果为[3, 4, 5]
print(li[:]) #2:5,结果为[1,2,3,4,5]
print(list[0:11:2])#结果为[1, 3, 5, 7, 9]
        开始:结束:步长(隔2个取1个)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  0  1  2  3  4  5  6  7  8   9
   1     3     5     7      9

切片练习:

练习一:验证回文:上海自来水来自海上,南北通州通北南
s = input("s:")
if s == s[::-1]:
    print("是回文字符串")
else:
    print("不是")
练习二:验证回文字符串
输入:"A man, a plan, a canal: panama"
输出:true
输入:"race a car"
输出:false
思路:
1、回文,字符串反转之后与之前的字符串一模一样
2、循环字符串,挨个判断字符串是否为字母/数字-isalnum
3、如果是字母/数字,保存到一个list里面
4、把list转成一个字符串,然后都变成小写-join
5、判断这个字符串和她反转后是否一致
s = input("s:").strip()
s_list = []
for i in s:
    if i.isalnum():
       s_list.append(i)
new_s = ''.join(s_list).lower()
if new_s == new_s[::-1]:
    print('是回文')
else:
    print('不是回文')

集合:

set 集合天生就可以去重,集合是无序,去重就想到集合,可循环
无序,不能通过下标取值

l = [1,2,2,3,3,4,4,4,5,5,5]
for i in set(l):#先集合去重再遍历,减少循环次数
print(set(s))
print(list(set(s)))  # 转换成list
l1 = set()#定义空集合
l2 = {}#空字典

s = {1,2,3,4,4}
s1 = {1,2,3,5}
s2 = {8,9,10}
s.add(5)#添加元素
s.update({7,8,9}) #把另外一个集合加入进去
s.pop() #删除一个元素,不能传值

交集、并集、差集、对称差集
print(s.intersection(s1)) #交集,应用找共同,转成集合取交集
print(s & s1)
print(s.union(s1).union(s2)) #并集,并多个集合
print(s | s1 | s2)
print(s.difference(s2))#差集,在前面这个集合里面有,但是在后面这个集合里面没有的,s有s2没有
print(s - s2)
print(s.symmetric_difference(s1)) #对称差集,交集之外的
print(s ^ s1)

三元表达式:

age = 17
age2 = ''
if age>=18:
    age2="成年"
else:
    age2 = "未成年"

age3 = "成年" if age>=18 else "未成年"
如果if条件成立取前面,否则取后面,elif不能写进三元表达式

列表生成式:

l = list(range(1,11))
l2 = []
for i in l:
    if i % 2 == 0:
        l2.append(i)
l1 = [ str(i) for i in l ]

l3 = [ i for i in l if i%2==0 ]
如果i满足if条件,就用最前面的i保存起来,列表生成式只能加一个判断

变量交换:

a = 1
b = 2
a = a + b  # 3
b = a - b # 1
a = a - b
print(a,b)#a,b是int类型

temp = None#正常写法,引入第三方变量temp
temp = b
b = a
a = temp
print(a,b)
a,b = b,a
print(a,b)

浅拷贝和深拷贝:

l = [1,1,2,3,4,5,6,7,8]
   # 0 1 2 3 4 5 6 7 8
l2 = [1,1,2,3,4,5,6,7,8]

for i in l2:
    if i %2 !=0:
        l.remove(i)
print(l)
结果为[1, 2, 4, 6, 8]正在循环的list,删元素会导致下标错乱,取值有误
解决定义两个一模一样的list,l2,for i in l2
l3这种写法不可以,l3和l内存地址相同,l下标改变,l3也改变

l = [1,1,2,3,4,5,6,7,8]#内存地址34103816
l2 = [1,1,2,3,4,5,6,7,8]#内存地址34103880
l3 = l#内存地址34103816,浅拷贝,内存地址不变
l4 = l.copy()#内存地址4451336,也是浅拷贝,内存地址变了也不一定就是深拷贝
print(id(l))
print(id(l2))
print(id(l3))
print(id(l4))

s = [1,1,2,3,4,5,6,7,8,[1,2,3]]
s1 = s.copy()#浅拷贝,只能拷贝外面一层
s2 = s.copy().copy(s)#浅拷贝
s2 = s[:]#浅拷贝
s1[-1][1] = "hello"
print(s)#[1, 1, 2, 3, 4, 5, 6, 7, 8, [1, 'hello', 3]]
print(s1)#[1, 1, 2, 3, 4, 5, 6, 7, 8, [1, 'hello', 3]]

import copy#放在s上面
s1 = copy.deepcopy(s)#只有这种是深拷贝,修改s1,其他不影响