代码优雅之道(如何用LATEX优雅的打出代码)

本文目录
如何用LATEX优雅的打出代码
python
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pythonhighlight}[2011/09/19
python code highlighting; provided by Olivier Verdier
《olivier.verdier@gmail.com》]
\RequirePackage{listings}
\RequirePackage{xcolor}
\renewcommand*{\lstlistlistingname}{Code Listings}
\renewcommand*{\lstlistingname}{Code Listing}
\definecolor{gray}{gray}{0.5}
\colorlet{commentcolour}{green!50!black}
\colorlet{stringcolour}{red!60!black}
\colorlet{keywordcolour}{magenta!90!black}
\colorlet{exceptioncolour}{yellow!50!red}
\colorlet{commandcolour}{blue!60!black}
\colorlet{numpycolour}{blue!60!green}
\colorlet{literatecolour}{magenta!90!black}
\colorlet{promptcolour}{green!50!black}
\colorlet{specmethodcolour}{violet}
\newcommand*{\framemargin}{3ex}
\newcommand*{\literatecolour}{\textcolor{literatecolour}}
\newcommand*{\pythonprompt}{\textcolor{promptcolour}{{》}{》}{》}}}
\lstdefinestyle{mypython}{
%\lstset{
%keepspaces=true,
language=python,
showtabs=true,
tab=,
tabsize=2,
basicstyle=\ttfamily\footnotesize,%\setstretch{.5},
stringstyle=\color{stringcolour},
showstringspaces=false,
alsoletter={1234567890},
otherkeywords={\%, \}, \{, \&, \|},
keywordstyle=\color{keywordcolour}\bfseries,
emph={and,break,class,continue,def,yield,del,elif ,else,%
except,exec,finally,for,from,global,if,import,in,%
lambda,not,or,pass,print,raise,return,try,while,assert,with},
emphstyle=\color{blue}\bfseries,
emph={True, False, None},
emphstyle=\color{keywordcolour},
emph={object,type,isinstance,copy,deepcopy,zip,enumerate,reversed,list,len,dict,tuple,xrange,append,execfile,real,imag,reduce,str,repr},
emphstyle=\color{commandcolour},
emph={Exception,NameError,IndexError,SyntaxError,TypeError,ValueError,OverflowError,ZeroDivisionError},
emphstyle=\color{exceptioncolour}\bfseries,
%upquote=true,
morecomment={"""}{"""},
commentstyle=\color{commentcolour}\slshape,
%emph={1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
emph={ode,
fsolve, sqrt, exp, sin, cos,arctan, arctan2, arccos, pi, array, norm,
solve, dot, arange, , isscalar, max, sum, flatten, shape, reshape, find,
any, all, abs, plot, linspace, legend, quad, polyval,polyfit, hstack,
concatenate,vstack,column_stack,empty,zeros,ones,rand,vander,grid,pcolor,eig,eigs,eigvals,svd,qr,tan,det,logspace,roll,min,mean,cumsum,cumprod,diff,vectorize,lstsq,cla,eye,xlabel,ylabel,squeeze},
emphstyle=\color{numpycolour},
emph={__init__,__add__,__mul__,__div__,__sub__,__call__,__getitem__,__setitem__,__eq__,__ne__,__nonzero__,__rmul__,__radd__,__repr__,__str__,__get__,__truediv__,__pow__,__name__,__future__,__all__},
emphstyle=\color{specmethodcolour},
emph={assert,yield},
emphstyle=\color{keywordcolour}\bfseries,
emph={range},
emphstyle={\color{keywordcolour}\bfseries},
% emph={self},
% emphstyle=\bfseries,
literate=*%
{:}{{\literatecolour:}}{1}%
{=}{{\literatecolour=}}{1}%
{-}{{\literatecolour-}}{1}%
{+}{{\literatecolour+}}{1}%
{*}{{\literatecolour*}}{1}%
{**}{{\literatecolour{**}}}2%
{/}{{\literatecolour/}}{1}%
{//}{{\literatecolour{//}}}2%
{!}{{\literatecolour!}}{1}%
%{(}{{\literatecolour(}}{1}%
%{)}{{\literatecolour)}}{1}%
{[}{{\literatecolour[}}{1}%
{]}{{\literatecolour]}}{1}%
{《}{{\literatecolour《}}{1}%
{》}{{\literatecolour》}}{1}%
{》》》}{\pythonprompt}{3}%
代码的味道
在讨论具体的实施细则之前,我们不妨讨论一下什么是好代码?萝卜特(Martin)大叔认为:衡量代码质量的唯一标准是:WTF/min,也就是review代码的时候每分钟说“握草”的次数。这个定义虽有辱斯文,但粗野中不失调皮,调皮中又蕴含哲理。
好的代码如同文笔优美的散文,行云流水,赏心悦目,阅读的时候,如沐春风,带给人愉悦与启迪。
好的代码犹如构思精巧的小说,它或许不够平铺直述,但足够引人入胜,读到最后,你会豁然开朗,“卧槽,原来是这样的啊!”那一刻,你会觉得过程中的曲折和 探索 都是值得的。
好的代码,透过一个个函数,你仿佛可以窥视到作者有趣的灵魂,透过一行行代码,你仿佛在与一个充满智慧的朋友聊天,她总是思路清晰,逻辑严谨,有条不紊,娓娓道来。
而坏的代码,就像一个泥团,或者像一摊垃圾,阅读的时候,你仿佛被困于黑暗的迷宫,又仿佛在跟一个絮絮叨叨的人交谈,她的脑回路经常短路,说话含混不清,主次不分,叨逼半天,你依然get不到她的中心思想,你感觉智商受到了莫大的侮辱,甚至感觉像被人喂吃shit,你面露艰难神色,心中万马奔腾。
有很多区分好代码坏代码的规则,网上的文章也很多,我也看过一些,对于文章中提到的一些守则,就不重复嚼舌头根子了,我想结合自己的工作经历,谈一谈自己的体会。
闲扯了半天,言归正传,要编写弥漫好味道的代码,要遵循哪些约束和指引呢?
一致性
持之以恒的遵从一致性规则,在代码风格上,争论个三天三夜估计也定不出个好坏出来,但好的风格一定是强一致性的,这一点应该比较容易达成一致。风格的好坏其实更多受习惯的影响,年长一点的程序员应该都有自己风格变迁的经历,多年前自己笃信不疑的good style或许正是当前深恶痛绝的bad style,所以我主张在style上搁置嘴炮,一个项目应该有一个编码规则,好的规则应该是以理服人的,好的规则应该是拒绝任性夹带私货的,规则定了之后,就遵照执行吧,可能某个风格跟你不相符,但你要知道,这并不意味,你在style之战败下阵来,也并不表示它说服了你,你遵守的是规则和纪律本身。
我经历过一些c的项目,函数命名有大驼峰,有小驼峰,有下划线连词,还有驼峰夹下划线(有些是两个),还有函数名下划线或者两个下划线开头,总结一下它的规律就是没有规律,非常随心所欲,令我莫衷一是。
变量(包括文件、类/结构体、函数)命名,比如ohmygod,你可能搞不清哪些字母是一伙的,所以要界定单词,驼峰就是单词首字母大写来界定单词,另一个做法是用下划线拼接单词。下划线拼接的坏处是增加了标识符长度(相比首字母大写),好处是跟std c/c++、linux kernel的做法一致,喜欢kernel的码农容易找到如家般的归属感。
因为c++有namespace,所以c经常用prefix防止命名污染全局空间避免冲突,但我认为命名简洁短小很重要,所以我支持简短的前缀反对冗长的前缀。
代码密度
实现同样的功能,你喜欢100行代码,还是20行代码?如果贵司不以代码行数考核绩效我建议你把代码写的精简,而如果贵司以代码行数考核绩效,我建议你离职,开滴滴,或者送外卖都行,因为在这种公司耗费青春不会有什么发展前景。
把简单的东西搞复杂化很容易,你只需要找一个能力平庸的人就能实现化简为繁的愿望,而化繁为简则堪称化腐朽为神奇。也许你要说,我欠缺简化的能力,这个不奇怪,坦白讲,这不是一件容易的事,你做不到没关系,但你拥有正确的理念更重要,它将帮助你认清未来的方向,而不是在错误的道路上越走越远。
有些项目,充斥各种无效代码,其实你只需要稍加思考,你就能识别出来,比如本不需要返回值的函数,执拗的固定返回true,然后在调用的地方还要装模作样的check一下返回值,如果返回false,再记一条日志,再assert一下,再抛个异常,这样显得自己很有职业操守,美其名曰面向failed编程,处理了各种异常情况;又或者函数一进来,不管三七二十一,对入参一顿无脑检查,宣称这是符合ISO SB标准的安全做法,全然忘记你在编写的是一个私有实现函数,你在调用它之前已经检查过一遍,私有函数是一个受控的安全上下文,这不仅不优雅而且不绿色(低效耗电),并且不安全(在该崩的时候没崩把雷埋到了更隐蔽的地方)。
提高代码密度或者说代码浓度有利于信息展现,有利于突出重点,有利于提高维护性,而充斥各种无效语句的代码只会把关键语句淹没在汪洋大海,使得review代码的人get不到重点,看不清主次。像听一个絮絮叨叨的人做报告,满篇废话,像看一个剧情拖沓的连续剧,昏昏欲睡,像喝一杯被十倍稀释的二锅头,口能淡出个鸟来。
重构是程序员的口头禅,重构是在保持程序功能不变的情况下调整架构和实现,提升程序可读性可维护性可扩展性,我认为提高代码密度应该作为重构的一项追求。
linux kernel、lua、nginx、skynet这些优秀的开源库代码浓度都很高,建议读者朋友体验一下。
封装和解耦
构建松散耦合的系统一直是软件工程的一个目标,模块化的一个方向便是解耦,但我们口口声称心心念想的解耦,在实施层面又有几分体现呢?
比如,我们经常干的一件蠢事就是把类似配置文件,或者宏定义的东西集中的一个头文件里去,看起来很统一也很正规,起码我之前也是这样认为的,但忽然有一天,发现自己这样做显得很不聪明的样子,为什么呢?因为你想想把所有模块配置相关的东西都塞进配置公共文件真的合适吗?是不是把公共接口抽离出来更好,把配置相关的数据下沉到各模块更合适?
另外,把宏都定义到一起,这意味随便改点东西,都会需要修改宏头文件,而这个头文件就会成为程序世界的中心,修改公共宏文件几乎会引起整个系统的所有源文件rebuild,这简直就是AOE团灭啊。所以更好的方式是分而治之,去集中式。
我们知道c/c++的编译单元是source file(.c/.cpp)文件,编译的第一步是预处理,所有include都会展开替换,所以我们要避免引入任何不必要的头文件,也应该把本编译单元用到的头文件都include进来,这就是所谓的头文件自给自足。这点很重要,但很多人会不以为然,甚至有些人会自作聪明的搞一个allincluded.h,把常用的一些头文件全部include进来,然后沾沾自喜的自认为一劳永逸的完美的解决了问题,包含不必要的头文件会增加编译时间,会增加依赖,我们不仅应该避免错误的包含,还应该精心设计和划分文件,使得每个文件的功能足够内聚单一。
累了,意欲未尽,改日再喷!
dnf第八章技能代码
刀魂之卡斯:20010
邪光斩:20019
银光落刃:20016
捉头前豹:20017
列波斩:20022
鬼斩:20023
十字斩:20028
双刀厉鬼:20029
光球:20032
出血捉头:20049
小奔山:20050
念气波:21002
抛沙:21004
金刚碎:21031
银弹:42006
爆炎蛋:22213
冰冻蛋:42003
反坦克炮:22218
魔法星蛋:23007
杰克诈蛋:23008
冰霜雪人:23009
电光曼:23010
黑猫:23011
改良魔法星dan:23043
暴炎加热炉:23056
魔道酸雨云:23044
虎袭:24031
意念:24002
恶魔之手:24003
破魔符:24009
盗贼的
1级学的手里剑:25001
5级学的黑球:25003
16进制(选择数值):
魔法师 - 稻草人=01C70897
魔法师 - 冰霜雪人=01EE49B7
魔法师 - 电光曼=01BFF261
魔法师 - 火炎冲击=01A75856
魔法师 - 黑洞=01EBA7DF
魔法师 - 黄龙=01AAE055
魔法师 - 改良魔法星dan=01AA91BB
格斗家 - 背摔=01C1D0E5
格斗家 - 抛沙=01BD6C1F
格斗家 - 念气环绕=01B6A977
格斗家 - 寸拳=01EAC8F0
格斗家 - 念气罩1=0042189A
格斗家 - 抓轰炮=01C18015
格斗家 - 蜘蛛网=01B4C630
格斗家 - 毒雾=00B66922
格斗家 - 毒雷柱=007DA63A
格斗家 - 街头风bao=01D43D31
格斗家 - 电光龙头=01E7A759
鬼剑士 - 波动剑=0062CD5C
鬼剑士 - 怒气爆发=0062CE30
鬼剑士 - 墓碑=0087EC8E
鬼剑士 - 银光落刃=007B2EEA
鬼剑士 - 抓头=007AFCD9
鬼剑士 - 小邪光斩=008418AC
鬼剑士 - 虚电球=01BA4B3D
鬼剑士 - 裂波斩=0062D144
鬼剑士 - 火波=029BB154
鬼剑士 - 锁人球=007ADEFE
鬼剑士 - 十字斩=007AE4DD
鬼剑士 - 里鬼双刀=007A5ECC
鬼剑士 - 地光阵=007B032A
鬼剑士 - 光球定珠=007B0872
鬼剑士 - 幻影剑舞第五刀=007AEF6E
鬼剑士 - 不动明王的球=007AD78F
鬼剑士 - 格挡气球=007ACC62
鬼剑士 - 大崩山=007AE7C2
鬼剑士 - 大崩山火山浮空=006620E0
鬼剑士 - 卡洛灼烧=0066196D
鬼剑士 - 小黑暴诈定珠bao=0061633E
鬼剑士 - 小崩山=007AEC57
鬼剑士 - 狂战觉醒=0062D708
鬼剑士 - 鬼泣觉醒=0062FD8E
鬼剑士 - 修落翅膀=007A6478
鬼剑士 - 修罗觉醒轮子=007AC88C
神枪手 - 蓄电激光=018E8CFD
神枪手 - 踏射=005FAEB3
神枪手 - 地狱烈火1=0062E2AB
神枪手 - bao炎弹=00691CF1
神枪手 - Ez8自爆=009E5B85
神枪手 - 空中战机的导dan=008176EE
神枪手 - 空中战机=0081623C
神枪手 - 冰冻弹=00691A07
神枪手 - 银弹=0060FF82
圣职者 - 落凤锤=0062FDD1
圣职者 - 意念=0077C4EA
圣职者 - 移动墙=00C290C8
圣职者 - 白虎的球=006BFE00
盗贼的自己找
16进制(修改值):
冰刺:8022
全屏爆(秒友):8362
地火:20044
这个无名:8462
念气波(群体):8485
天雷(秒无敌):8498
鱼刺:8654
轮子:20057
风暴:21017
黑洞:23025
岩浆爆:30495
冰秒:30554
全秒:88543
全秒2:860143
爆炎:860330
分针:860622
气空炮:860816
*石化:899987
*睡觉:899988
*混乱100%:899989
*冰冻100%:899993
(红眼专用)蹦山秒杀:22218地火2004
8580:爆zha99999伤害小范围
8568:爆zha 4000 伤害
8586 :4秒爆炸机器人 99999伤害 天界boss 技能
23028:13922伤害
23031:10802伤害
30513:天惟深渊 boss 水泡
860466:全屏
860204:大爆zha
860084:龙卷风
30567:万剑
860622:天刺
30567:万剑
22206:量子
860593:喷毒
.版本 2
显示鼠标 (1)
进程ID = 取窗口进程ID (窗口1.取窗口句柄 ())
内存.提升权限 ()
内存.打开进程 (进程ID)
无敌开 = 热键.注册 (窗口1.取窗口句柄 (), 0, #F7键, &无敌)
两倍攻击 = 热键.注册 (窗口1.取窗口句柄 (), 0, #F8键, &两倍攻击)
卖 = 热键.注册 (窗口1.取窗口句柄 (), 0, #Ins键, &卖)
修 = 热键.注册 (窗口1.取窗口句柄 (), 0, #Del键, &修)
sss = 热键.注册 (窗口1.取窗口句柄 (), 0, #F9键, &SSS)
技能叠加 = 热键.注册 (窗口1.取窗口句柄 (), 0, #F11键, &技能叠加)
加速 = 热键.注册 (窗口1.取窗口句柄 (), 0, #F12键, &加速)
无CD = 热键.注册 (窗口1.取窗口句柄 (), 0, #Home键, &无CD)
判断.时钟周期 = 500
职业.加入项目 (“小人物:鬼剑士”, )
职业.加入项目 (“小人物:神枪手”, )
职业.加入项目 (“小人物:法师”, )
职业.加入项目 (“小人物:格斗家”, )
职业.加入项目 (“小人物:大叔”, )
快捷键.加入项目 (“小人物:A建”, )
快捷键.加入项目 (“小人物:S建”, )
快捷键.加入项目 (“小人物:D建”, )
快捷键.加入项目 (“小人物:F建”, )
快捷键.加入项目 (“小人物:G建”, )
快捷键.加入项目 (“小人物:H建”, )
快捷键.加入项目 (“小人物:F1建”, )
快捷键.加入项目 (“小人物:F2建”, )
快捷键.加入项目 (“小人物:F3建”, )
快捷键.加入项目 (“小人物:F4建”, )
快捷键.加入项目 (“小人物:F5建”, )
快捷键.加入项目 (“小人物:F6建”, )
.子程序 无CD
内存操作.写代码 (“10CF69C+2FC4+8+0+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+4+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+8+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+C+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+10+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+14+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+360+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+364+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+368+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+36C+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+370+214=0”)
内存操作.写代码 (“10CF69C+2FC4+8+374+214=0”)
内存操作.写代码 (“010CF69C+2FC4+8+0+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+0+388”))) ’ A键
内存操作.写代码 (“010CF69C+2FC4+8+4+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+4+388”))) ’ S键
内存操作.写代码 (“010CF69C+2FC4+8+8+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+8+388”))) ’ D键
内存操作.写代码 (“010CF69C+2FC4+8+C+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+C+388”))) ’ F键
内存操作.写代码 (“010CF69C+2FC4+8+10+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+10+388”))) ’ g
内存操作.写代码 (“010CF69C+2FC4+8+14+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+14+388”))) ’ h
内存操作.写代码 (“010CF69C+2FC4+8+360+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+360+388=4”))) ’ F1
内存操作.写代码 (“010CF69C+2FC4+8+364+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+364+388=4”))) ’ F2
内存操作.写代码 (“010CF69C+2FC4+8+368+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+368+388=4”))) ’ F3
内存操作.写代码 (“010CF69C+2FC4+8+36C+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+36C+388=4”))) ’ F4
内存操作.写代码 (“010CF69C+2FC4+8+370+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+370+388=4”))) ’ F5
内存操作.写代码 (“010CF69C+2FC4+8+374+204=” + 到文本 (内存操作.读代码 (“010CF69C+2FC4+8+374+388=4”))) ’ F6
自己看看

