30 个 Python 编程秘籍

liftword2个月前 (03-04)技术文章9

变量与数据类型操作技巧

(一)变量交换的魔法

在 Python 中,交换两个变量的值无需借助第三方临时变量,直接交换即可。例如:

a = 10
b = 20
a, b = b, a
print(a) # 输出20
print(b) # 输出10

这种方式利用了 Python 元组解包的特性,赋值的右侧形成一个新元组,左侧立刻将该元组解包到变量 a 和 b,简洁高效,尽显 Python 的优雅。

(二)数值比较的便捷之道

Python 支持链接比较操作符,能简洁地表达复杂的条件判断。比如检查一个数是否在某个范围内:

n = 15
result = 1 < n < 20
print(result) # 输出True

这里的1 < n < 20等价于1 < n and n < 20,但前者代码更简洁,且 Python 会按数学上的传统解释,仅计算一次中间变量,提高了效率。

(三)条件赋值的优雅方式

三元操作符是if - else语句的快捷方式,可用于条件赋值,使代码更紧凑。语法为[on_true] if [expression] else [on_false]。例如:

x = 10 if 5 > 3 else 20
print(x) # 输出10

如果5 > 3为真,x赋值为 10,否则为 20。对于类对象也适用,如x = (classA if y == 1 else classB)(param1, param2),根据条件选择调用classA或classB的构造函数。

(四)巧用下划线 “_”

在 Python 控制台中,下划线 “_” 有特殊用途,它会自动存储最近一次表达式的结果,方便继续计算或检查值。例如:

>>> 10 + 5
15
>>> _ * 2
30

这里的_代表上一次计算结果 15,接着进行乘法运算。但要注意,在 IDE(如 PyCharm)中,该用法不成立,_仅作为普通变量,使用前需先定义 。

数据结构处理技巧

(一)字典与集合推导

字典推导和集合推导是 Python 中创建字典和集合的简洁方式。字典推导语法为{key: value for key, value in iterable if condition},集合推导语法为{expression for value in iterable if condition}。例如,创建一个包含数字及其平方的字典:

square_dict = {i: i ** 2 for i in range(1, 6)}
print(square_dict) # 输出 {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

用集合推导创建一个包含 1 到 5 中偶数的平方的集合:

even_square_set = {i ** 2 for i in range(1, 6) if i % 2 == 0}
print(even_square_set) # 输出 {4, 16}

对比常规的循环创建方式,推导式代码更简洁、高效,且逻辑更清晰,能快速将可迭代对象转换为所需的数据结构。

(二)用 Counter 计数

collections模块中的Counter类用于统计可迭代对象中元素的出现次数,以字典形式返回结果,键是元素,值是出现次数。例如统计字符串中每个字符的出现次数:

from collections import Counter
text = "hello world"
counter = Counter(text)
print(counter) # 输出 Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

Counter还支持更新计数(update方法)、减法操作(subtract方法),以及获取出现次数最多的元素(most_common方法) ,在文本分析、数据统计等场景十分实用。

(三)列表元素解包

Python 支持将列表中的元素解包并赋值给多个变量,变量数量需与列表元素数量匹配,否则会报错。例如:

my_list = [10, 20, 30]
a, b, c = my_list
print(a) # 输出10
print(b) # 输出20
print(c) # 输出30

若不想匹配所有元素,可用星号表达式(*)收集剩余元素,收集的元素会被打包成一个列表。比如:

my_list = [10, 20, 30, 40]
a, *rest = my_list
print(a) # 输出10
print(rest) # 输出 [20, 30, 40]

这种方式在处理函数返回值、解析数据结构时非常方便。

(四)合并字典

在 Python 3.5 + 版本中,可使用解包操作符(**)合并字典,简洁高效。例如:

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged_dict = {**dict1, **dict2}
print(merged_dict) # 输出 {'a': 1, 'b': 3, 'c': 4}

若键重复,后一个字典的值会覆盖前一个字典的值。在 Python 2.x 或更早版本中,可使用update方法实现类似效果:

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged_dict = dict1.copy()
merged_dict.update(dict2)
print(merged_dict) # 输出 {'a': 1, 'b': 3, 'c': 4}

代码调试与优化技巧

(一)pdb 调试

pdb是 Python 内置的调试模块,能在脚本中设置断点,方便调试代码。在需要设置断点的地方,添加import pdb; pdb.set_trace()语句,程序运行到该语句时会进入调试模式。例如:

def add_numbers(a, b):
result = a + b
 return result
import pdb; pdb.set_trace()
x = 5
y = 3
sum_result = add_numbers(x, y)
print(sum_result)


运行这段代码,当执行到pdb.set_trace()时,程序暂停,进入pdb调试模式。在调试模式下,可使用n(next)命令执行下一行代码,s(step)命令进入函数内部,c(continue)命令继续执行程序,还能直接输入变量名查看其值,如输入x查看x的值 ,通过这些操作可逐步排查代码中的问题。

(二)避免全局变量

全局变量在程序运行期间一直存在,占用内存,过多使用会导致内存占用增加,影响程序性能。而且,全局变量破坏函数封装性,使函数对其产生依赖,降低函数可移植性,也会让代码可读性变差,因为多个函数都可能操作全局变量,修改时难以追踪影响范围。例如:

# 不好的示例,使用全局变量
global_variable = 10
def modify_global():
 global global_variable
 global_variable += 5
 return global_variable
# 好的示例,避免使用全局变量
def add_numbers(a, b):
 return a + b

在第一个示例中,modify_global函数依赖全局变量global_variable,不仅使函数独立性降低,还增加了调试和维护难度。而第二个示例中,add_numbers函数通过参数接收数据,不依赖全局变量,代码更简洁、易读、可维护 。

(三)使用列表推导式

列表推导式是创建列表的简洁方式,相比传统for循环,它在性能和代码简洁性上都有优势。例如,使用传统for循环创建一个包含 1 到 10 的平方的列表:

squares = []
for i in range(1, 11):

 squares.append(i ** 2)

print(squares)

使用列表推导式实现同样功能:

squares = [i ** 2 for i in range(1, 11)]
print(squares)

列表推导式代码更简洁,且执行效率更高,因为它在底层由 C 语言实现,减少了 Python 解释器的开销,在处理大规模数据时优势更明显。

(四)合理选择数据类型

Python 有多种数据类型,如列表、元组、集合、字典,各有特点,根据实际需求选择合适的数据类型很重要。列表是有序可变序列,适合需要频繁修改元素的场景;元组是有序不可变序列,若数据无需修改,使用元组可节省内存,且元组可作为字典的键;集合是无序不重复元素集合,常用于去重和集合运算;字典是无序键值对集合,适合通过键快速查找值的场景。例如:

# 用列表存储学生成绩
student_scores = [85, 90, 78, 92]
# 用元组存储固定信息,如圆周率
pi_info = ('圆周率', 3.14159)
# 用集合存储不重复的单词
words = {'apple', 'banana', 'cherry', 'apple'} # 自动去重,最终集合中只有一个'apple'
# 用字典存储学生信息,方便通过学号查找
student_info = {1001: {'name': 'Alice', 'age': 20}, 1002: {'name': 'Bob', 'age': 21}}

根据不同场景选择合适的数据类型,能提高代码执行效率和内存利用率。

文件与模块相关技巧

(一)设置文件分享

Python 提供了便捷的方式来设置文件共享,通过运行 HTTP 服务器,能轻松地从服务器根目录共享文件。在 Python 2 中,只需在命令行输入python -m SimpleHTTPServer,即可在默认端口 8000 上启动服务器。若想使用自定义端口,可将端口号作为最后一个参数传递,如python -m SimpleHTTPServer 8888,就会在 8888 端口启动服务器 。

而在 Python 3 中,命令有所变化,需使用python3 -m http.server来启动服务器,同样,若要指定端口,可写成python3 -m http.server 9000 。例如,在开发 Web 项目时,需要与团队成员共享项目中的一些静态文件,使用 Python 的 HTTP 服务器,无需复杂的配置,就能快速实现文件共享,方便团队成员访问和协作。

(二)打印模块路径

在 Python 编程中,有时需要获取导入模块的文件路径,以便查看模块的具体实现或进行相关调试。可以使用importlib.util模块来实现这一功能 。示例代码如下:

import importlib.util
import os
def get_module_path(module_name):
 spec = importlib.util.find_spec(module_name)
 if spec is None:
 raise ModuleNotFoundError(f"No module named '{module_name}'")
 origin = spec.origin
 if origin is None:
 raise ValueError(f"No origin found for module '{module_name}'")
 return os.path.dirname(origin)
module_path = get_module_path('numpy')
print(module_path)

