03 Python字符串与基础操作详解

文章目录

Python字符串

字符串的本质

Python中的字符串是不可变的字符序列,使用单引号或双引号创建。字符串的不可变性意味着一旦创建就不能修改其中的字符,任何修改操作都会创建一个新的字符串对象。

字符串基本操作

python 复制代码
# 1. 字符串创建的多种方式
str1 = 'Hello'               # 单引号
str2 = "World"               # 双引号
str3 = '''这是
多行字符串'''                # 三引号支持多行文本,保留格式
str4 = """Python
编程指南"""                 # 三双引号,同样支持多行

# 2. 字符串拼接的多种方式
# 2.1 使用+号拼接(不推荐用于大量字符串)
result1 = str1 + ' ' + str2
print(result1)  # 输出:Hello World

# 2.2 使用join方法(推荐,更高效)
words = ['Hello', 'World', 'Python']
result2 = ' '.join(words)
print(result2)  # 输出:Hello World Python

# 2.3 使用f-string(Python 3.6+推荐)
name = 'Python'
version = '3.8'
result3 = f'{name} {version}'
print(result3)  # 输出:Python 3.8

# 3. 字符串切片的高级用法
text = "Python编程学习指南"
# 3.1 基本切片
print(text[0:6])     # 输出:Python(从索引0到5)
print(text[6:])      # 输出:编程学习指南(从索引6到末尾)
print(text[::-1])    # 输出:南指习学程编nohtyP(反转字符串)

# 3.2 带步长的切片
print(text[::2])     # 输出:Pto程习指(每隔一个字符取一个)
print(text[1:6:2])   # 输出:yhn(从索引1到5,步长为2)

# 4. 字符串常用方法示例
text = " Hello Python Programming "

# 4.1 空白处理
print(text.strip())       # 去除两端空格:'Hello Python Programming'
print(text.lstrip())      # 去除左侧空格
print(text.rstrip())      # 去除右侧空格

# 4.2 大小写转换
print(text.lower())       # 转小写:' hello python programming '
print(text.upper())       # 转大写:' HELLO PYTHON PROGRAMMING '
print(text.title())       # 首字母大写:' Hello Python Programming '
print(text.capitalize())  # 仅首字母大写:' hello python programming '

# 4.3 查找和替换
print(text.find('Python'))      # 返回子串位置:7
print(text.replace('Python', 'Java'))  # 替换字符串
print(text.count('o'))          # 统计字符出现次数:2

# 4.4 字符串判断
print('Hello123'.isalnum())    # 是否由字母和数字组成:True
print('Hello'.isalpha())       # 是否全是字母:True
print('123'.isdigit())         # 是否全是数字:True
print('Hello'.startswith('He')) # 是否以'He'开头:True
print('World'.endswith('ld'))  # 是否以'ld'结尾:True

# 5. 实际应用场景
# 5.1 文件路径处理
file_path = 'C:\\Users\\Documents\\report.txt'
processed_path = file_path.replace('\\', '/')
print(processed_path)  # 输出:C:/Users/Documents/report.txt

# 5.2 URL处理
url = 'https://api.example.com/users?name=张三&age=25'
base_url = url.split('?')[0]
print(base_url)  # 输出:https://api.example.com/users

# 5.3 数据清洗
raw_data = '  User123#@  '
clean_data = raw_data.strip().lower()
print(clean_data)  # 输出:user123#@

# 5.4 格式化输出
name = '张三'
score = 95.5
rank = 1
report = f'{name:<10}成绩:{score:.1f}分 排名:第{rank:0>3d}名'
print(report)  # 输出:张三      成绩:95.5分 排名:第001名
复制代码
## 3.7 Python字符串使用哪种编码格式?

### 3.7.1 Python3的默认编码
Python3默认使用Unicode(UTF-8)编码,这使得处理中文等非ASCII字符变得更加简单。在实际开发中,正确理解和使用编码对于处理国际化内容和文件操作非常重要。

