引言

众所周知,打算法竞赛最频繁使用的语言是 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

参考

  1. Python 3 官方文档 - 中文 https://docs.python.org/zh-cn/3/
  2. Python 中的 global 关键字,你了解吗?https://zhuanlan.zhihu.com/p/111284408

使用 Python 参与算法竞赛的更多相关文章

  1. 如何使用Python在Kaggle竞赛中成为Top15

    如何使用Python在Kaggle竞赛中成为Top15 Kaggle比赛是一个学习数据科学和投资时间的非常的方式,我自己通过Kaggle学习到了很多数据科学的概念和思想,在我学习编程之后的几个月就开始 ...

  2. 浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

  3. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  4. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  5. Python基础算法综合:加减乘除四则运算方法

    #!usr/bin/env python# -*- coding:utf-8 -*-#python的算法加减乘除用符号:+,-,*,/来表示#以下全是python2.x写法,3.x以上请在python ...

  6. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  7. xsank的快餐 » Python simhash算法解决字符串相似问题

    xsank的快餐 » Python simhash算法解决字符串相似问题 Python simhash算法解决字符串相似问题

  8. [刷题]算法竞赛入门经典 3-12/UVa11809

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...

  9. [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-10/UVa1587:Box 代码: //UVa1587 - Box #include&l ...

  10. [刷题]算法竞赛入门经典 3-7/UVa1368 3-8/UVa202 3-9/UVa10340

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 都是<算法竞赛入门经典(第二版)>的题目,标题上没写(第二版) 题目:算法竞赛入门经典 3-7/UVa13 ...

随机推荐

  1. [PostgreSQL]在group by查询下拼接列字符串

    首先创建group_concat聚集函数: CREATE AGGREGATE group_concat(anyelement) ( sfunc = array_append, -- 每行的操作函数,将 ...

  2. MySQL的索引为什么使用B+树而不使用跳表?

    目录 MySQL的索引为什么使用B+树而不使用跳表? 1.B+树的结构 2.跳表的结构 3.B+树和跳表的区别 1.B+树新增数据会怎么样 跳表新增数据 4.Mysql的索引为什么使用B+树而不使用跳 ...

  3. 浏览器跨 Tab 窗口通信原理及应用实践

    最近,相信大家一定被这么个动效给刷屏了: 以至于,基于这个效果的二次创作层出不穷,眼花缭乱. 基于跨窗口通信的弹弹球: 基于跨窗口通信的 Flippy Bird: 我也尝试制作了一个跨 Tab 窗口的 ...

  4. 实例讲解Python 解析JSON实现主机管理

    本文分享自华为云社区<Python 解析JSON实现主机管理>,作者: LyShark. JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以易 ...

  5. 2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(可能为 0)。 每一步「操作」中,你可以分别从 arr1 和 arr2

    2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(可能为 0). 每一步「操作」中,你可以分别从 arr1 和 arr2 ...

  6. TCP连接断开:为什么要挥手四次

    本文分享自华为云社区<解密TCP连接断开:四次挥手的奥秘和数据传输的安全>,作者: 努力的小雨 . TCP 连接断开 在当今数字化时代,互联网已经成为了人们生活中不可或缺的一部分.而在互联 ...

  7. 浅谈 Socket.D 与响应式编程

    一.Socket.D 的主要特性 首先,Scoket.D 是高效一个二进制的网络通讯协议(官方我讲法是:基于事件和语义消息流的网络应用协议),能够满足很多场景下使用.其次,Scoket.D 是温和的响 ...

  8. 算法2:Hanoi塔

    汉诺(Hanoi)塔 一.背景介绍 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了 ...

  9. MES系统怎么实现车间管理中的生产计划和排产计划

    生产计划和排产计划都是制造企业中非常重要的概念,它们的目的是为了确保企业能够按时交付高质量的产品,同时还要保持生产效率和成本效益. 一.生产计划 生产计划是指制造企业为了满足客户需求而制定的计划,它包 ...

  10. 2023年最后一个工作日,当 hr总监找上我协商赔偿

    今天是2023年最后一个工作日,hr 总监找上我协商赔偿一事,忆往昔三年前,公司刚融资1个亿,意气风发,博主入职即为公司巅峰,高级开发岗,14薪,各种福利,加班另算加班费,业务主要服务于众多500强集 ...