网站首页 > 技术文章 正文

1 — 带循环的 else 条件语句
可以将 else 语句与 for/while-loop 一起使用,以便在循环终止时执行代码,而不管是否执行了循环。查看代码:
items = [1, 2]
for item in items:
print(item)
else: # if no break is found
print("No Break")
Else 块将在循环完全完成时执行。
例如,假设需要在列表中搜索某些内容并处理每个项目,直到找到条件。
items = [1, 2]
for item in items:
if item % 2 == 0:
break
do_something(item)
else:
do_another_something()
如果找到条件,则需要使用 break 语句来中断循环并直接转到 else 块。
相同的语句对 while-loop 有效:
while False:
...
else:
print("No Break")
使用此功能有点令人困惑。我从未见过有人在项目中使用它,而且它可能不经常使用。
2 — 在 pytest 中参数化测试函数
parametrize 是一个 Pytest 标记装饰器,用于使用不同的参数集多次执行相同的测试函数。请参阅示例:
import pytest
params = [
(1, 2, 3),
(2, 4, 6),
pytest.param(6, 9, 16, marks=pytest.mark.xfail)
]
@pytest.mark.parametrize("p1, p2, ,expected", params)
def test_func(p1, p2, expected):
assert p1 + p2 == expected
第三组参数使用 xfail 标记来定义 failure 参数。我鼓励您阅读有关 mark test 函数的更多信息。
3 — 使用嵌套循环的列表推导式
要了解嵌套循环在列表推导式中的工作原理,请参阅以下代码:
letters = ["a", "b", "c"]
numbers = [1, 2]
for letter in letters:
for number in numbers:
print(f"{letter}{number}")
>> ['a1', 'a2', 'b1', 'b2', 'c1', 'c2']
同样的行为可以用 comprehension 来执行:
letters = ["a", "b", "c"]
numbers = [1, 2]
combined_items = [l+str(n) for l in letters for n in numbers]
combined_items
>> ['a1', 'a2', 'b1', 'b2', 'c1', 'c2']
理解是一种避免嵌套循环在单行代码中组合多个 for 循环的方法。
4 — 使用 tqdm 在循环上迭代
tqdm 是一个 Python 库,它提供了一种向循环添加进度条的简单方法。建议用于长时间运行的进程,以向用户显示有关进度状态的视觉提示。
from tqdm import tqdm
paths = os.walk('/')
for fpath in tqdm(paths, desc="Looping over root dir"):
...
desc 参数可用于设置循环的描述。
5— 泛型函数
泛型函数是一种机制,它允许函数使用多种类型来操作相同的行为,以维护它们之间的关系,例如参数、名称和返回值。请参阅以下示例:
import functools
@functools.singledispatch
def process_data(data):
print("Generic processing:", data)
@process_data.register(int)
def _(data):
print("Processing integer data:", data)
@process_data.register(list)
def _(data):
print("Processing list data:", data)
process_data("Hello") # Generic processing: Hello
process_data(42) # Processing integer data: 42
process_data([1, 2, 3]) # Processing list data: [1, 2, 3]
另一方面,你可以使用定义类型提示的泛型函数,例如:
import functools
@functools.singledispatch
def process_data(address):
raise TypeError('Wrong address format!')
@process_data.register
def _(address: str):
ip, port = address.split(':')
print(f'IP:{ip}, Port:{port}')
@process_data.register
def _(address: tuple):
ip, port = address
print(f'IP:{ip}, Port:{port}')
process_data('johni.medium.com:443') # johni.medium.com, Port:443
process_data(('johni.medium.com', 443)) # johni.medium.com, Port:443
process_data(2077) # TypeError: Wrong address format!
类型提示方法听起来更优雅、可读性更强。
6 — 使用 PyPi 测试存储库
PyPi Test 是用于测试目的的 PyPi 存储库版本。它可用于练习和学习如何在发布包之前将其发布到 Python 生态系统。
- 官方主办方
- 使用 TestPyPI
PyPi Test 具有独立于 PyPi 存储库的数据库,您需要创建一个单独的用户帐户来发布您的软件包。
7 - 使用上下文管理器
上下文管理器是一种管理资源的方法。您可以在不再需要资源时自动设置和关闭资源。
要使用上下文管理器,您需要创建一个具有两个特殊方法的类:当输入代码块并用于返回资源实例时调用 __enter__(),以及当退出代码块时调用 __exit__()。
class MyContextManager:
def __enter__(self):
resource = object()
return resource
def __exit__(self, exe_type, exe_value, traceback):
# clearn up the resource
...
# using the context manager
with MyContextManager() as cx:
print(cx)
要将上下文管理器与生成器一起使用,您需要定义一个函数并使用 yield 语句返回实例。退出代码块时,将执行 yield 语句后面的代码。
@contextmanager
def my_context_manager():
resource = object()
try:
yield resource
finally:
# clean up the resource
...
with my_context_manager() as cx:
print(cx)
上下文管理器是一种管理代码中资源的特殊方法,例如文件处理、网络连接和数据库连接。
8 — 定时
计时是一种测量一段代码执行时间的方法。它对于快速检查部分代码的性能非常有用。
time它是一个内置的 Python 模块,它提供了一种简单的方法来运行一段代码来获取执行时间。让我们检查一个使用三引号的示例:
import timeit
setup = """
import random
import string
"""
stmt = """
def get_random_token(n_lenght: int) -> str:
chars = string.ascii_uppercase + string.digits
token = ''.join(random.choice(chars) for _ in range(n_lenght))
return token
get_random_token(100)
"""
times = timeit.repeat(stmt=stmt, setup=setup, repeat=2, number=1000)
print(times)
您还可以在命令行 python-m timeit --n [number] -s [setup] [stmt] 中使用 timeit
9— 海象操作员
从 Python 3.8 开始,您可以使用称为 walrus 运算符 (:=) 的特殊赋值表达式。此 sintaxe 允许您为 expression 中的变量赋值并使用它。请参阅以下示例:
while (value := input('Type something: ')) != 'exit':
print(value)
entries = [
{
"name": "Lisa",
},
{
"name": "",
},
]
for entry in entries:
if name := entry.get("name"):
print(f'Found name: "{name}"')
numbers = [1,2,4,5,6,6,89]
if (length := len(numbers)) >= 5:
print("The length of the list is:",length)
使用 walrus 运算符不一定能提高代码的可读性或效率,在某些情况下,最好以传统方式编写代码。
10 – 使用入口点
入口点是程序执行开始的显式函数。它在 Java 和 CSharp 等语言中很常见。
在 Python 中,不需要使用入口点函数,但建议您使用它来使您的代码更具可读性和直观性。
def main() -> None:
... # do something
if __name__ == '__main__':
main()
这是一个在 Python 项目中使用的有趣入口点函数
猜你喜欢
- 2024-12-13 Python数据类型字符串的几种表示形式
- 2024-12-13 python 基础语法详解(入门必读)
- 2024-12-13 轻松掌握!Python 基本语法与核心数据类型全解析
- 2024-12-13 Python注释方式有哪些
- 2024-12-13 Word 神器 python-docx
- 2024-12-13 万字干货,Python语法大合集,一篇文章带你入门
- 2024-12-13 Python之open()函数
- 2024-12-13 编程语言python:数据类型
- 2024-12-13 Python基础语法到高级概念
- 2024-12-13 Python字符串单引号('...')和双引号("...")的区别
- 06-24Python调用Docker API的使用方式(pycharm docker 调试)
- 06-24青少年Python编程系列28:Python中函数的递归调用
- 06-24python调用sqlite数据库案例(python 调用数据库)
- 06-24【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 06-24通过pybind11来实现python调用C++接口(一)
- 06-24Python编程调用Deepseek API创建智能体
- 06-24python多装饰器针对函数、类、方法的调用顺序说明
- 06-24Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- 270℃Python短文,Python中的嵌套条件语句(六)
- 268℃python笔记:for循环嵌套。end=""的作用,图形打印
- 266℃PythonNet:实现Python与.Net代码相互调用!
- 262℃Python实现字符串小写转大写并写入文件
- 261℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 121℃原来2025是完美的平方年,一起探索六种平方的算吧
- 102℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 96℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
-
- Python调用Docker API的使用方式(pycharm docker 调试)
- 青少年Python编程系列28:Python中函数的递归调用
- python调用sqlite数据库案例(python 调用数据库)
- 【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 通过pybind11来实现python调用C++接口(一)
- Python编程调用Deepseek API创建智能体
- python多装饰器针对函数、类、方法的调用顺序说明
- Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- Python | Django 外部脚本调用 models 数据库
- 自学Python第九天——操作列表(python操作步骤)
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)