### 3.7.2 编码转换示例
```python
# 字符串编码转换示例

# 1. 基本的编码转换
text = "你好,Python"

# 1.1 字符串转bytes(编码)
bytes_data = text.encode('utf-8')
print(bytes_data)  # 输出:b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cPython'

# 1.2 bytes转字符串(解码)
str_data = bytes_data.decode('utf-8')
print(str_data)    # 输出:你好,Python

# 2. 处理不同编码格式
# 2.1 GBK编码示例(常用于处理中文Windows系统的文件)
gbk_bytes = text.encode('gbk')
print(gbk_bytes)  # 输出GBK编码的字节序列
print(gbk_bytes.decode('gbk'))  # 输出:你好,Python

# 2.2 错误处理
try:
    # 使用ignore忽略无法解码的字符
    weird_bytes = b'\xff\xfe\xfd' + 'Hello'.encode()
    print(weird_bytes.decode('utf-8', errors='ignore'))  # 输出:Hello
    
    # 使用replace替换无法解码的字符
    print(weird_bytes.decode('utf-8', errors='replace'))  # 输出:���Hello
except UnicodeDecodeError as e:
    print(f"解码错误:{e}")

# 3. 文件编码处理
# 3.1 写入不同编码的文件
with open('utf8.txt', 'w', encoding='utf-8') as f:
    f.write(text)  # UTF-8编码写入

with open('gbk.txt', 'w', encoding='gbk') as f:
    f.write(text)  # GBK编码写入

# 3.2 读取不同编码的文件
def read_file_with_encoding(file_path, encodings=['utf-8', 'gbk', 'latin1']):
    """尝试使用多种编码读取文件"""
    for encoding in encodings:
        try:
            with open(file_path, 'r', encoding=encoding) as f:
                return f.read()
        except UnicodeDecodeError:
            continue
    raise UnicodeDecodeError(f"无法使用{encodings}中的编码格式读取文件")

# 4. 编码检测
# 4.1 使用chardet库检测编码(需要先安装:pip install chardet)
import chardet

raw_data = "你好,Python".encode('gbk')
result = chardet.detect(raw_data)
print(result)  # 输出:{'encoding': 'GB2312', 'confidence': 0.99}

# 5. 性能优化建议
# 5.1 大量字符串操作时的优化
from io import StringIO
import time

# 不推荐的方式(字符串拼接)
start_time = time.time()
big_string = ''
for i in range(10000):
    big_string += str(i)
print(f"字符串拼接耗时:{time.time() - start_time:.4f}秒")

# 推荐的方式(使用StringIO)
start_time = time.time()
sio = StringIO()
for i in range(10000):
    sio.write(str(i))
big_string = sio.getvalue()
print(f"StringIO耗时:{time.time() - start_time:.4f}秒")

# 5.2 编码转换的缓存优化
from functools import lru_cache

@lru_cache(maxsize=128)
def cached_encode(text, encoding='utf-8'):
    """缓存常用字符串的编码结果"""
    return text.encode(encoding)

# 使用缓存的编码函数
for _ in range(1000):
    encoded = cached_encode("常用的字符串")

检查字符串编码

import sys

print(sys.getdefaultencoding()) # 输出:utf-8

复制代码
## 3.8 Python bytes

### 3.8.1 bytes对象的特点
bytes是不可变的字节序列,主要用于处理二进制数据。

### 3.8.2 bytes使用示例
```python
# 创建bytes对象
b1 = bytes([65, 66, 67])  # 使用ASCII值
print(b1)  # 输出:b'ABC'

# 文件操作中的bytes应用
with open('example.txt', 'wb') as f:  # 二进制写入模式
    f.write(b'Hello, bytes!')

with open('example.txt', 'rb') as f:  # 二进制读取模式
    content = f.read()
    print(content)  # 输出:b'Hello, bytes!'

Python bool布尔类型

布尔值的特点

Python中的布尔类型有两个值:True和False,用于逻辑运算。布尔值在条件判断、循环控制等场景中广泛使用。

布尔运算示例

python 复制代码
# 1. 基本布尔运算
x = True
y = False

# 1.1 逻辑运算符
print(x and y)  # 输出:False(两者都为True才返回True)
print(x or y)   # 输出:True(有一个为True就返回True)
print(not x)    # 输出:False(取反操作)

# 1.2 比较运算
a = 10
b = 5
print(a > b)    # 输出:True
print(a == b)   # 输出:False
print(a != b)   # 输出:True

# 2. 真值测试
# 2.1 容器类型的真值测试
print(bool([]))        # 空列表:False
print(bool([1, 2]))    # 非空列表:True
print(bool(""))        # 空字符串:False
print(bool("hello"))   # 非空字符串:True
print(bool({}))        # 空字典:False
print(bool({1: 'a'}))  # 非空字典:True

