python字符串|列表|元组拾遗
程序员文章站
2022-05-28 22:17:06
1. 进制之间的转换 bin/hex/oct/int2. unicode二进制和字符对应关系: chr / ord3. 随机验证码4. 字符串 - 公共 - 专有(生成新的值,老值不变)5. 列表 - 公共 - 专有(修改原值) - 嵌套6. 元组...
字符串
用于表示文本等一些信息
1.1 公共功能(6个)
1. 长度
name = "小空空"
v1 = len(name)
print(v)
2.索引【读】
name = "小空空"
name[0]
name[1]
name[2]
疑问:是否可以通过索引去修改字符串中的某个字符?不可以。
字符串底层存储时,是一个整体不允许被修改(原子)。
“小空空”去存储时会是一个了连续的地址空间:01001001001010 0100010010101010 1001001111100101,如果修改“小唔唔空”
3. 切片【读】
name = "沈清欢"
v1 = name[0:2] # 沈清
注意:在索引和切片时,会存在负值和空的情况。
4. 步长
msg = "北京昌平沙河"
msg[0:6:1] # "北京昌平沙河"
msg[0:6:2] # "北昌沙"
msg[0:6:3] # "北平"
msg[::-1] # 河沙平昌京北
msg[-1::-1] # 河沙平昌京北
msg[-2::-1] # 沙平昌京北
msg[-2:0:-1] # 沙平昌京
msg[-2:1:-1] # 沙平昌
msg[5:0:-1] # '河沙平昌京'
msg[0:6:-1] # 空
msg[5:-1:-1] # 空
面试题:请将一个字符串进行反转。
name = "*"
方式一:name[::-1]
方式二:循环倒序展示
index = len(name)-1 # 注意 索引起点为 0 ,而len 长度计数 1 开始
while index >= 0:
name[index]
index -= 1
# IndexError: string index out of range
5. for循环
自动帮我们获取一个值内部的所有的数据(内部是基于索引完成)
name = "*"
# 方式一
index = 0
while index < len(name):
print(name[index])
index += 1
# 方式二
for item in name:
print(item)
注意: 在for循环中支持 break 和 continue
6. range 和 for + range
range,是Python中内部帮我们提供的一个函数,他可以帮我们生成整型的数据。
- range(8) # 0 1 2 3 4 5 6 7
- range(99) # 0 1 2 ... 98
- range(1,5) # 1 2 3 4
- range(1,5,2) # 1 3
- range(5,1,-1) # 5 4 3 2
- range(5,0,-1) # 5 4 3 2 1
在Python2中:
- range(1000000000000),在内存中帮我们立即创建1000000000000个整数。
- xrange(1000000000000),不会再内存中立即创建,而是在我们对xrange生成的结果进行for循环获取时,才会获取一个生成一起。
在python3中:
- range(1000000000000),不会再内存中立即创建,而是在我们对range生成的结果进行for循环获取时,才会获取一个生成一起。
# 示例代码
data = range(10)
print(data) # 此时没有生成 0 1 2 3 4 。。。
for item in data:
print(item)
# 1. 输出 1 ~ 100 内所有的整数。
v1 = range(1,101)
for i in v1:
print(i)
简写
for i in range(1,101):
print(i)
# 2. 输出一个字符串中的每个字符
name = "*"
for char in name:
print(char)
# 2. 输出一个字符串中的每个字符以及字符所在的索引位置。
name = "*"
for index in range(0,len(name)):
print(index,name[index]) # 0 1 2 3 4 5 6
练习题
请帮我生成一个随机验证码,随机验证码共6位且只包含字母(含大小写)。
- 循环6次
for index in range(6):
pass
- 每次生成1个字符,字符拼接起来。
code = ""
for index in range(6):
code = code + 随机字符 // code += 随机字符串
- 生成随机整数
import random
result = random.randint(0,3) # 0 ~ 3
print(result)
- 生成随机字符
import random
num = random.randint(65,90)
char = chr(num)
# 只有大写
import random
code = ""
for i in range(6):
num = random.randint(65,90)
char = chr(num)
code = code + char
print(code)
# 含大小写
import random
code = ""
for i in range(6):
temp = random.randint(0, 1)
if temp == 0:
num = random.randint(65, 90) # 随机 97 - 122
else:
num = random.randint(97, 122)
char = chr(num)
code = code + char
print(code)
# 扩展:项目中真用到了生成验证码的功能。
import random
import string
code = ""
all_letters = string.ascii_letters + string.digits
for i in range(6):
char = random.choice(all_letters)
code += char
print(code)
需求:有以下四个变量,分别是IP的四部分 "255.127.235.99",请将如下四个变量转换成为二进制并拼接起来,最后将拼接起来的二进制转换为十进制整数。
v1 = 18
v2 = 127
v3 = 235
v4 = 99
data = bin(v1) + bin(v2) + bin(v3) + bin(v4)
"0b10010" + 0b10010 + 0b10010 + 0b10010 => 第一步:将b去掉
"00010010" + 。。。 => 第二步:统一用8位二进制表示。
print(data) # 32位的一个二进制 "000100100001001000010010000100100001001000010010" => 十进制
result = ""
ip_list = [18,127,235,99]
for v in ip_list:
# print(v) # 18 127 235 99 # 转换二进制 -> 去掉b -> 凑够8位 ==》 字符串
part = bin(v)[2:]
if len(part) < 8:
part = ( 8 - len(part) ) * "0" + part
# print(part,len(part))
result = result + part
value = int(result,base=2)
print(value)
1.2 专有功能(11)
1. startswith,布尔类型
name = "alex"
data = name.startswith("al")
2. endswith,布尔类型
name = "alex"
data = name.endswith("ex")
4. upper,新字符串
name = "alex"
data = name.upper() # ALEX
5. isdecimal,布尔类型
age = "18"
data = age.isdecimal() # True
6. replace,新的字符串
name = "alex"
data = name.replace('l','A')
7. strip,在字符串前后去除指定"字符串"(默认空格、换行、制表符)
name = " alex\t"
print(name,len(name))
# 默认去除前后的 空格、换行、制表符,得到一个新的字符串。
data = name.strip()
print(data,len(data))
name = "alex"
print(name,len(name))
# 去除前后的 x,得到一个新的字符串。
data = name.strip("x")
print(data,len(data))
lstrip,只去除左边
rstrip,只去除右边
8. format,字符串格式化
v1 = "我叫{0},我今年{1}岁, 我的名字叫{0}".format("alex",73)
print(v1)
v2 = "我叫{name},我今年{age}岁, 我的名字叫{name}".format(name="alex",age=73)
print(v2)
9. ljust/rjust,获取字符串(按需补满字符串长度)
name = "alex"
v1 = name.ljust(8,"*")
print(v1) # alex**** 字符串8位长度,不够的字符在左,右边补齐
v2 = name.rjust(8,"*")
print(v2) # ****
part = "10010"
part = part.rjust(8,"0")
print(part) # 00010010
10. split,根据指定字符进行分隔并获取一个列表类型
ip = "192.168.1.1"
data = ip.split(".")
print(data) # ['192', '168', '1', '1'] => 列表
ip = "192.168.1.1"
v1 = ip.split(".") # ['192', '168', '1', '1']
v2 = ip.split(".",1) # ['192', '168.1.1']
path = "/Users/wupeiqi/project/s29day03/1.字符串反转.py"
v3 = path.rsplit(".") # ['/Users/wupeiqi/project/s29day03/1', '字符串反转', 'py']
v4 = path.rsplit(".",1) # ['/Users/wupeiqi/project/s29day03/1.字符串反转', 'py']
注意:split返回的是一个列表类型(内部元素都是字符串类型),列表可以被for循环。
11. join,拼接连接
data = "*".join(["alex","eric","tony"]) # "alex*eric*tony"
hobby = ["篮球","足球","乒乓球"]
data = ",".join(hobby) # "篮球,足球,乒乓球"
summary = "我叫alex,我的爱好有{0}。".formt(data)
print(summary) # 我叫alex,我的爱好有篮球,足球,乒乓球。
# summary = "我叫alex,我的爱好有{0}。".formt("足球") # 我叫alex,我的爱好有足球。
# summary = "我叫alex,我的爱好有{0}。".formt("篮球,足球,乒乓球") # 我叫alex,我的爱好有篮球,足球,乒乓球。
# 在之前,验证码和IP地址转换时都有字符串相加的操作(基于+),反复的这种相加效率非常差。
# 在之后,基于join和列表完成字符串的拼接。
# 例1:
result = [] # ["10001011","10000000","1111110","11001101"]
ip = "10.3.9.12"
data_list = ip.split(".") # ["10","3","9","12"]
for item in data_list:
# "10","3","9","12"
num = int(item)
temp = bin(num)[2:]
char = temp.rjust(8,"0")
result.append(char) # ["10001011","10000000","1111110","11001101"]
value = "".join(result)
print( int(value,base=2) )
# 例2:
import random
import string
data_list = [] # ["A","1","F","a","b","u"]
all_letters = string.ascii_letters + string.digits
for i in range(6):
char = random.choice(all_letters)
data_list.append(char)
code = "".join(data_list)
print(code) # A1Fabu
练习题
- 写代码实现一个整数加法计算器(两个数相加)
例如:用户输入 5+99
data = input("请输入数据:")
result = data.split("+") # ["5","99"]
# result[0] # 5
# result[1] # 99
value = int(result[0]) + int(result[1])
print(value)
- 写代码实现一个整数加法计算器(两个数相加)
例如:用户输入 5+99,5+alex
data = input("请输入数据:")
result = data.split("+") # ["5","alex"]
if result[0].isdecimal() and result[1].isdecimal():
value = int(result[0]) + int(result[1])
print(value)
else:
print("输入有错误")
- 写代码实现一个整数加法计算器(两个数相加)
例如:用户输入 5+99、5 +99、 5+ 99
data = input("请输入数据:") # 5+99 、5 + 99 、 5+ 99
result = data.split("+") # ["5"," 99 "]
v1 = result[0].strip()
v2 = result[1].strip()
value = int(result[0]) + int(result[1])
- IP地址转换面试题
如 "10.3.9.12" 转换规则为:
10 00001010
3 00000011
9 00001001
12 00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
result = ""
ip = "10.3.9.12"
data_list = ip.split(".") # ["10","3","9","12"]
for item in data_list:
# "10","3","9","12"
num = int(item)
temp = bin(num)[2:]
char = temp.rjust(8,"0")
result += char
print(result)
print( int(result,base=2) )
2. 列表 list
列表是一个 有序 的容器,当我们在程序中想要表示多个数据时,都可以使用列表
v1 = [ 1, "alex", 2, True, 3.14 ]
例如:
users = ["alex","李杰","老男孩"]
email_list = ["wupeiqi@live.com","xxx@qq.com"]
2.1 公共功能(6)
1. 长度
users = [ "alex", "李杰", "老男孩"]
data = len(users)
2. 索引【读+改+删】
users = [ "alex", "李杰", "老男孩"]
users[0] # "alex"
users[1] # "李杰"
uesrs[2] # "老男孩"
users[1] = "武沛齐"
print(users) # [ "alex", "武沛齐", "老男孩"]
users = [ "alex", "李杰", "老男孩"]
print(users) # ['alex', '李杰', '老男孩']
del users[1]
print(users) # ['alex', '老男孩']
# 基于while循环输入列表中的每个元素
users = [ "alex", "李杰", "老男孩"]
index = 0
while index < len(users):
print( users[index] )
index += 1
3. 切片【读+改+删】
users = [ "alex", "李杰", "老男孩"]
users[0:2] # ["alex", "李杰"]
users[1:] # ["李杰","老男孩"]
users = [ "alex", "李杰", "老男孩"]
print(users) # ['alex', '李杰', '老男孩']
users[0:2] = ["wupeiqi","武沛齐","张扬","老妖"]
print(users) # ['wupeiqi', '武沛齐', '张扬', '老妖', '老男孩']
users = [ "alex", "李杰", "老男孩"]
print(users)
del users[0:2]
print(users)
4. 步长
users = [ "alex", "李杰", "老男孩"]
users[0:2:1]
users[0:2:2]
users[-1::-1]
5. for循环
users = [ "alex", "李杰", "老男孩"]
for item in users:
print(item)
6. for循环+range
users = [ "alex", "李杰", "老男孩"]
for i in range(len(users)):
# i=0,1,2
# users[i]
print(i, users[i] )
练习题
1、写代码,有如下列表,按照要求实现每一个功能
li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
- 计算列表的长度并输出
print( len(li) )
- 请通过步长获取索引为偶数的所有值,并打印出获取后的列表
li[::2]
- 请修改列表第2个位置的元素为"Kelly",并输出修改后的列表
li[1] = "kelly"
print(li)
- 请删除列表中的第2个元素,并输出删除元素后的列表
del li[1]
- 请删除列表中的第2至第4个元素,并输出删除元素后的列表
del li[1:4]
- 写代码,有如下列表,利用切片实现每一个功能 (切片,索引切,区间是左闭右开)
li = [1, 3, 2, "a", 4, "b", 5,"c"]
- 通过对li列表的切片形成新的列表 [1,3,2]
li[0:3]
- 通过对li列表的切片形成新的列表[‘a’,4,‘b’]
li[3:6]
- 通过对li列表的切片形成新的列表[1,2,4,5]
li[::2]
- 通过对li列表的切片形成新的列表 [3,”a”,”b”]
li[1:6:2]
- 通过对li列表的切片形成新的列表 [3,”a”,”b”,”c”]
li[1::2]
- 通过对li列表的切片形成新的列表 [“c”]
li[-1]
li[-1:]
-通过对li列表的切片形成新的列表 [“b”,”a”,3]
li[-3:0:-2]
3、购物车
goods = ["电脑", "鼠标", "键盘"]
for i in range(len(goods)):
print(i, goods[i])
num = input("请选择商品:")
if num.isdecimal():
num = int(num)
if num < len(goods) and num >= 0:
print(goods[num])
else:
print("范围选择有误")
else:
print("请输入整数")
2.2 专有功能(7)
1. append,在原列表中追加一个元素
data_list = []
data_list.append("alex")
print(data_list) # ["alex" ]
data_list.append("武沛齐")
print(data_list) # ["alex","武沛齐" ]
2. extand,在原列表中追加多个元素
goods = ["电脑", "鼠标", "键盘"]
print(goods)
goods.extend(["硬盘","读卡器","充电器"])
print(goods)
goods = ["电脑", "鼠标", "键盘"]
for item in ["硬盘","读卡器","充电器"]:
goods.append(item)
print(goods)
3. insert,在列表的某个位置插入一个元素
names = ["alex","日天","老男孩"]
names.insert(0,"苑昊") # 在第0个位置插入苑昊,结果:["苑昊","alex","日天","老男孩"]
print(names) # ["苑昊","alex","日天","老男孩"]
4. remove,删除
names = ["alex","日天","老男孩"]
# 根据索引删除
# del names[1]
# 根据索引删除并获取删除的那个值,如果pop() 则默认删除列表的最后一个值。
# data = names.pop(0)
# print(names,data)
# 根据值删除
# names.remove("日天")
# print(names)
5. pop,删除,并回显删除的值
# 根据索引删除并获取删除的那个值,如果pop() 则默认删除列表的最后一个值。
# data = names.pop(0)
# print(names,data)
6. clear,清空
names = ["alex","日天","老男孩"]
names.clear()
print(names) # []
7. reverse,翻转
names = ["alex","日天","老男孩"]
names.reverse()
print(names) # ['老男孩', '日天', 'alex']
2.3 转换
- 列表转其他
- int,不支持
- float,不支持
- bool
v1 = bool([11,22,33]) # True v2 = bool([]) # False
- str
v3 = str([11,22,33]) # "[11,22,33]"
- 其他转列表(可迭代-可被for循环)
- int,不支持
- float,不支持
- bool,不支持
- str
v4 = list("alex") # ['a', 'l', 'e', 'x']
划重点:空列表转换布尔值为False;其他类型转列表 list(其他数据),内部是循环数据并将数据的每个元素添加到列表中。
2.4 数据嵌套
v1 = [11,22,33]
# v1[1] = 88
v2 = ["alex",18,True]
v3 = ["alex",18,[11,22,33], True]
v4 = ["alex",18,[11,22,["alex","eric"]], True]
# 练习题
data = ["alex",18,[11,22,["tony","eric"]], True]
# 1. 获取18
data[1]
# 2. 找到alex中的x
data[0][-1]
# 3. 将22修改成88
data[2][1] = 88
print(data)
# 4.在eric后面追加一个"日天"
data[2][2].append("日天")
print(data)
# 5.在22前面插入 "老男孩"
data[2].insert(1,"老男孩")
print(data)
# 6. 将列表中的eric变为大写(列表中需要改变)
data[2][2][1] = data[2][2][1].upper()
2.5 面试题
data_list = [11,22,33,44,55,66,77,88]
# 请实现删除列表的第1,3,4索引的值,即:22,44,55。
del data_list[4]
del data_list[3]
del data_list[1]
注意:如果以后遇到删除列表的数据,索引变化问题(从后向前删)。
3. 元组 tuple
特殊的列表
元组是一个 有序 的 容器,当我们在程序中想要表示多个数据,都可以使用元组(元素的元素不可被修改)。
v1 = (11,22,33)
v2 = (True,"alex",False,123)
v3 = (True,"alex",False,123,[11,22,33,44])
# 强制要求,定于元组时候在最后一个元素的位置多写一个逗号。
v1 = (11,22,33, )
v2 = (True,"alex",False,123, )
v3 = (True,"alex",False,123,[11,22,33,44], )
v1 = (1) # 整型 1
v2 = 1 # 整型 1
v3 = (1,) # 元组 (1,)
# 面试题:a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 c = [(1,),(2,),(3,) ] 的区别?
3.1 公共功能
1. 长度
v1 = (11,22,33)
print( len(v1) )
2. 索引【读】
v1 = (11,22,33)
v1[0]
v1[1]
v1[2]
v1[0] = 999 # 错误
del v1[0] # 错误
3. 切片【读】
v1 = (11,22,33)
v1[0:2]
4. 步长
v1 = (11,22,33)
v1[::2]
5. for 循环
v1 = (11,22,33)
for item in v1:
print(item)
6. for循环+range
v1 = (11,22,33)
for i in range(len(v1)):
print(i, v1[i] )
3.2 专有功能(无)
3.3 转换
- 元组转其他
- int,不支持
- float,不支持
- bool
v1 = bool( (11,22,333,) ) # True v2 = bool( () ) # False
- str
v3 = str((11,22,33)) # "(11,22,33)"
- list
v4 = list( (11, 22, 33,) ) # [11,22,33]
- 其他转元组
- int,不支持
- float,不支持
- bool,不支持
- str
name = "武沛齐" data = tuple(name) # ('武', '沛', '齐')
- list
names = ["alex","eric","tony"] result = tuple(names) # ("alex","eric","tony")
划重点:空元组转换布尔值是False,其他都是True;其他类型转元组。
2.4 数据嵌套
元组的元素不允许被重置(个数和内容都不允许)
v1 = (11,22,33)
v2 = (1,True,False,"alex",3.14)
v3 = (11,22,["alex","tony"],True)
v3[0] = 123 # 错误
v3[2] = [11,22,33] # 错误
v3[2][1] = "武沛齐" # 正确
# 练习题
data = (
11,
[
6,
7,
(3.14,9.99,88,),
8
],
22,
(
"alex",
(111),
"eric",
["中国","美国","俄罗斯"]
),
99
)
# data[0] = 123
# data[1] = [2,3]
# data[1].insert(2,7.5)
# 1. 将22换成33,是否支持?,不支持。
# 2. 在7的后面添加一个7.5.
data[1].insert(2,7.5)
# 3. 获取 111这个值。
data[3][1]
# 4. 在alex前面添加“日天”,不支持。
实现用户登录程序
- 列表存数据
user_list = ["alex|123","eric|666","tony|admin"]
user = input("请输入用户名:")
pwd = input("请输入密码:")
flag = False
for item in user_list:
item_list = item.split('|') # ["用户名","密码"]
if item_list[0] == user and item_list[1] == pwd:
print("登录成功")
flag = True
break
if flag:
print("登录成功")
else:
print("登录失败")
- 列表中元组存数据
user_list = [ ("alex","123"),("eric","666"),]
...
- 自己添加用户名和密码存入列表中的元组,然后进行校验
user_list = []
print("请录入用户信息")
while True:
name = input("请输入用户名(Q/q):")
if name.upper() == "Q":
break
pwd = input("请输入密码:")
package = (name,pwd,)
user_list.append(packge)
print("用户认证")
...
本文地址:https://blog.csdn.net/Sunny_Future/article/details/107498714