欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

练习题

  1. 写代码实现一个整数加法计算器(两个数相加)
    例如:用户输入 5+99
data = input("请输入数据:")
result = data.split("+") # ["5","99"]

# result[0] # 5
# result[1] # 99

value = int(result[0]) + int(result[1])
print(value)
  1. 写代码实现一个整数加法计算器(两个数相加)
    例如:用户输入 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("输入有错误")
  1. 写代码实现一个整数加法计算器(两个数相加)
    例如:用户输入 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])
  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]
  1. 写代码,有如下列表,利用切片实现每一个功能 (切片,索引切,区间是左闭右开)
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前面添加“日天”,不支持。

实现用户登录程序

  1. 列表存数据
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("登录失败")
  1. 列表中元组存数据
user_list = [ ("alex","123"),("eric","666"),]
...
  1. 自己添加用户名和密码存入列表中的元组,然后进行校验
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