使用 Python 参与算法竞赛
引言
众所周知,打算法竞赛最频繁使用的语言是 C++。然而,对于那些不卡复杂度的题目,可以考虑使用 Python 编写(因为 Python 真的好写)。
本文将简单地介绍一些 Python 使用技巧和语法糖。
一些技巧
框架
初学 Python 时,由于 Python 著名的交互性,大家可能会直接逐行编写 Python 语句。然而,这样便于代码逻辑组织和函数的编写。如同 C++ 中的 int main() { ... } 一样,Python 中也可以构建类似的程序框架。
def foo():
print("Hello")
def main():
foo()
if __name__ == '__main__':
main()
最后一句的意义为:
- 当执行本文件时,正常运行
main()函数; - 当从外部调用文件时,可以导入本文件中编写的函数,而不执行
main()函数。
这样,保证了编写的代码既可以执行,又可以外部调用。
全局变量
Python 中的全局变量需要在函数中用 global 命令声明后才能进行修改,例子如下。
x = 0
def foo():
x += 10
def bar():
global x
x += 10
def main():
foo()
bar()
调用 foo() 会抛出 UnboundLocalError: local variable 'x' referenced before assignment。
具体原因参看 Python中的global关键字,你了解吗
重定向输入输出
如同 C++ 中的 freopen() 函数,Python 中也有将标准 I/O 重定向到文件的命令。
import sys
sys.stdin = open(r'hack.txt', 'r')
sys.stdout = open(r'hack.out', 'w')
这样就可以把样例放到 hack.txt 中,输出到 hack.out 中了。
_debug_
Python 中有一个内置常量 __debug__,其默认值为 True。当编译命令中开启 -O 时,其值为 False。
我用这个技巧来替代 C++ 中的 #if(n)def ... #else ... #endif 语句(不同于 C/C++,Python 没有预编译过程,故也没有完全对应的命令)。
默认 OJ 是不会开启 -O 命令的(不过还是在提交前查看 OJ 对应的语言编译命令说明为好),所以我们可以定义一个常量
LOCAL = not __debug__ # True if compile option '-O'
这样我们在本地运行开启 -O 命令之后,就可以使用
if LOCAL:
print("Hello")
来指定本地编写时执行但 OJ 不执行的命令。
例如将上一节的重定向可以加上这句,就不用担心由于忘记注释掉重定向而收获一发 RE 了
断言
Python 的断言关键字与 C++ 相同,都是 assert;在抛出 AssertionError 时可以指定报错信息。例子如下:
a, b = 1, 2
assert a == b, f'{a} != {b}'
终端会抛出 AssertionError: 1 != 2
随机数生成器与对拍
随机数生成
例如生成 A+B problem 的随机数据。生成的数据直接输出到 hack.txt 中。
import sys
from random import *
# seed(12345)
sys.stdout = open(r'hack.txt', 'w')
n = int(1e3)
print(n)
for i in range(n):
a = randint(-1e9, 1e9)
b = randint(-1e9, 1e9)
print(a, b)
对拍
检验两个程序是否有相同输出,构造样例和 debug 时常用。
不一定是两个
*.exe,只要是有输入输出的东西都可以拍。
from os import system
while True:
system("python3 randgen.py")
system("true.exe < ../hack.txt > true.txt")
system("false.exe < ../hack.txt > false.txt")
if system("fc true.txt false.txt"):
system("pause")
更进阶的用法,考虑使用 洛谷推出的对拍工具 CYaRon,使用 pip 直接安装即可。
代码运行计时
使用标准库中的 time 模块
import time
if __name__ == '__main__':
T1 = time.time()
main()
T2 = time.time()
print("Runtime: %.3f s." % (T2 - T1), file=sys.stderr)
print() 的 kwg 中指定 file=sys.stderr 使得运行时间在终端输出。这样当重定向输入输出时,该语句不受影响。
不过通常来讲,选择使用 Python 编写时,基本都是对运行时间要求不高的题目。
模板
贴上自用的 Python 模板
#!/usr/bin/python3
import sys
import os
import time
from functools import reduce
from math import *
LOCAL = not __debug__ # True if compile option '-O'
def main():
pass
if __name__ == "__main__":
T1 = time.time()
if LOCAL:
sys.stdin = open(r"hack.txt", "r")
sys.stdout = open(r"hack.out", "w")
t = int(input()) # 1
for i in range(t):
print(f"Case #{i+1}:", end=' ')
main()
T2 = time.time()
print("Runtime: %.3f s." % (T2 - T1), file=sys.stderr)
我的赛前模板仓库
git clone git@github.com:RivTian/Python-Content.git
参考
- Python 3 官方文档 - 中文 https://docs.python.org/zh-cn/3/
- Python 中的 global 关键字,你了解吗?https://zhuanlan.zhihu.com/p/111284408
使用 Python 参与算法竞赛的更多相关文章
- 如何使用Python在Kaggle竞赛中成为Top15
如何使用Python在Kaggle竞赛中成为Top15 Kaggle比赛是一个学习数据科学和投资时间的非常的方式,我自己通过Kaggle学习到了很多数据科学的概念和思想,在我学习编程之后的几个月就开始 ...
- 浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
- Hihocoder 太阁最新面经算法竞赛18
Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...
- hihoCoder太阁最新面经算法竞赛15
hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...
- Python基础算法综合:加减乘除四则运算方法
#!usr/bin/env python# -*- coding:utf-8 -*-#python的算法加减乘除用符号:+,-,*,/来表示#以下全是python2.x写法,3.x以上请在python ...
- (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO
http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...
- xsank的快餐 » Python simhash算法解决字符串相似问题
xsank的快餐 » Python simhash算法解决字符串相似问题 Python simhash算法解决字符串相似问题
- [刷题]算法竞赛入门经典 3-12/UVa11809
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...
- [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-10/UVa1587:Box 代码: //UVa1587 - Box #include&l ...
- [刷题]算法竞赛入门经典 3-7/UVa1368 3-8/UVa202 3-9/UVa10340
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 都是<算法竞赛入门经典(第二版)>的题目,标题上没写(第二版) 题目:算法竞赛入门经典 3-7/UVa13 ...
随机推荐
- odoo17.0 快递鸟模块
快递鸟是国内使用较为广泛的快递集成查询平台之一,提供了600+的物流公司对接接口,是比较不错的物流查询服务选择.随着odoo17.0的发布,我们最近也将快递鸟模块升级到了17.0.下面我们来详细看一下 ...
- 如何实现图像搜索,文搜图,图搜图,CLIP+faiss向量数据库实现图像高效搜索
如何实现图像搜索,文搜图,图搜图,CLIP+faiss向量数据库实现图像高效搜索 这是AIGC的时代,各种GPT大模型生成文本,还有多模态图文并茂大模型, 以及stable diffusion和sta ...
- 向“创新者”升阶,程序员当下如何应对 AI 的挑战
随着 AI 技术的飞速发展,特别是大模型的出现,传统的程序员角色正在经历深刻的变革,我们不得不重新对自己进行审视和思考. 通用领域大模型的"泛化能力" 在过去的二十年内,AI 领域 ...
- Python 潮流周刊第 32 期(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 解密数据可视化软件、BI软件和数字孪生软件的不同
在现代企业和科技领域,数据起着至关重要的作用.为了更好地管理和理解数据,不同类型的软件工具应运而生,其中包括数据可视化软件.BI(Business Intelligence)软件和数字孪生软件.虽然它 ...
- 【Python】【OpenCV】凸轮廓和Douglas-Peucker算法
针对遇到的各种复杂形状的主体,大多情况下,我们可以求得一个近似的多边形来简化视觉图像处理,因为多边形是由直线组成的,这样就可以准确的划分区域来便捷后续的操作. cv2.arcLength() Meth ...
- Python——第五章:Traceback模块
traceback 模块提供了在程序中处理和分析异常时的工具,帮助开发人员更好地理解程序出现问题的原因. 使用 traceback.format_exc() 函数可以获取当前异常的堆栈信息.可以把错误 ...
- MyBatis 源码解析
本文源码解析针对的是 MyBatis 3.4.4 MyBatis 执行流程 第一阶段 MyBatis 在这个阶段获得 Mapper 的动态代理对象,具体逻辑如下图所示: 其中,Configuratio ...
- CSS3学习笔记引言
开始我们要来介绍css: CSS(全称为Cascading Style Sheets)是一种用于描述HTML.XML等文档样式的样式语言,它能够定义元素的显示方式,如字体.颜色.布局等. CSS可以把 ...
- Spring表达式语言(SPEL)学习(02)
构造数组 /** * 数组生成 */ @Test public void test5(){ int[] numbers1 = (int[]) parser.parseExpression(" ...