
文章目录
- 检查字符串编码
-
- [Python bool布尔类型](#Python bool布尔类型)
- Python初始化变量,并不一定开辟新的内存!
- [Python input()函数:获取用户输入的字符串](#Python input()函数:获取用户输入的字符串)
- [Python print()函数高级用法](#Python print()函数高级用法)
- Python格式化字符串
- 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格式化字符串
字符串格式化方法
- %-formatting
- str.format()
- 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']
总结
- 字符串基础
- Python字符串是不可变的字符序列
- 支持单引号、双引号和三引号创建
- 提供丰富的字符串方法(strip、split、join等)
- 支持切片操作和索引访问
- 字符串操作最佳实践
- 大量字符串拼接推荐使用join方法而非+运算符
- 使用f-strings进行字符串格式化(Python 3.6+)
- 处理文件路径时注意使用原始字符串(r-string)
- 字符串清理时组合使用strip()和lower()等方法
- 编码处理
- Python3默认使用UTF-8编码
- 使用encode()和decode()进行编码转换
- 文件操作时明确指定编码格式
- 使用errors参数处理编码错误
- 布尔类型和逻辑运算
- True和False是Python的布尔值
- 支持and、or、not等逻辑运算符
- 所有对象都有布尔值语义
- 空容器、0、None等值在布尔上下文中为False
- 内存管理特点
- 小整数和字符串有缓存机制
- 可变对象和不可变对象的内存分配策略不同
- 了解引用计数和垃圾回收机制
- 实用工具函数
- 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
注意事项
- 字符串操作要注意性能影响,选择合适的方法
- 编码处理时要考虑兼容性和错误处理
- 合理使用内存管理机制,避免不必要的对象创建
- 使用适当的字符串格式化方式提高代码可读性