这段代码定义了一个函数get_module_path,接收模块名作为参数,通过importlib.util.find_spec函数获取模块的规范(spec),再从规范中获取模块的origin属性,即模块文件的路径,最后使用os.path.dirname函数获取模块文件所在的目录路径并返回 。比如在使用第三方库时,想了解其安装位置和源代码结构,通过这种方式就能轻松获取其路径 。

(三)正确导入模块

import语句是 Python 中用于导入其他模块的关键语句,通过它可使用其他模块中定义的类、方法或变量,实现代码复用 。其常见用法有两种,一种是import module_name,直接导入模块,例如import math,之后可通过math.sqrt(4)来调用math模块中的sqrt函数 ;另一种是from module_name import function_name/class_name,从模块中导入特定的函数或类,如from math import sqrt,这样就可以直接使用sqrt(4),而无需通过模块名前缀 。

但要注意,使用from…import语句时需有节制,避免大量使用from module import *这种方式,因为它会将模块中的所有名称导入到当前命名空间,可能导致命名冲突,使代码可读性变差,难以追踪变量和函数的来源 。例如在一个项目中,有多个模块都定义了名为config的变量或函数,若使用from module1 import *和from module2 import *,就可能引发命名冲突,导致程序出错 。

(四)深入理解模块

模块是 Python 中组织代码的重要方式,它将相关的代码、变量、函数和类组织在一起,存储在一个文件中,文件名就是模块名,通常以.py为后缀 。模块可分为 Python 内置模块(如os、sys等)、第三方模块(需安装,如numpy、pandas等)和用户自定义模块 。

创建模块很简单,只需在一个.py文件中编写代码,例如创建一个名为my_module.py的模块,其中定义一个函数:

def add_numbers(a, b):
return a + b


在其他文件中使用该模块时,可通过import my_module导入,然后用my_module.add_numbers(3, 5)来调用函数 。在大型项目中,模块的合理使用能使代码结构更清晰,便于维护和扩展。比如一个 Web 开发项目,可将数据库操作、用户认证、页面渲染等功能分别封装在不同模块中,每个模块专注于实现一项特定功能,提高代码的可维护性和可复用性 。

字符串处理技巧

(一)多行字符串的使用

在 Python 中,处理多行字符串有多种方法,各有优劣。使用反斜杠(\)是一种方式,它能将一行字符串拆分成多行,如:

multi_line_str = "这是第一行 \
这是第二行 \
这是第三行"
print(multi_line_str)

这种方法的优点是简单直接,在需要在特定位置换行时很方便。但缺点也很明显,反斜杠后的换行符不能有多余空格,否则会报错,而且代码整体的可读性较差,看起来不够直观 。

