Python元组及字符串
元组
元组(tuple)是Python中一种不可变的有序序列类型,与列表(list)类似但一旦创建就不能修改。
在 Python 语言中,元组也是多个元素按照一定顺序构成的序列。元组和列表的不同之处在于,元组是不可变类型,这就意味着元组类型的变量一旦定义,其中的元素不能再添加或删除,而且元素的值也不能修改。如果试图修改元组中的元素,将引发TypeError
错误,导致程序崩溃。定义元组通常使用形如(x, y, z)
的字面量语法,元组类型支持的运算符跟列表是一样的
1. 元组创建
# 空元组
empty_tuple = ()
empty_tuple = tuple()# 单元素元组(注意逗号)
single_tuple = (1,) # 正确
not_a_tuple = (1) # 错误,这只是一个整数# 多元素元组
numbers = (1, 2, 3, 4, 5)
mixed = (1, "hello", 3.14, True)# 从其他序列创建
tuple_from_list = tuple([1, 2, 3]) # (1, 2, 3)
tuple_from_str = tuple("abc") # ('a', 'b', 'c')
2. 元组基本操作
访问元素
t = (10, 20, 30, 40, 50)# 索引访问
print(t[0]) # 10
print(t[-1]) # 50 (最后一个元素)# 切片操作
print(t[1:3]) # (20, 30)
print(t[:2]) # (10, 20)
print(t[2:]) # (30, 40, 50)
print(t[::-1]) # (50, 40, 30, 20, 10) 反转元组
元组解包
# 基本解包
a, b, c = (1, 2, 3)
print(a, b, c) # 1 2 3# 使用*收集剩余元素
first, *middle, last = (1, 2, 3, 4, 5)
print(first) # 1
print(middle) # [2, 3, 4] (注意是列表)
print(last) # 5# 交换变量
x, y = 10, 20
x, y = y, x # 交换x和y的值# 打包操作
a = 1, 10, 100
print(type(a)) # <class 'tuple'>
print(a) # (1, 10, 100)
# 解包操作
i, j, k = a
print(i, j, k) # 1 10 100
3. 元组方法
t = (1, 2, 2, 3, 4)# count() - 统计元素出现次数
print(t.count(2)) # 2# index() - 返回元素第一次出现的索引
print(t.index(3)) # 3
4. 元组运算
t1 = (1, 2, 3)
t2 = (4, 5, 6)# 拼接
print(t1 + t2) # (1, 2, 3, 4, 5, 6)# 重复
print(t1 * 3) # (1, 2, 3, 1, 2, 3, 1, 2, 3)# 成员测试
print(2 in t1) # True
print(5 not in t1) # True
5. 元组与函数
# 作为函数参数和返回值
def min_max(numbers):return min(numbers), max(numbers)result = min_max([1, 2, 3, 4, 5]) # 返回(1, 5)
min_val, max_val = result
print(f'最小值: {min_val}, 最大值: {max_val}')# 作为可变长度参数
def print_args(*args):print(args) # args是一个元组print_args(1, 2, 3) # 输出: (1, 2, 3)
字符串
字符串,就是由零个或多个字符组成的有限序列
在 Python 程序中,我们把单个或多个字符用单引号或者双引号包围起来,就可以表示一个字符串。字符串中的字符可以是特殊符号、英文字母、中文字符、日文的平假名或片假名、希腊字母、Emoji 字符(如:💩、🐷、🀄️)等。
s1 = 'hello, world!'
s2 = "你好,世界!❤️"
s3 = '''hello,
wonderful
world!'''
print(f"s1: {s1}")
print(f"s2: {s2}")
print(f"s3: {s3}")# 空字符串
empty_str = ""
empty_str = str()
print(f" empty_str: {empty_str}")# 转义字符
escaped = "He said, \"Python is great!\""
new_line = "Line1\nLine2"
tab_char = "Name\tAge"
print(f"escaped: {escaped}")
print(f"new_line: {new_line}")
print(f"tab_char: {tab_char}")
字符串基本操作
访问字符
s = "Python"# 索引访问
print(s[0]) # 'P'
print(s[-1]) # 'n' (最后一个字符)# 切片操作
print(s[1:4]) # 'yth'
print(s[:3]) # 'Pyt'
print(s[3:]) # 'hon'
print(s[::-1]) # 'nohtyP' (反转字符串)
字符串拼接
# + 运算符
greeting = "Hello" + " " + "World" # "Hello World"
print(f"greeting: {greeting}")
# * 重复
stars = "*" * 10 # "**********"
print(f"stars: {stars}")
# join() 方法
words = ["Python", "is", "awesome"]
sentence = " ".join(words) # "Python is awesome"
print(f"sentence: {sentence}")
字符串常用方法
大小写转换
s = "Python Programming"# 大写转换小写
print(s.lower()) # "python programming"
# 小写转换大写
print(s.upper()) # "PYTHON PROGRAMMING"
# 首字母大写
print(s.title()) # "Python Programming"
# 首字母大写
print(s.capitalize()) # "Python programming"
# 大小写互换
print(s.swapcase()) # "pYTHON pROGRAMMING"
字符串查找
s = "Python is fun, Python is powerful"print(s.find("Python")) # 0 (返回首次出现的索引)
print(s.rfind("Python")) # 15 (从右向左查找)
print(s.index("is")) # 7 (类似find但找不到会报错)
print(s.rindex("is")) # 22
print("Python" in s) # True
print("Java" not in s) # True
字符串替换
s = "Python is good, Python is great"# 简单替换
print(s.replace("Python", "Java")) # "Java is good, Java is great"# 指定替换次数
print(s.replace("Python", "Java", 1)) # "Java is good, Python is great"# 翻译表替换
trans = str.maketrans("aeiou", "12345")
print("apple".translate(trans)) # "1ppl2"
字符串分割与连接
s = "Python,Java,C++,JavaScript"# 分割
print(s.split(",")) # ['Python', 'Java', 'C++', 'JavaScript']
print(s.split(",", 2)) # ['Python', 'Java', 'C++,JavaScript']# 按行分割
multiline = "Line1\nLine2\nLine3"
print(multiline.splitlines()) # ['Line1', 'Line2', 'Line3']# 分区
print(s.partition(",")) # ('Python', ',', 'Java,C++,JavaScript')
print(s.rpartition(",")) # ('Python,Java,C++', ',', 'JavaScript')
字符串格式化
# % 格式化 (旧式)
print("Name: %s, Age: %d" % ("Alice", 25))# str.format() 方法
print("Name: {}, Age: {}".format("Bob", 30))
print("Name: {1}, Age: {0}".format(30, "Bob"))
print("PI: {:.2f}".format(3.14159))# f-strings (Python 3.6+)
name = "Charlie"
age = 35
print(f"Name: {name}, Age: {age}")
print(f"Next year: {age+1}")
print(f"Upper name: {name.upper()}")
字符串检查
s = "Python123"print(s.isalnum()) # True (字母或数字)
print(s.isalpha()) # False (纯字母)
print(s.isdigit()) # False (纯数字)
print(s.islower()) # False (全小写)
print(s.isupper()) # False (全大写)
print(s.isspace()) # False (全空白)
print(s.startswith("Py")) # True
print(s.endswith("23")) # True
字符串修剪
s = " Python "print(s.strip()) # "Python" (去两边空格)
print(s.lstrip()) # "Python " (去左边空格)
print(s.rstrip()) # " Python" (去右边空格)s2 = "+++Python!!!"
print(s2.strip("+!")) # "Python" (去指定字符)
字符串编码与字节
# 字符串与字节转换
s = "Python编程"
b = s.encode("utf-8") # b'Python\xe7\xbc\x96\xe7\xa8\x8b'
s2 = b.decode("utf-8") # "Python编程"
print(f"s: {s}")
print(f"b: {b}")
print(f"s2: {s2}")
# 常见编码
print("你好".encode("gbk")) # b'\xc4\xe3\xba\xc3'
test=b'\xc4\xe3\xba\xc3'.decode("gbk")
print(test) # "你好"
字符串格式化高级
# 对齐与填充
print(f"{'Python':<10}") # 'Python ' (左对齐)
print(f"{'Python':>10}") # ' Python' (右对齐)
print(f"{'Python':^10}") # ' Python ' (居中对齐)
print(f"{'Python':*^10}") # '**Python**' (填充*)# 数字格式化
num = 1234.5678
print(f"{num:,}") # 1,234.5678 (千分位)
print(f"{num:.2f}") # 1234.57 (保留2位小数)
print(f"{num:10.2f}") # ' 1234.57' (宽度10)
print(f"{num:.2e}") # 1.23e+03 (科学计数法)# 进制转换
n = 42
print(f"{n:b}") # 101010 (二进制)
print(f"{n:o}") # 52 (八进制)
print(f"{n:x}") # 2a (十六进制)
字符串性能优化
# 避免在循环中使用+拼接字符串
# 不好的做法
result = ""
for i in range(10000):result += str(i) # 每次创建新字符串
print(f"result: {result}")# 好的做法
parts = []
for i in range(10000):parts.append(str(i))
result = "".join(parts)
print(f"result: {result}")
原始字符串
# 原始字符串(忽略转义)
path = r"C:\new_folder\test.txt" # 反斜杠不会被转义
print(path) # C:\new_folder\test.txt
字符串常量
import stringprint(string.ascii_letters) # 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
print(string.ascii_lowercase) # 'abcdefghijklmnopqrstuvwxyz'
print(string.ascii_uppercase) # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
print(string.digits) # '0123456789'
print(string.hexdigits) # '0123456789abcdefABCDEF'
print(string.octdigits) # '01234567'
print(string.punctuation) # 所有标点符号
print(string.whitespace) # 所有空白字符