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. 使用适当的字符串格式化方式提高代码可读性
相关推荐
信徒_4 分钟前
go 语言中的线程池
开发语言·后端·golang
Pandaconda5 分钟前
【Golang 面试题】每日 3 题(六十五)
开发语言·经验分享·笔记·后端·面试·golang·go
至暗时刻darkest6 分钟前
go 查看版本
开发语言·后端·golang
JIU_WW8 分钟前
jar、war、pom
java·jar
向哆哆19 分钟前
Java与NoSQL数据库的集成与优化
java·开发语言·nosql
茂茂在长安22 分钟前
Linux 命令大全完整版(11)
java·linux·运维·服务器·前端·centos
MSTcheng.23 分钟前
【C语言】指针(5)
c语言·开发语言
╮壞孩子的天24 分钟前
C语言多人聊天室 ---chat(客户端聊天)
c语言·开发语言
不太会写25 分钟前
基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统
python·推荐算法
songbaoxian34 分钟前
ElasticSearch
java·linux·elasticsearch