# 2.2 数值类型的真值测试
print(bool(0))         # 零:False
print(bool(0.0))       # 浮点数零:False
print(bool(-1))        # 负数:True
print(bool(0.1))       # 非零浮点数:True

# 3. 实际应用场景
# 3.1 条件判断中的布尔值
def is_valid_username(username):
    """检查用户名是否有效"""
    # 用户名必须是非空字符串且长度在3-20之间
    if not username:  # 空字符串判断
        return False
    return 3 <= len(username) <= 20

# 3.2 列表过滤
numbers = [0, 1, 2, 3, 4, 5]
# 使用布尔值过滤列表,只保留偶数
even_numbers = [num for num in numbers if num % 2 == 0]
print(even_numbers)  # 输出:[0, 2, 4]

# 3.3 短路逻辑
def get_user_data():
    return None

# 使用and的短路特性避免空值错误
user_data = get_user_data()
if user_data and user_data.get('name'):
    print(f"用户名:{user_data['name']}")
else:
    print("未获取到用户数据")

# 3.4 使用all()和any()函数
# all():所有元素为True时返回True
numbers = [2, 4, 6, 8]
is_all_even = all(num % 2 == 0 for num in numbers)
print(f"是否全是偶数:{is_all_even}")  # 输出:True

# any():任一元素为True时返回True
has_greater_than_five = any(num > 5 for num in numbers)
print(f"是否有大于5的数:{has_greater_than_five}")  # 输出:True

Python初始化变量,并不一定开辟新的内存!

Python的内存管理机制

Python使用引用计数和小整数池等优化机制来管理内存。

内存复用示例

python 复制代码
# 小整数池示例
a = 256
b = 256
print(a is b)  # 输出:True(在小整数池范围内)

c = 257
d = 257
print(c is d)  # 输出:False(超出小整数池范围)

# 字符串驻留
s1 = 'hello'
s2 = 'hello'
print(s1 is s2)  # 输出:True(字符串被驻留)

# 可变对象的内存分配
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 is list2)  # 输出:False(每次创建新的列表对象)

Python input()函数:获取用户输入的字符串

input()函数的特点

input()函数用于从控制台获取用户输入,返回值始终是字符串类型。

输入处理示例

python 复制代码
# 基本输入
name = input("请输入你的名字:")
print(f"你好,{name}!")

# 数值输入处理
try:
    age = int(input("请输入你的年龄:"))
    birth_year = 2024 - age
    print(f"你出生于{birth_year}年")
except ValueError:
    print("请输入有效的数字!")

# 多值输入
x, y = map(int, input("请输入两个数字(用空格分隔):").split())
print(f"两数之和为:{x + y}")

Python print()函数高级用法

print()函数的参数

  • sep:分隔符
  • end:结束符
  • file:输出流
  • flush:是否刷新缓冲区

高级打印示例

python 复制代码
# 自定义分隔符
print("Python", "Java", "C++", sep=" | ")

# 自定义结束符
for i in range(3):
    print("Processing", end=".")
    # 输出:Processing.Processing.Processing.

# 输出到文件
with open('output.txt', 'w') as f:
    print("Hello, File!", file=f)

# 格式化输出表格
data = [("姓名", "年龄", "成绩"),
        ("张三", 18, 85),
        ("李四", 19, 92)]

for row in data:
    print("{:<10}{:<10}{:<10}".format(*row))

Python格式化字符串

字符串格式化方法

  1. %-formatting
  2. str.format()
  3. f-strings(Python 3.6+)

格式化示例

python 复制代码
# %-formatting
name = "张三"
age = 20
print("我叫%s,今年%d岁" % (name, age))

# str.format()
print("我叫{0},今年{1}岁".format(name, age))

# f-strings
print(f"我叫{name},今年{age}岁")

# 数值格式化
pi = 3.14159
print(f"PI值保留两位小数:{pi:.2f}")

# 对齐和填充
for i in range(1, 4):
    print(f"{i:0>3}")  # 输出:001, 002, 003

# 字典格式化
student = {"name": "张三", "score": 95}
print("%(name)s的成绩是%(score)d分" % student)

Python转义字符

常用转义字符

  • \n:换行
  • \t:制表符
  • \:反斜杠
  • ':单引号
  • ":双引号

转义字符示例

python 复制代码
# 基本转义字符使用
print("第一行\n第二行")  # 换行
print("姓名\t年龄\t成绩")  # 制表符

