字符串
昨日回顾
1. 循环 while 条件: 循环体(break, continue) 循环的执行过程: 执行到while的时候. 首先判断条件是否成立.如果成立. 执行循环体. 再一次判断条件.... 如果不成立. 直接跳出循环 break 跳出当前本层循环 continue 结束本次循环. 继续执行下一次循环 2. 格式化输出 %s 占位字符串(常用) %d 占位数字 %f 占位浮点数 f"{变量}" 3. 运算符 != += 累加 a += b a = a + b and 并且, 左右两端同时为真. 结果才能是真 or 或者, 左右两端有一个是真. 结果就是真 not 非. 非真既假, 非假既真 顺序: () => not => and => or x or y => if x == 0 then y else x and和or相反 4. 编码 1. ascii 8bit 1byte 包含了 英文, 数字, 特殊字符, 特殊操作符 2. gbk 16bit 2byte 主要包含的: 中文, 日文, 韩文, 繁体中文 3. unicode 32bit 4byte 万国码 4. utf-8 可变长度的 英文: 8bit 1byte 欧洲: 16bit 2byte 中文: 24bit 3byte
今日内容
三. 今日主要内容 1. 基本数据类型概况 1, int 整数 2. str 字符串 3. bool 布尔值 4. list 列表. 一般存放大量的数据 ["门神xxxx", "风扇哥xxxx", 元素] 5. tuple 元组. 只读列表, 只能看啥也不能干. (元素, 元素) 6. dict 字典. {"风扇哥":"王伟哲", "wlh": "王力宏"} 7. set 集合 {"风扇哥", "wlh"}. 不重复 8. bytes 一堆字节. 最小数据单元 2. int类型的相关操作. 数字没办法执行其他操作. 操作只有+-*/, //, %, ** 8bit => 1byte bit_length() 二进制长度 3. bool类型的操作. 基本类型转换的问题 bool类型没有操作. 类型转换 结论一: 想把xxx转化成yy类型. yy(xxx) 结论二: 能够表示False的数据: 0, "", [], {}, set(), tuple(), None, False 4. str 认识字符串(重点, 多) 字符: 单一的文字符号 字符按照固定的顺序连成串 被' 或者" 或者''' 或者"""括起来的内容 索引 就是编号, 顺序 从0开始 切片 s[start:end:step] start:开始 end: 结束 取不到 step: 步长, 控制方向(决定了 end 往哪个方向去取值). 每xx个取一个 一大波操作.(△下面8个标注是重点,需要记忆的) 字符串是不可变的数据类型. 不论如何操作.对原来的字符串是不会有影响的 1, upper() 转换成大写. 忽略大小写 2, strip() 去掉左右两端的空白(包括空格, \t 以及\n). 所有用户输入的内容都要去空白 s.strip()去除两端的空格 s.strip('a')去除两端的a 3, replace(old, new) 把old替换成new(所有的都替换) replace(old, new,2)只替换2个 4, split() 字符串切割,默认以空格 ##切出来的结果会放在列表中 s.split("哈") 根据所有的'哈'进行切割 s.split("哈",2) 根据前2个'哈'进行切割 5, startswith() 判断是否以xxx开头 6, find() 查找, 找不到返回-1 7, isdigit() 判断是否是数字组成 8, len() 求长度 for循环遍历字符串 for 变量 in 可迭代对象: 循环体 for c in s: # c: charactor(字符) s: string print(c) 预习: 列表(认识, 增删改查) 元组 思考: 质数, n位数
一.Python基本数据类型
int ==> 整数. 主要用来进行数学运算 str ==> 字符串, 可以保存少量数据并进行相应的操作 bool==>判断真假, True, False list==> 存储⼤量数据.用[ ]表⽰ tuple=> 元组, 不可以发⽣改变 用( )表⽰ dict==>字典,保存键值对,一样可以保存⼤量数据 set==> 集合, 保存⼤量数据. 不可以重复. 其实就是不保存value的dict
二.整数(int)
在python3中所有的整数都是int类型. 但在python2中如果数据量比较大. 会使用long类型.
在python3中不存在long类型
整数可以进行的操作:
bit_length(). 计算整数在内存中占用的⼆进制码的长度
十进制 | 二进制 |
⻓长度bit_length() |
1 | 1 | 1 |
2 | 10 | 2 |
3 | 11 | 2 |
4 | 100 | 3 |
5 | 101 | 3 |
6 | 110 | 3 |
7 | 111 | 3 |
8 | 1000 | 4 |
三.布尔值(bool)
取值只有True, False. bool值没有操作.
转换问题:
str => int int(str)
int => str str(int)
int => bool bool(int). 0是False 非0是True
bool=>int int(bool) True是1, False是0
str => bool bool(str) 空字符串是False, 不空是True
bool => str str(bool) 把bool值转换成相应的"值"
a = 10 print(type(a)) # <class 'int'> d = str(a) # 把数字转换成str print(type(d)) # <class 'str'> b = "10" print(type(b)) # <class 'str'> c = int(b) # b扔到int() 得到的结果就是一个int print(type(c)) # <class 'int'> # 字符串 => 数字 int() # 数字 = > 字符串 str() # x => y类型 y(x) # 结论一: 想把xxx数据转化成yy类型的数据. yy(xxx) # 把数字转化成bool # 0是False, 非零是True a = 10 print(bool(a)) # True print(bool(1)) # True print(bool(0)) # False print(bool(-1)) # True # 空字符串 表示False print(bool("哈哈")) # True print(bool(" ")) # 空格是True print(bool("")) # 空字符串是false # 结论二: 所有的空都可以表示False print(bool([])) # False 空列表 print(bool({})) # False 空字典 print(bool(set())) # False 空集合 # None 空, 真空. print(bool(None)) while 1: # while True: # 底层一定会有 True => 1的过程,所以使用1要优于True print("还我钱")
四.字符串(str)
把字符连成串. 在python中用', ", ''', """引起来的内容被称为字符串.
4.1 切片和索引
1. 索引.索引就是下标.切记,下标从0开始
# 0123456 7 8 s1 = "python最牛B" print(s1[0]) # 获取第0个 print(s1[1]) print(s1[2]) print(s1[3]) print(s1[4]) print(s1[5]) print(s1[6]) print(s1[7]) print(s1[8]) # print(s1[9]) # 没有9, 越界了了. 会报错 print(s1[-1]) # -1 表示倒数. print(s1[-2]) # 倒数第二个
2. 切片,我们可以使用下标来截取部分字符串的内容
语法: str[start: end]
规则: 顾头不顾腚, 从start开始截取. 截取到end位置. 但不包括end
s2 = "python最⽜牛B" print(s2[0:3]) # 从0获取到3. 不包含3. 结果: pyt print(s2[6:8]) # 结果 最⽜ print(s2[6:9]) # 最大是8. 但根据顾头不顾腚, 想要取到8必须给9 print(s2[6:10]) # 如果右边已经过了最大值. 相当于获取到最后 print(s2[4:]) # 如果想获取到最后. 那么最后一个值可以不给. print(s2[-1:-5]) # 从-1 获取到 -5 这样是获取不到任何结果的. 从-1向右数. 你怎么数也数不不到-5 print(s2[-5:-1]) # ⽜b, 取到数据了. 但是. 顾头不顾腚. 怎么取最后一个呢? print(s2[-5:]) # 什么都不写就是最后了 print(s2[:-1]) # 这个是取到倒数第一个 print(s2[:]) # 原样输出
跳着截取
# 跳着取, 步⻓ print(s2[1:5:2]) # 从第一个开始取, 取到第5个,每2个取1个, 结果: yh, 分析: 1:5=>ytho => yh print(s2[:5:2]) # 从头开始到第五个,每两个取一个 print(s2[4::2]) # 从4开始取到最后,每两个取一个 print(s2[-5::2]) # 从-5取到最后,每两个取一个 print(s2[-1:-5]) # 什么都没有,因为是从左往右取的 print(s2[-1:-5:-1]) # 步⻓是-1. 这时就从右往左取值了 print(s2[-5::-3]) # 从倒数第5个开始,到最开始,每3个取一个,结果是oy
切片语法:
#切片语法: str[start:end:step] start: 起始位置 end: 结束位置 step:步⻓ 步长: 如果是整数, 则从左往右取. 如果是负数,则从右往左取. 默认是1
# - 倒数 # -8-7-6-5-4-3-2-1 索引还可以倒着数 . 起始位置 -1 # 0 1 2 3 4 5 6 7 索引 s = "今天中午吃胡辣汤" # 索引使用[下标]获取数据,从0开始 print(s[3]) print(s[2]) print(s[-3]) print(s[-6]) # 切片, 从一个字符串中截取出一部分字符串 # [start: end] 顾头不顾尾 end取不到 s = "中间的,你们为什么不说话.难受" print(s[3:7]) # ,你们为 print(s[5:9]) # 们为什么 print(s[-3: -7]) # 切不到东西, 默认是从左往右切 ##所以如果想要取到值应该满足下面的条件(总是从小的往大的去取值) # 步长是正数,左小右大,从左边往右去取值 # 步长是负数,左大右小,从右边往左去取值 print(s[-7: -3]) # 么不说话 print(s[:6]) # 从头开始切 print(s[6:]) # 切到末尾 print(s[:]) # 从开始到结束 # 步长step, 默认是1 每xxx个取一个 # [start: end: step] s = "abcdefghijklmn" print(s[::2])#acegikm print(s[1:5:3])#be print(s[7:3]) # 取不到值. 默认步长1 从左往右切 print(s[7:3:-1]) # hgfe step是负数,从右往左切,结果也是从右往左的 # step可以控制方向. 如果step是正数. 从左往右切. 如果是负数 . 从右往左切.结果也与 step 的方向是一致的 print(s[-1:-8: -2]) # nljh s = "默念哥没吃饭哥不说话" print(s[3::-3]) # 这里的[3:]由于step是负值,所以是往左边的方向取到头的,结果是默念哥没 最终s[3::-3]的结果是没默 print(s[::-1])#话说不哥饭吃没哥念默 这里就是由于 step 是-1,所以全部的字符倒着取.可以用来判断一个字符串是否是回文 # 判断一句话是否是回文 s = "黄山落叶松叶落山黄" s2 = s[::-1] # 翻过来 if s == s2: print("是回文") else: print("不是回文")
4.2 字符串的相关操作方法
1. ⼤小写转来转去
s1.capitalize() print(s1) # 输出发现并没有任何的变化. 因为这里的字符串本身是不会发生改变的. 需要我们重新获取 ret1 = s1.capitalize() print(ret1) # ⼤小写的转换 ret = s1.lower() # 全部转换成小写 print(ret) ret = s1.upper() # 全部转换成大写 print(ret) # 应用, 校验用户输入的验证码是否合法 verify_code = "abDe" user_verify_code = input("请输入验证码:") if verify_code.upper() == user_verify_code.upper(): print("验证成功") else: print("验证失败") ret = s1.swapcase() # ⼤小写互相转换 print(ret) # 不常⽤ ret = s1.casefold() # 转换成小写, 和lower的区别: lower()对某些字符支持不够好.casefold()对所有字母都有效. 比如东欧的一些字母 print(ret) s2 = "БBß" # 俄美德 print(s2) print(s2.lower()) print(s2.casefold()) # 每个被特殊字符隔开的字母首字母大写 s3 = "alex eggon,taibai*yinwang_麻花藤" ret = s3.title() # Alex Eggon,Taibai*Yinwang_麻花藤 print(ret) # 中文也算是特殊字符 s4 = "alex老男孩wusir" # Alex⽼老老男孩Wusir print(s4.title())
2. 切来切去
# 居中 s5 = "周杰伦" ret = s5.center(10, "*") # 拉长成10, 把原字符串放中间.其余位置补* print(ret) # 更改tab的长度 s6 = "alex wusir\teggon" print(s6) print(s6.expandtabs()) # 可以改变\t的长度, 默认长度更改为8 # 去空格 s7 = " alex wusir haha " ret = s7.strip() # 去掉左右两端的空格 print(ret) ret = s7.lstrip() # 去掉左边空格 print(ret) ret = s7.rstrip() # 去掉右边空格 print(ret) # 应⽤, 模拟用户登录. 忽略⽤户输入的空格 username = input("请输入用户名:").strip() password = input("请输入密码: ").strip() if username == 'alex' and password == '123': print("登录成功") else: print("登录失败") s7 = "abcdefgabc" print(s7.strip("abc")) # defg 也可以指定去掉的元素, # 字符串替换 s8 = "sylar_alex_taibai_wusir_eggon" ret = s8.replace('alex', '⾦角大王') # 把alex替换成金⻆大王 print(s8) # sylar_alex_taibai_wusir_eggon 切记, 字符串是不可变对象. 所有操作都是产生新字符串返回 print(ret) # sylar_⾦角大王_taibai_wusir_eggon ret = s8.replace('i', 'SB', 2) # 把i替换成SB, 替换2个
print(ret) # sylar_alex_taSBbaSB_wusir_eggon # 字符串切割 s9 = "alex,wusir,sylar,taibai,eggon" lst = s9.split(",") # 字符串切割, 根据,进行切割 print(lst) s10 = """诗⼈ 学者 感叹号 渣渣""" print(s10.split("\n")) # 用\n切割 #坑 s11 = "银王哈哈银王呵呵银王吼吼银王" lst = s11.split("银王") # ['', '哈哈', '呵呵', '吼吼', ''] 如果切割符在左右两端. 那么一 定会出现空字符串.深坑请留意 print(lst)
3. 格式化输出
# 格式化输出 s12 = "我叫%s, 今年%d岁了, 我喜欢%s" % ('sylar', 18, '周杰伦') # 之前的写法 print(s12) s12 = "我叫{}, 今年{}岁了, 我喜欢{}".format("周杰伦", 28, "周润发") # 按位置格式化 print(s12) s12 = "我叫{0}, 今年{2}岁了, 我喜欢{1}".format("周杰伦", "周润发", 28) # 指定位置 print(s12) s12 = "我叫{name}, 今年{age}岁了, 我喜欢{singer}".format(name="周杰伦", singer="周润发", age=28) # 指定关键字 print(s12)
4. 查找
s13 = "我叫sylar, 我喜欢python, java, c等编程语言." ret1 = s13.startswith("sylar") # 判断是否以sylar开头 print(ret1) ret2 = s13.startswith("我叫sylar") # 判断是否以我叫sylar开头 print(ret2) ret3 = s13.endswith("语言") # 是否以'语言'结尾 print(ret3) ret4 = s13.endswith("语言.") # 是否以'语言.'结尾 print(ret4) ret7 = s13.count("a") # 查找"a"出现的次数 print(ret7) ret5 = s13.find("sylar") # 查找'sylar'出现的位置 print(ret5) ret6 = s13.find("tory") # 查找'tory'的位置, 如果没有返回-1 print(ret6) ret7 = s13.find("a", 8, 22) # 切⽚找 作为切片[8,22]来看 print(ret7) ret8 = s13.index("sylar") # 求索引位置. 注意. 如果找不到索引. 程序会报错 print(ret8)
5. 条件判断
# 条件判断 s14 = "123.16" s15 = "abc" s16 = "_abc!@" # 是否由字母和数字组成 是否是由基本的文字组成,包括字母和中文,不包括数字和空格标点等 print(s14.isalnum()) print(s15.isalnum()) print(s16.isalnum()) # 是否由字母组成 print(s14.isalpha()) print(s15.isalpha()) print(s16.isalpha()) # 是否由数字组成, 不包括小数点 print(s14.isdigit()) # 数字 print(s14.isdecimal()) # 小数 print(s14.isnumeric()) # 这个比较牛B. 中文都识别.比如一二三.也是判断数字,但是能识别用汉字表示的数字,比如壹等 print(s15.isdigit()) print(s16.isdigit()) # 练习. ⽤算法判断某一个字符串是否是小数 s17 = "-123.12" s17 = s17.replace("-", "") # 替换掉负号 if s17.isdigit(): print("是整数") else: if s17.count(".") == 1 and not s17.startswith(".") and not s17.endswith("."): print("是小数") else: print("不是小数")
6. 计算字符串的长度
s18 = "我是你的眼, 我也是a" ret = len(s18) # 计算字符串的长度
print(ret)
注意: len()是python的内置函数. 所以访问方式也不一样. 你就记着len()和print()一样就⾏了
7. 迭代
我们可以使⽤for循环来遍历(获取)字符串中的每一个字符
""" 语法: for 变量 in 可迭代对象: pass 可迭代对象: 可以一个一个往外取值的对象 """
栗子:
s19 = "大家好, 我是VUE, 前端的小朋友们. 你们好么?" # 用while循环 index = 0 while index < len(s19): print(s19[index]) # 利用索引切片来完成字符的查找 index = index + 1 # for循环, 把s19中的每一个字符拿出来赋值给前面的c for c in s19: print(c) ''' in有两种用法: 1. 在for中. 是把每一个元素获取到赋值给前面的变量. 2. 不在for中. 判断xxx是否出现在str中. ''' print('VUE' in s19) # 练习, 计算在字符串"I am sylar, I'm 14 years old, I have 2 dogs!" 中的数字个数 s20 = "I am sylar, I'm 14 years old, I have 2 dogs!" count = 0 for c in s20: if c.isdigit(): count = count + 1 print(count)
s = "abcdefg" s1 = s.capitalize() # 把首字母变成大写, 返回给你一个新的字符串 print(s) # 字符串不可变. 原字符串是不会发生改变的 print(s1) s = "alex sb dsb wusir bi1gsb" s2 = s.title() # 标题. 把字符串中每个单词(单词:每个被特殊字符(特殊字符:所有的非字母就是特殊字符,包括数字和中文)隔开的字⺟就是单词)的首字母大写 print(s2) #大写 s = "alex sb dsb bigsb" s3 = s.upper() # 所有的字母变成大写字母(重点) #这个方法对所有的字母(比如欧文)都完全没问题 print(s3) while True: content = input("请输入你要说的话 输入Q退出:") if content.upper() == "Q": # 当需要忽略大小写的时候 break print("你想对打野说", content) # 验证码 verifyCode = "aEmn" veri = input("请输入你的验证码(%s)" % verifyCode) if veri.upper() == verifyCode.upper(): # 忽略掉用户输入的大小写 print("验证码是正确的") else: print("验证码错误") # 小写 s = "Alex Is Not A GooD mAN" s4 = s.lower() # 所有的字母变成小写字母 有问题的. 对欧洲特殊文字是不识别的 print(s4) #小写 s = "Alex Is Not A GooD mAN" s5 = s.casefold() # 所有的字母变成小写字母,用法与lower()相同 支持特殊文字 print(s5) s2 = "БBß" # 俄美德 print(s2) print(s2.lower()) print(s2.casefold()) #大写字母变成小写字母,小写变大写 s = "wusir 昨天 Love 了 女神. guo fen 了" print(s.swapcase()) # 大变小, 小变大 # center() 中间. 居中 s = "alex" s6 = s.center(10, "*") # 长度, 用_填充##把长度空间拉长成10,把原来的字符串放在中间,其余位置补* print(s6) s = "\n\nalex is sb " print(s) s7 = s.strip() # 去掉左右两端的空白(空格, \t, \n), 中间的内容不会动 print(s7) # 应用##所有的用户输入都应该去空(左右两端的空白) uname = input("请输入你用户名:").strip() # 干掉用户的空格 upws = input("请输入你的密码:").strip() # 干掉用户的空格 if uname =="alex" and upws == "123": print("登录成功") else: print("登录失败") s = "sbalexsbwusirsb" print(s.strip("sb")) # 去掉左右两端的sb # 字符串替换 s = " good alex good wusir good 大虾 good 胡辣汤 " s8 = s.replace("good", "sb") # 把s中的good替换成sb print(s8) s9 = s.replace(" ", "") print(s9) s10 = s.replace("good", "sb", 2) # 字符串替换2次 print(s10) # 字符串切割 s = "alex 哈昨天哈给我们涨工资了?哈 不可能" lst = s.split("alex") # 切出来的结果会放在列表中, 刀的位置会损失掉(根据谁进行切割,哪里就是刀的位置,)刀如果把头了. 一定会产生空字符串(即:如果切割符在左右两端. 那么一 定会出现空字符串.深坑请留留意) lst1 = s.split("爱") #根据'爱'去切割,原字符串中不存在'爱',也不会报错 lst2 = s.split("哈",2)#根据'哈'切割,但是只切割2次(即只根据前面两个'哈'去切割) print(lst) # 格式化输出 name = "alex" age = 18 hobby = "wusir" print("领导叫%s, 今年%d, 喜欢%s" % (name, age, hobby)) print("领导叫{}, 今年{}, 喜欢{}".format(name, age, hobby)) print("领导叫{1}, 今年{0}, 喜欢{2}".format(name, age, hobby)) # 程序员数数从0开始 print("领导叫{na}, 今年{age}, 喜欢{hobby}".format(na = name, age = age, hobby = hobby)) print(f"领导叫{name}, 今年{age}, 喜欢{hobby}")##老师推荐这种格式化方法 # 判断字符串是否以xxx开头 s = "java_python_区块链_大数据" print(s.startswith("python")) # 判断xxx是否以xxx开头. name = input("请输入你的名字:") # 张开 致青春 if name.startswith("张"): print("领钱") else: print("不领钱") # 以xxx结尾 endwith() ''.isdigit() # 数数 s = "lexa is big sb" print(s.count("i")) # 计数 #find()和 index()的用法是一样的,都是返回索引的位置,只不过当要查找的内容不存在的话,使用find不会报错,而inde 是会报错的 # find() 查找, 如果存在. 返回索引. 如果不存在返回-1 s = "滋滋冒油的猪蹄子" print(s.find("牛")) # 用这个##这里是与 index 相比较而言的,因为不会报错 #ret7 = s.find("a", 0, 3) # 切⽚片找 [0,3] #print(ret7) # index() 如果找到了返回索引. 找不到. 报错 print(s.index("牛")) s = "alexwusir" print(s.isalpha()) # 是否是由基本的文字组成. 是否是由字母组成(包括中文) # 判断是否是数字组成 s = "123456798一" # digit 数字 %d print(s.isdigit()) # 阿拉伯数字 s = "123456789一二三壹仟贰佰壹拾伍叁" print(s.isnumeric()) # number s = "我叫周润发,我喜欢DNF" print(len(s)) # 字符串长度, 内置函数 ##老师说内置函数都不用像上面那样(例如 s.trip())前面需要加个点,那前面加个点调用的是什么?不懂 # 把一句话中的每一个字符拿到 s = "风扇哥门神灯神哈哈我的天哪" # len(s) # 用while循环. 获取到每一个字符 i = 0 # 索引 while i < len(s): print(s[i]) i += 1 # for循环来遍历字符串 # for: 循环 # c: 变量 # in : 固定的 # s: 你要遍历的内容 for c in s: # 把字符串s中的每一个元素拿到赋值给前面的c print(c) # for循环有一个先决条件. 必须是可迭代对象. # 遍历钱包 # 缺点: 无法看到字符的索引. ''' for 变量 in 可迭代对象: 循环体(break, continue) '''