三引号(''' 或 """)也是常用的方式,使用三引号可直接定义多行字符串,其中的内容会按原样保留换行和缩进 。例如:

multi_line_str = """
这是第一行
这是第二行
这是第三行
"""
print(multi_line_str)

它的优势在于方便编写包含大量换行和缩进的文本,像文档字符串、SQL 语句等。但如果字符串中包含大量空格和缩进,可能会影响美观和代码布局 。

还有一种方法是使用括号(()),把多行字符串用括号括起来,Python 会自动将它们拼接成一个字符串,如:

multi_line_str = (
  "这是第一行 "
 "这是第二行 "
 "这是第三行"
)
print(multi_line_str)


这种方式在字符串较长时,能提高代码可读性,也不会像反斜杠那样对换行符后的空格敏感。不过,它要求每行字符串末尾不能有多余的逗号或其他标点符号,否则会报错 。

(二)字符串分割与合并

字符串分割和合并是常见操作。使用split()方法可按指定字符将字符串分割成列表,默认以空格为分隔符。例如:

text = "Hello, World! How are you?"
words = text.split()
print(words) # 输出 ['Hello,', 'World!', 'How', 'are', 'you?']

若要按其他字符分割,可传入指定字符,如用逗号分割:

text = "apple,banana,orange"
fruits = text.split(',')
print(fruits) # 输出 ['apple', 'banana', 'orange']


合并列表中的字符串,可使用join()方法,它是将指定字符串作为连接符,将列表中的字符串连接起来。例如:

words = ['Hello', 'World']
result = ' '.join(words)
print(result) # 输出 Hello World

这里用空格作为连接符,也可根据需求使用其他字符,如用逗号连接:

fruits = ['apple', 'banana', 'orange']
result = ','.join(fruits)
print(result) # 输出 apple,banana,orange

(三)字符串格式化

Python 中字符串格式化有format函数和%形式两种方式 。%形式是早期的格式化方法,使用%操作符,例如:

name = "Alice"
age = 25
message = "My name is %s and I'm %d years old." % (name, age)
print(message) # 输出 My name is Alice and I'm 25 years old.

这种方式在格式化简单字符串时较为方便,但对于复杂的格式化需求,如多次使用同一变量、灵活控制格式等,就显得力不从心 。

format函数是 Python 2.6 后引入的,它提供了更强大、灵活的格式化功能。基本语法是在字符串中用{}作为占位符,通过format方法传入参数进行替换 。例如:

name = "Bob"
age = 30
message = "My name is {} and I'm {} years old.".format(name, age)
print(message) # 输出 My name is Bob and I'm 30 years old.

format函数支持按位置、关键字、对象属性、字典键等多种方式填充占位符,还能进行格式控制,如保留小数位数、设置对齐方式等 。例如:

number = 123.456
formatted_number = "Formatted number: {:.2f}".format(number)
print(formatted_number) # 输出 Formatted number: 123.46

(四)字符串查找与替换

在字符串处理中,查找和替换操作也很常见。find()方法用于查找子字符串在字符串中的位置,若找到则返回起始索引,否则返回 -1 。例如:

text = "Hello, World!"
index = text.find("World")
print(index) # 输出 7

replace()方法用于替换字符串中的子字符串,返回替换后的新字符串,原字符串不变 。例如:

text = "Hello, World!"
new_text = text.replace("World", "Python")
print(new_text) # 输出 Hello, Python!

在文本处理中,如数据清洗时,若文本中存在错误或不规范的字符串,可使用replace()方法进行修正;在文本分析中,通过find()方法查找特定关键词出现的位置,进而统计关键词出现的次数,分析文本主题 。

其他实用技巧

(一)利用 assert 语句

assert语句是 Python 中一个非常实用的调试工具,它就像是给代码加上了一把 “安全锁” 。其基本语法为assert condition, "error message",其中condition是要测试的条件,"error message"是当条件为假时显示的错误消息 。比如在一个计算两个正整数之和的函数中,我们可以使用assert语句来确保输入的参数都是正整数:

def add_positive_numbers(a, b):
assert isinstance(a, int) and a > 0, "a必须是正整数"
 assert isinstance(b, int) and b > 0, "b必须是正整数"
 return a + b
result = add_positive_numbers(3, 5)
print(result)


当调用add_positive_numbers函数时,如果传入的参数不是正整数,assert语句就会触发AssertionError异常,并显示相应的错误消息,帮助我们快速定位问题 。在开发过程中,assert语句可以用于验证函数的输入、输出,以及程序内部的一些关键假设,确保代码在正确的条件下运行 。但要注意,在生产环境中,Python 解释器以优化模式(如使用-O或-OO选项运行)运行时,assert语句会被全局禁用,所以在生产环境中,不能依赖assert语句来进行关键的错误检查,而应使用显式的错误处理机制,如try/except块 。

(二)使用 with 语句

with语句在 Python 中主要用于资源管理,它能确保在代码块执行结束后,无论是否发生异常,相关资源都能被正确地关闭或清理 。最常见的应用场景是文件读写操作 。在传统的文件操作中,我们使用open函数打开文件后,需要手动调用close方法关闭文件,否则可能会导致资源泄露 。例如:

file = open('example.txt', 'r')
try:
 content = file.read()
 print(content)
finally:
 file.close()

而使用with语句,代码会变得更加简洁和安全:

with open('example.txt', 'r') as file:
content = file.read()
 print(content)

在这个例子中,with语句会自动处理文件的打开和关闭操作 。当代码块执行完毕,无论是否发生异常,文件都会被自动关闭 。这不仅减少了代码量,还避免了因忘记关闭文件而导致的资源泄露问题 。除了文件操作,with语句还可以应用于其他需要资源管理的场景,比如数据库连接、网络套接字等 。例如,在使用数据库连接时:

import sqlite3
with sqlite3.connect('test.db') as conn:
 cursor = conn.cursor()
 cursor.execute('SELECT * FROM users')
 results = cursor.fetchall()
 for row in results:
 print(row)

这里with语句确保了数据库连接在使用完毕后会被正确关闭,提高了代码的健壮性和可读性 。

(三)使用枚举

在 Python 中,enumerate函数是一个非常实用的工具,它可以在遍历序列(如列表、元组、字符串等)时,同时获取元素的索引和值 。其基本语法为enumerate(iterable, start=0),其中iterable是要遍历的可迭代对象,start是索引的起始值,默认为 0 。例如,遍历一个水果列表并打印每个水果及其索引:

fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
 print(f"Index {index}: {fruit}")


输出结果为:

Index 0: apple
Index 1: banana
Index 2: cherry

如果希望索引从 1 开始,可以将start参数设置为 1:

for index, fruit in enumerate(fruits, start=1):
print(f"Index {index}: {fruit}")


输出结果为:

Index 1: apple
Index 2: banana
Index 3: cherry


enumerate函数的优势在于它使代码更加简洁易读,避免了手动管理索引变量的繁琐过程 。在处理需要索引的任务时,如解析数据到列表并记录数据行号,或者在遍历序列时追踪元素位置,enumerate函数都能发挥很大的作用 。比如,在一个统计文本中每个单词出现次数的程序中,可以使用enumerate函数来遍历单词列表,并结合字典来记录每个单词的出现次数 :

text = "this is a sample text to demonstrate the usage of enumerate"
words = text.split()
word_count = {}
for index, word in enumerate(words):
 if word not in word_count:
 word_count[word] = 1
 else:
 word_count[word] += 1
for word, count in word_count.items():
 print(f"{word}: {count}")


(四)使用 lambda 表达式

lambda表达式是 Python 中创建匿名函数的一种方式,它允许我们快速定义一个简单的函数,而无需使用def关键字进行常规的函数定义 。lambda表达式的语法为lambda arguments: expression,其中arguments是函数的参数,可以有多个,用逗号分隔;expression是函数的返回值表达式 。例如,定义一个简单的函数来计算两个数的和:

add = lambda x, y: x + y
result = add(3, 5)
print(result)

这里lambda表达式定义了一个匿名函数,它接受两个参数x和y,返回它们的和 。lambda表达式通常用于需要一个简短函数的场景,特别是当这个函数只使用一次时 。比如,在对一个字典列表按照某个键值进行排序时,可以使用lambda表达式来指定排序的依据 。假设有一个包含学生信息的字典列表,每个字典包含学生的姓名和成绩,要按照成绩对学生进行排序:

students = [
  {'name': 'Alice', 'score': 85},
 {'name': 'Bob', 'score': 78},
 {'name': 'Charlie', 'score': 92}
]
students.sort(key=lambda student: student['score'])
print(students)


在这个例子中,lambda student: student['score']作为sort方法的key参数,指定了按照学生字典中的'score'键值进行排序 。lambda表达式还可以与其他函数结合使用,如map、filter等 。例如,使用map函数和lambda表达式对一个列表中的每个元素进行平方运算:

numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers)

这里map函数将lambda表达式应用到numbers列表的每个元素上,得到一个新的包含平方值的列表 。

相关文章

绝版!247个Python经典有趣实例,代码齐全可复制,PDF版拿走即用

对于大部分Python学习者来说,基础核心知识基本已经掌握了,但"纸上得来终觉浅,绝知此事要躬行",要想完全掌握Python,还得靠实践应用。【文末获取】今天给大家分享247个Python实战项目,都...

Python初级练习小实例(1-20例),1个实例多个例子相互参考

以下所有测试实例来自于菜鸟教程:https://www.runoob.com/python3/python3-examples.html 1:Python 数字求和自己的代码#用户输入数字,并转换为浮...

5个短小精悍的 Python 趣味脚本,太赞了,非常适合小白上手

都说瑞雪兆丰年,新年开工第一天就下了一场大雪!漫天飞舞的雪花精灵,真的很漂亮,菜鸟哥所在的城市好久没有下雪了,冬天下点雪还是很有意境的。新年开始,大家Python学起来,目前Python是最火的语言,...

10个常见的实用python实例

以下是10个常见的实用Python实例,涵盖了不同领域和应用:1. 网页爬虫:import requests from bs4 import BeautifulSoup url = 'https:/...

python自动化能发挥到什么程度,两个有趣的个人案例告诉你

2011年在从网上看到一篇文章,叫做完全使用Python工作(即使今天看,文章的一些观点也比较偏激与狭隘),通过这篇文章我知道Python这门语言。在此之前我们大学学习的语言是Fortran90/95...

python操作数据库项目实例分享

本文根据一个项目实例,记录分享一下python将数据库的内容提取显示到程序界面的过程及相关设置,探索python操作数据库的用法。主要分享内容: 1、显示数据库内容。 2、修改数据库内容。 3、表格控...