更多文章:
diverse culture课件(英语邮件范例:旅游英语怎么表达)
2026年3月2日 00:30
字符串全排列(abcdefgh由这八个字符构成的全排列字符串,要求不能出现以下子串:abc ,de,gh.求能有)
2026年3月9日 23:15
javascript 字符串转数字(如何用JavaScript对字符串进行解析并计算出结果)
2025年5月28日 03:00
如何使用u盘安装linux系统(怎么用u盘安装过linux详细步骤!)
2026年1月10日 17:45
domestic abuse only happens(帮我翻译一下这段英语 谢谢啦 ~!!!!!!!!!!!!!!!!!!!)
2026年4月17日 08:45
settimeout怎么停止(window.setTimeout 停止 取消)
2025年6月10日 15:15
word如何设置图片居中?网页中如何用HTML/CSS实现文字居中于图片
2025年6月28日 16:15
php教程视频谁的好(哪里的php视频教程不错我想自学php)
2026年5月11日 14:15
unity 命名空间(为什么unity无法将脚本添加到空的对象)
2026年1月21日 21:00
decimal在python(python字符的精度不够,用什么填充)
2026年8月13日 02:15
禁止iframe嵌套(https页面iframe嵌套http的页面,弹出警告,怎么解决)
2026年5月5日 09:45