# 原始字符串(raw string)
path = r"C:\Users\Documents"  # 不处理转义字符
print(path)

# 多行字符串中的转义
text = """这是第一行\n\
这是第二行,和第一行在同一个语句中"""
print(text)

# Unicode转义
print("\u4F60\u597D")  # 输出:你好

实际应用场景

python 复制代码
# 文件路径处理
import os

path = os.path.join("users", "documents", "files")
print(path)  # 自动使用正确的路径分隔符

# 正则表达式中的转义
import re

text = "Hello\nWorld"
pattern = r"\n"  # 匹配换行符
lines = re.split(pattern, text)
print(lines)  # 输出:['Hello', 'World']

总结

  1. 字符串基础
  • Python字符串是不可变的字符序列
  • 支持单引号、双引号和三引号创建
  • 提供丰富的字符串方法(strip、split、join等)
  • 支持切片操作和索引访问
  1. 字符串操作最佳实践
  • 大量字符串拼接推荐使用join方法而非+运算符
  • 使用f-strings进行字符串格式化(Python 3.6+)
  • 处理文件路径时注意使用原始字符串(r-string)
  • 字符串清理时组合使用strip()和lower()等方法
  1. 编码处理
  • Python3默认使用UTF-8编码
  • 使用encode()和decode()进行编码转换
  • 文件操作时明确指定编码格式
  • 使用errors参数处理编码错误
  1. 布尔类型和逻辑运算
  • True和False是Python的布尔值
  • 支持and、or、not等逻辑运算符
  • 所有对象都有布尔值语义
  • 空容器、0、None等值在布尔上下文中为False
  1. 内存管理特点
  • 小整数和字符串有缓存机制
  • 可变对象和不可变对象的内存分配策略不同
  • 了解引用计数和垃圾回收机制
  1. 实用工具函数
  • input():获取用户输入
  • print():灵活的输出控制
  • str.format():多样化的字符串格式化

代码示例(字符串操作综合示例)

python 复制代码
 
def string_operations_demo():
    # 创建字符串
    text = "  Python编程  "
    
    # 基本处理
    cleaned = text.strip()
    
    # 字符串拼接
    languages = ["Python", "Java", "C++"]
    result = " | ".join(languages)
    
    # 格式化输出
    name = "张三"
    score = 95.5
    report = f"{name:<10}成绩:{score:.1f}"
    
    # 编码处理
    encoded = text.encode('utf-8')
    decoded = encoded.decode('utf-8')
    
    return cleaned, result, report

# 实用的字符串处理函数
def string_utils():
    def safe_split(text, sep=None, maxsplit=-1):
        """安全的字符串分割函数"""
        try:
            return text.split(sep, maxsplit)
        except AttributeError:
            return [str(text)]
    
    def ensure_string(value):
        """确保值为字符串类型"""
        return str(value) if value is not None else ''
    
    return safe_split, ensure_string

注意事项

  1. 字符串操作要注意性能影响,选择合适的方法
  2. 编码处理时要考虑兼容性和错误处理
  3. 合理使用内存管理机制,避免不必要的对象创建
  4. 使用适当的字符串格式化方式提高代码可读性
相关推荐
前端百草阁2 分钟前
JavaScript 设计模式(23 种)
开发语言·前端·javascript·设计模式
EntyIU6 分钟前
Java NIO 实战
java·开发语言·nio
二宝哥7 分钟前
springboot项目使用Gradle工具实现依赖版本控制
java·spring boot·后端·gradle·版本
安然无虞14 分钟前
Python自动化测试·Selenium操控元素的方法
python·selenium·测试工具
浩瀚之水_csdn27 分钟前
Python 3 网络编程详解:从原理到实战
开发语言·网络·python
济*沧*海27 分钟前
Set集合深度解析:原理、特性与应用场景全攻略
java
geovindu28 分钟前
java: Singleton Pattern
java·开发语言·后端·单例模式·设计模式·创建型模式
满怀冰雪29 分钟前
24_中间件系统源码分析_Middleware链的洋葱模型与异常处理
人工智能·python·中间件·langchain
江华森30 分钟前
03-python-包与模块异常处理
python
AI行业学习36 分钟前
2026 版 Notepad++ 完整图文安装指南|官方渠道无捆绑,一键切换中文界面
开发语言·人工智能·python·html·notepad++