python.tex 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. \documentclass[]{article}
  2. \usepackage{lmodern}
  3. \usepackage{amssymb,amsmath}
  4. \usepackage{ifxetex,ifluatex}
  5. \usepackage{xeCJK}
  6. \usepackage{fixltx2e} % provides \textsubscript
  7. \ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
  8. \usepackage[T1]{fontenc}
  9. \usepackage[utf8]{inputenc}
  10. \else % if luatex or xelatex
  11. \ifxetex
  12. \usepackage{mathspec}
  13. \else
  14. \usepackage{fontspec}
  15. \fi
  16. \defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}
  17. \fi
  18. % use upquote if available, for straight quotes in verbatim environments
  19. \IfFileExists{upquote.sty}{\usepackage{upquote}}{}
  20. % use microtype if available
  21. \IfFileExists{microtype.sty}{%
  22. \usepackage[]{microtype}
  23. \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
  24. }{}
  25. \PassOptionsToPackage{hyphens}{url} % url is loaded by hyperref
  26. \usepackage[unicode=true]{hyperref}
  27. \hypersetup{
  28. pdfborder={0 0 0},
  29. breaklinks=true}
  30. \urlstyle{same} % don't use monospace font for urls
  31. \usepackage{color}
  32. \usepackage{fancyvrb}
  33. \newcommand{\VerbBar}{|}
  34. \newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
  35. \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
  36. % Add ',fontsize=\small' for more characters per line
  37. \newenvironment{Shaded}{}{}
  38. \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
  39. \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{#1}}
  40. \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
  41. \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
  42. \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
  43. \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{#1}}
  44. \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
  45. \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
  46. \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
  47. \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
  48. \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{#1}}
  49. \newcommand{\ImportTok}[1]{#1}
  50. \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{#1}}}
  51. \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{#1}}}
  52. \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
  53. \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
  54. \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{#1}}
  55. \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{#1}}
  56. \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{#1}}
  57. \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
  58. \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}}
  59. \newcommand{\BuiltInTok}[1]{#1}
  60. \newcommand{\ExtensionTok}[1]{#1}
  61. \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{#1}}
  62. \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{#1}}
  63. \newcommand{\RegionMarkerTok}[1]{#1}
  64. \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
  65. \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
  66. \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
  67. \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
  68. \newcommand{\NormalTok}[1]{#1}
  69. \IfFileExists{parskip.sty}{%
  70. \usepackage{parskip}
  71. }{% else
  72. \setlength{\parindent}{0pt}
  73. \setlength{\parskip}{6pt plus 2pt minus 1pt}
  74. }
  75. \setlength{\emergencystretch}{3em} % prevent overfull lines
  76. \providecommand{\tightlist}{%
  77. \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
  78. \setcounter{secnumdepth}{0}
  79. % Redefines (sub)paragraphs to behave more like sections
  80. \ifx\paragraph\undefined\else
  81. \let\oldparagraph\paragraph
  82. \renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
  83. \fi
  84. \ifx\subparagraph\undefined\else
  85. \let\oldsubparagraph\subparagraph
  86. \renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
  87. \fi
  88. % set default figure placement to htbp
  89. \makeatletter
  90. \def\fps@figure{htbp}
  91. \makeatother
  92. \date{}
  93. \begin{document}
  94. \section{Python 速查表中文版}\label{header-n0}
  95. \begin{itemize}
  96. \item
  97. 本手册是 \href{http://datasciencefree.com/python.pdf}{Python cheat
  98. sheet} 的中文翻译版。原作者:Arianne Colton and Sean
  99. Chen(\href{mailto:data.scientist.info@gmail.com}{\nolinkurl{data.scientist.info@gmail.com}})
  100. \item
  101. 编译:\href{https://github.com/ucasFL}{ucasFL}
  102. \end{itemize}
  103. \protect\hyperlink{header-n32}{惯例}
  104. \protect\hyperlink{header-n43}{获取帮助}
  105. \protect\hyperlink{header-n54}{模块}
  106. \protect\hyperlink{header-n69}{数值类类型}
  107. \protect\hyperlink{header-n128}{数据结构}
  108. \protect\hyperlink{header-n217}{函数}
  109. \protect\hyperlink{header-n307}{控制流}
  110. \protect\hyperlink{header-n332}{面向对象编程}
  111. \protect\hyperlink{header-n354}{常见字符串操作}
  112. \protect\hyperlink{header-n357}{异常处理}
  113. \protect\hyperlink{header-n369}{对列表、字典和元组的深入理解}
  114. \hypertarget{header-n32}{\subsection{惯例}\label{header-n32}}
  115. \begin{itemize}
  116. \item
  117. Python 对大小写敏感;
  118. \item
  119. Python 的索引从 0 开始(所有编程语言均如此);
  120. \item
  121. Python 使用空白符(制表符或空格)来缩进代码,而不是使用花括号。
  122. \end{itemize}
  123. \hypertarget{header-n43}{\subsection{获取帮助}\label{header-n43}}
  124. \begin{itemize}
  125. \item
  126. 获取主页帮助: \texttt{help()}
  127. \item
  128. 获取函数帮助: \texttt{help(str.replace)}
  129. \item
  130. 获取模块帮助: \texttt{help(re)}
  131. \end{itemize}
  132. \hypertarget{header-n54}{\subsection{模块}\label{header-n54}}
  133. 模块亦称库,它只是一个简单地以 \texttt{.py} 为后缀的文件。
  134. \begin{itemize}
  135. \item
  136. 列出模块内容:\texttt{dir(module1)}
  137. \item
  138. 导入模块:\texttt{import\ module}
  139. \item
  140. 调用模块中的函数:\texttt{module1.func1()}
  141. \end{itemize}
  142. \textbf{注:\texttt{import}
  143. 语句会创建一个新的名字空间,并且在该名字空间内执行 \texttt{.py}
  144. 文件中的所有语句。如果你想把模块内容导入到当前名字空间,请使用
  145. \texttt{from\ module1\ import\ *} 语句。}
  146. \hypertarget{header-n69}{\subsection{数值类类型}\label{header-n69}}
  147. 查看变量的数据类型:\texttt{type(variable)}
  148. \subsubsection{六种经常使用的数据类型}\label{header-n72}
  149. \begin{enumerate}
  150. \def\labelenumi{\arabic{enumi}.}
  151. \item
  152. \textbf{int/long}:过大的 \texttt{int} 类型会被自动转化为
  153. \texttt{long} 类型。
  154. \item
  155. \textbf{float}:64 位,Python 中没有 \texttt{double} 类型。
  156. \item
  157. \textbf{bool}:真或假。
  158. \item
  159. \textbf{str}:在 Python 2 中默认以 ASCII 编码,而在 Python 3 中默认以
  160. Unicode 编码;
  161. \begin{itemize}
  162. \item
  163. 字符串可置于单/双/三引号中;
  164. \item
  165. 字符串是字符的序列,因此可以像处理其他序列一样处理字符串;
  166. \item
  167. 特殊字符可通过 \texttt{\textbackslash{}} 或者前缀 \texttt{r} 实现:
  168. \end{itemize}
  169. \begin{Shaded}
  170. \begin{Highlighting}[]
  171. \NormalTok{str1 }\OperatorTok{=} \VerbatimStringTok{r'this\textbackslash{}f?ff'}
  172. \end{Highlighting}
  173. \end{Shaded}
  174. \begin{itemize}
  175. \item
  176. 字符串可通过多种方式格式化:
  177. \end{itemize}
  178. \begin{Shaded}
  179. \begin{Highlighting}[]
  180. \NormalTok{template }\OperatorTok{=} \StringTok{'}\SpecialCharTok{%.2f}\StringTok{ }\SpecialCharTok{%s}\StringTok{ haha $}\SpecialCharTok{%d}\StringTok{'}\OperatorTok{;}
  181. \NormalTok{str1 }\OperatorTok{=}\NormalTok{ template }\OperatorTok{%}\NormalTok{ (}\FloatTok{4.88}\NormalTok{, }\StringTok{'hola'}\NormalTok{, }\DecValTok{2}\NormalTok{)}
  182. \end{Highlighting}
  183. \end{Shaded}
  184. \item
  185. \textbf{NoneType(None)}:Python \texttt{null} 值(只有 None
  186. 对象的一个实例中存在)。
  187. \begin{itemize}
  188. \item
  189. \texttt{None} 不是一个保留关键字,而是 \textbf{NoneType}
  190. 的一个唯一实例。
  191. \item
  192. \texttt{None} 通常是可选函数参数的默认值:
  193. \end{itemize}
  194. \begin{Shaded}
  195. \begin{Highlighting}[]
  196. \KeywordTok{def}\NormalTok{ func1(a, b, c }\OperatorTok{=} \VariableTok{None}\NormalTok{)}
  197. \end{Highlighting}
  198. \end{Shaded}
  199. \begin{itemize}
  200. \item
  201. \texttt{None} 的常见用法:
  202. \end{itemize}
  203. \begin{Shaded}
  204. \begin{Highlighting}[]
  205. \ControlFlowTok{if}\NormalTok{ variable }\KeywordTok{is} \VariableTok{None}\NormalTok{ :}
  206. \end{Highlighting}
  207. \end{Shaded}
  208. \item
  209. \textbf{datetime}:Python 内建的 datetime 模块提供了
  210. \texttt{datetime}、\texttt{data} 以及 \texttt{time} 类型。
  211. \begin{itemize}
  212. \item
  213. \texttt{datetime} 组合了存储于 \texttt{date} 和 \texttt{time}
  214. 中的信息。
  215. \end{itemize}
  216. \end{enumerate}
  217. \begin{Shaded}
  218. \begin{Highlighting}[]
  219. \CommentTok{#从字符串中创建 datetime}
  220. \NormalTok{dt1 }\OperatorTok{=}\NormalTok{ datetime.strptime(}\StringTok{'20091031'}\NormalTok{, }\StringTok{'%Y%m}\SpecialCharTok{%d}\StringTok{'}\NormalTok{)}
  221. \CommentTok{#获取 date 对象}
  222. \NormalTok{dt1.date()}
  223. \CommentTok{#获取 time 对象}
  224. \NormalTok{dt1.time()}
  225. \CommentTok{#将 datetime 格式化为字符串}
  226. \NormalTok{dt1.strftime(}\StringTok{'%m/}\SpecialCharTok{%d}\StringTok{/%Y%H:%M'}\NormalTok{)}
  227. \CommentTok{#更改字段值}
  228. \NormalTok{dt2 }\OperatorTok{=}\NormalTok{ dt1.replace(minute }\OperatorTok{=} \DecValTok{0}\NormalTok{, second }\OperatorTok{=} \DecValTok{30}\NormalTok{)}
  229. \CommentTok{#做差, diff 是一个 datetime.timedelta 对象}
  230. \NormalTok{diff }\OperatorTok{=}\NormalTok{ dt1 }\OperatorTok{-}\NormalTok{ dt2}
  231. \end{Highlighting}
  232. \end{Shaded}
  233. \textbf{注:Python 中的绝大多数对象都是可变的,只有字符串和元组例外。}
  234. \hypertarget{header-n128}{\subsection{数据结构}\label{header-n128}}
  235. \textbf{注:所有的 non-Get 函数调用,比如下面例子中的
  236. \texttt{list1.sort()} 都是原地操作,即不会创建新的对象,除非特别声明。}
  237. \subsubsection{元组}\label{header-n131}
  238. 元组是 Python 中任何类型的对象的一个一维、固定长度、不可变的序列。
  239. \begin{Shaded}
  240. \begin{Highlighting}[]
  241. \CommentTok{#创建元组}
  242. \NormalTok{tup1 }\OperatorTok{=} \DecValTok{4}\NormalTok{, }\DecValTok{5}\NormalTok{, }\DecValTok{6}
  243. \CommentTok{# or}
  244. \NormalTok{tup1 }\OperatorTok{=}\NormalTok{ (}\DecValTok{6}\NormalTok{, }\DecValTok{7}\NormalTok{, }\DecValTok{8}\NormalTok{)}
  245. \CommentTok{#创建嵌套元组}
  246. \NormalTok{tup1 }\OperatorTok{=}\NormalTok{ (}\DecValTok{4}\NormalTok{, }\DecValTok{5}\NormalTok{, }\DecValTok{6}\NormalTok{), (}\DecValTok{7}\NormalTok{, }\DecValTok{8}\NormalTok{)}
  247. \CommentTok{#将序列或迭代器转化为元组}
  248. \BuiltInTok{tuple}\NormalTok{([}\DecValTok{1}\NormalTok{, }\DecValTok{0}\NormalTok{, }\DecValTok{2}\NormalTok{])}
  249. \CommentTok{#连接元组}
  250. \NormalTok{tup1 }\OperatorTok{+}\NormalTok{ tup2}
  251. \CommentTok{#解包元组}
  252. \NormalTok{a, b, c }\OperatorTok{=}\NormalTok{ tup1}
  253. \end{Highlighting}
  254. \end{Shaded}
  255. 元组应用:
  256. \begin{Shaded}
  257. \begin{Highlighting}[]
  258. \CommentTok{#交换两个变量的值}
  259. \NormalTok{a, b }\OperatorTok{=}\NormalTok{ b, a}
  260. \end{Highlighting}
  261. \end{Shaded}
  262. \subsubsection{列表}\label{header-n138}
  263. 列表是 Python
  264. 中任何类型的对象的一个一维、非固定长度、可变(比如内容可以被修改)的序列。
  265. \begin{Shaded}
  266. \begin{Highlighting}[]
  267. \CommentTok{#创建列表}
  268. \NormalTok{list1 }\OperatorTok{=}\NormalTok{ [}\DecValTok{1}\NormalTok{, }\StringTok{'a'}\NormalTok{, }\DecValTok{3}\NormalTok{]}
  269. \CommentTok{#or}
  270. \NormalTok{list1 }\OperatorTok{=} \BuiltInTok{list}\NormalTok{(tup1)}
  271. \CommentTok{#连接列表}
  272. \NormalTok{list1 }\OperatorTok{+}\NormalTok{ list2 }
  273. \CommentTok{#or}
  274. \NormalTok{list1.extend(list2)}
  275. \CommentTok{#追加到列表的末尾}
  276. \NormalTok{list1.append(}\StringTok{'b'}\NormalTok{)}
  277. \CommentTok{#插入指定位置}
  278. \NormalTok{list1.insert(PosIndex, }\StringTok{'a'}\NormalTok{)}
  279. \CommentTok{#反向插入,即弹出给定位置的值/删除}
  280. \NormalTok{ValueAtIdx }\OperatorTok{=}\NormalTok{ list1.pop(PosIndex)}
  281. \CommentTok{#移除列表中的第一个值, a 必须是列表中第一个值}
  282. \NormalTok{list1.remove(}\StringTok{'a'}\NormalTok{)}
  283. \CommentTok{#检查成员资格}
  284. \DecValTok{3} \KeywordTok{in}\NormalTok{ list1 }\OperatorTok{=>} \VariableTok{True} \KeywordTok{or} \VariableTok{False}
  285. \CommentTok{#对列表进行排序}
  286. \NormalTok{list1.sort()}
  287. \CommentTok{#按特定方式排序}
  288. \NormalTok{list1.sort(key }\OperatorTok{=} \BuiltInTok{len}\NormalTok{) }\CommentTok{# 按长度排序}
  289. \end{Highlighting}
  290. \end{Shaded}
  291. \begin{itemize}
  292. \item
  293. 使用 +
  294. 连接列表会有比较大的开支,因为这个过程中会创建一个新的列表,然后复制对象。因此,使用
  295. \texttt{extend()} 是更明智的选择;
  296. \item
  297. \texttt{insert} 和 \texttt{append} 相比会有更大的开支(时间/空间);
  298. \item
  299. 在列表中检查是否包含一个值会比在字典和集合中慢很多,因为前者需要进行线性扫描,而后者是基于哈希表的,所以只需要花费常数时间。
  300. \end{itemize}
  301. \paragraph{\texorpdfstring{内建的 \texttt{bisect}
  302. 模块}{内建的 bisect 模块}}\label{header-n152}
  303. \begin{itemize}
  304. \item
  305. 对一个排序好的列表进行二分查找或插入;
  306. \item
  307. \texttt{bisect.bisect}找到元素在列表中的位置,\texttt{bisect.insort}将元素插入到相应位置。用法:
  308. \end{itemize}
  309. \begin{Shaded}
  310. \begin{Highlighting}[]
  311. \ImportTok{import}\NormalTok{ bisect}
  312. \NormalTok{list1 }\OperatorTok{=} \BuiltInTok{list}\NormalTok{(}\BuiltInTok{range}\NormalTok{(}\DecValTok{10}\NormalTok{))}
  313. \CommentTok{#找到 5 在 list1 中的位置,从 1 开始,因此 position = index + 1}
  314. \NormalTok{bisect.bisect(list1, }\DecValTok{5}\NormalTok{)}
  315. \CommentTok{#将 3.5 插入 list1 中合适位置}
  316. \NormalTok{bisect.insort(list1, }\FloatTok{3.5}\NormalTok{)}
  317. \end{Highlighting}
  318. \end{Shaded}
  319. \textbf{注:\texttt{bisect}
  320. 模块中的函数并不会去检查列表是否排序好,因为这会花费很多时间。所以,对未排序好的列表使用这些函数也不会报错,但可能会返回不正确的结果。}
  321. \subsubsection{针对序列类型的切片}\label{header-n163}
  322. 序列类型包括 \texttt{str}、\texttt{array}、\texttt{tuple}、\texttt{list}
  323. 等。
  324. 用法:
  325. \begin{Shaded}
  326. \begin{Highlighting}[]
  327. \NormalTok{list1[start:stop]}
  328. \CommentTok{#如果使用 step}
  329. \NormalTok{list1(start:stop:step)}
  330. \end{Highlighting}
  331. \end{Shaded}
  332. \textbf{注:切片结果包含 \texttt{start} 索引,但不包含 \texttt{stop}
  333. 索引;\texttt{start/stop}
  334. 索引可以省略,如果省略,则默认为序列从开始到结束,如
  335. \texttt{list1\ ==\ list1{[}:{]}} 。}
  336. \texttt{step} 的应用:
  337. \begin{Shaded}
  338. \begin{Highlighting}[]
  339. \CommentTok{#取出奇数位置的元素}
  340. \NormalTok{list1[::}\DecValTok{2}\NormalTok{]}
  341. \CommentTok{#反转字符串}
  342. \NormalTok{str1[::}\OperatorTok{-}\DecValTok{1}\NormalTok{]}
  343. \end{Highlighting}
  344. \end{Shaded}
  345. \subsubsection{字典(哈希映射)}\label{header-n174}
  346. \begin{Shaded}
  347. \begin{Highlighting}[]
  348. \CommentTok{#创建字典}
  349. \NormalTok{dict1 }\OperatorTok{=}\NormalTok{ \{}\StringTok{'key1'}\NormalTok{: }\StringTok{'value1'}\NormalTok{, }\DecValTok{2}\NormalTok{: [}\DecValTok{3}\NormalTok{,}\DecValTok{2}\NormalTok{]\}}
  350. \CommentTok{#从序列创建字典}
  351. \BuiltInTok{dict}\NormalTok{(}\BuiltInTok{zip}\NormalTok{(KeyList, ValueList))}
  352. \CommentTok{#获取/设置/插入元素}
  353. \NormalTok{dict1[}\StringTok{'key1'}\NormalTok{]}
  354. \NormalTok{dict1[}\StringTok{'key1'}\NormalTok{] }\OperatorTok{=} \StringTok{'NewValue'}
  355. \CommentTok{#get 提供默认值}
  356. \NormalTok{dict1.get(}\StringTok{'key1'}\NormalTok{, DefaultValue)}
  357. \CommentTok{#检查键是否存在}
  358. \CommentTok{'key1'} \KeywordTok{in}\NormalTok{ dict1}
  359. \CommentTok{#获取键列表}
  360. \NormalTok{dict1.keys()}
  361. \CommentTok{#获取值列表}
  362. \NormalTok{dict1.values()}
  363. \CommentTok{#更新值}
  364. \NormalTok{dict1.update(dict2)}\CommentTok{#dict1 的值被 dict2 替换}
  365. \end{Highlighting}
  366. \end{Shaded}
  367. \begin{itemize}
  368. \item
  369. 如果键不存在,则会出现 \texttt{KeyError\ Exception} 。
  370. \item
  371. 当键不存在时,如果 \texttt{get()}不提供默认值则会返回 \texttt{None} 。
  372. \item
  373. 以相同的顺序返回键列表和值列表,但顺序不是特定的,又称极大可能非排序。
  374. \end{itemize}
  375. \paragraph{有效字典键类型}\label{header-n186}
  376. \begin{itemize}
  377. \item
  378. 键必须是不可变的,比如标量类型(\texttt{int}、\texttt{float}、\texttt{string})或者元组(元组中的所有对象也必须是不可变的)。
  379. \item
  380. 这儿涉及的技术术语是 \texttt{hashability}。可以用函数
  381. \texttt{hash()}来检查一个对象是否是可哈希的,比如
  382. \texttt{hash(\textquotesingle{}This\ is\ a\ string\textquotesingle{})}
  383. 会返回一个哈希值,而 \texttt{hash({[}1,2{]})} 则会报错(不可哈希)。
  384. \end{itemize}
  385. \subsubsection{集合}\label{header-n194}
  386. \begin{itemize}
  387. \item
  388. 一个集合是一些无序且唯一的元素的聚集;
  389. \item
  390. 你可以把它看成只有键的字典;
  391. \end{itemize}
  392. \begin{Shaded}
  393. \begin{Highlighting}[]
  394. \CommentTok{#创建集合}
  395. \BuiltInTok{set}\NormalTok{([}\DecValTok{3}\NormalTok{, }\DecValTok{6}\NormalTok{, }\DecValTok{3}\NormalTok{])}
  396. \CommentTok{#or}
  397. \NormalTok{\{}\DecValTok{3}\NormalTok{, }\DecValTok{6}\NormalTok{, }\DecValTok{3}\NormalTok{\}}
  398. \CommentTok{#子集测试}
  399. \NormalTok{set1.issubset(set2)}
  400. \CommentTok{#超集测试}
  401. \NormalTok{set1.issuperset(set2)}
  402. \CommentTok{#测试两个集合中的元素是否完全相同}
  403. \NormalTok{set1 }\OperatorTok{==}\NormalTok{ set2}
  404. \end{Highlighting}
  405. \end{Shaded}
  406. \paragraph{集合操作}\label{header-n203}
  407. \begin{itemize}
  408. \item
  409. 并(又称或):\texttt{set1\ \textbar{}\ set2}
  410. \item
  411. 交(又称与):\texttt{set1\ \&\ set2}
  412. \item
  413. 差:\texttt{set1\ -\ set2}
  414. \item
  415. 对称差(又称异或):\texttt{set1\ \^{}\ set2}
  416. \end{itemize}
  417. \hypertarget{header-n217}{\subsection{函数}\label{header-n217}}
  418. Python 的函数参数传递是通过\textbf{引用传递}。
  419. \begin{itemize}
  420. \item
  421. 基本形式
  422. \end{itemize}
  423. \begin{Shaded}
  424. \begin{Highlighting}[]
  425. \KeywordTok{def}\NormalTok{ func1(posArg1, keywordArg1 }\OperatorTok{=} \DecValTok{1}\NormalTok{, ..)}
  426. \end{Highlighting}
  427. \end{Shaded}
  428. \textbf{注}
  429. \begin{itemize}
  430. \item
  431. 关键字参数必须跟在位置参数的后面;
  432. \item
  433. 默认情况下,Python 不会``延迟求值'',表达式的值会立刻求出来。
  434. \end{itemize}
  435. \subsubsection{函数调用机制}\label{header-n234}
  436. \begin{itemize}
  437. \item
  438. 所有函数均位于模块内部作用域。见``模块''部分。
  439. \item
  440. 在调用函数时,参数被打包成一个元组和一个字典,函数接收一个元组
  441. \texttt{args} 和一个字典 \texttt{kwargs},然后在函数内部解包。
  442. \end{itemize}
  443. ``函数是对象''的常见用法:
  444. \begin{Shaded}
  445. \begin{Highlighting}[]
  446. \KeywordTok{def}\NormalTok{ func1(ops }\OperatorTok{=}\NormalTok{ [}\BuiltInTok{str}\NormalTok{.strip, user_define_func, ..], ..):}
  447. \ControlFlowTok{for}\NormalTok{ function }\KeywordTok{in}\NormalTok{ ops:}
  448. \NormalTok{ value }\OperatorTok{=}\NormalTok{ function(value)}
  449. \end{Highlighting}
  450. \end{Shaded}
  451. \subsubsection{返回值}\label{header-n245}
  452. \begin{itemize}
  453. \item
  454. 如果函数末尾没有 \texttt{return} 语句,则不会返回任何东西。
  455. \item
  456. 如果有多个返回值则通过一个元组来实现。
  457. \end{itemize}
  458. \begin{Shaded}
  459. \begin{Highlighting}[]
  460. \ControlFlowTok{return}\NormalTok{ (value1, value2)}
  461. \NormalTok{value1, value2 }\OperatorTok{=}\NormalTok{ func1(..)}
  462. \end{Highlighting}
  463. \end{Shaded}
  464. \subsubsection{匿名函数(又称 LAMBDA 函数)}\label{header-n254}
  465. \begin{itemize}
  466. \item
  467. 什么是匿名函数?
  468. \end{itemize}
  469. 匿名函数是一个只包含一条语句的简单函数。
  470. \begin{Shaded}
  471. \begin{Highlighting}[]
  472. \KeywordTok{lambda}\NormalTok{ x : x }\OperatorTok{*} \DecValTok{2}
  473. \CommentTok{#def func1(x) : return x * 2}
  474. \end{Highlighting}
  475. \end{Shaded}
  476. \begin{itemize}
  477. \item
  478. 匿名函数的应用:'curring',又称利用已存在函数的部分参数来派生新的函数。
  479. \end{itemize}
  480. \begin{Shaded}
  481. \begin{Highlighting}[]
  482. \NormalTok{ma60 }\OperatorTok{=} \KeywordTok{lambda}\NormalTok{ x : pd.rolling_mean(x, }\DecValTok{60}\NormalTok{)}
  483. \end{Highlighting}
  484. \end{Shaded}
  485. \subsubsection{一些有用的函数(针对数据结构)}\label{header-n267}
  486. \begin{itemize}
  487. \item
  488. \texttt{enumerate()} 返回一个序列\texttt{(i,\ value)}元组,\texttt{i}
  489. 是当前 \texttt{item} 的索引。
  490. \end{itemize}
  491. \begin{Shaded}
  492. \begin{Highlighting}[]
  493. \ControlFlowTok{for}\NormalTok{ i, value }\KeywordTok{in} \BuiltInTok{enumerate}\NormalTok{(collection):}
  494. \end{Highlighting}
  495. \end{Shaded}
  496. 应用:创建一个序列中值与其在序列中的位置的字典映射(假设每一个值都是唯一的)。
  497. \begin{itemize}
  498. \item
  499. \texttt{sort()}可以从任意序列中返回一个排序好的序列。
  500. \end{itemize}
  501. \begin{Shaded}
  502. \begin{Highlighting}[]
  503. \BuiltInTok{sorted}\NormalTok{([}\DecValTok{2}\NormalTok{, }\DecValTok{1}\NormalTok{, }\DecValTok{3}\NormalTok{]) }\OperatorTok{=>}\NormalTok{ [}\DecValTok{1}\NormalTok{, }\DecValTok{2}\NormalTok{, }\DecValTok{3}\NormalTok{]}
  504. \end{Highlighting}
  505. \end{Shaded}
  506. 应用:
  507. \begin{Shaded}
  508. \begin{Highlighting}[]
  509. \BuiltInTok{sorted}\NormalTok{(}\BuiltInTok{set}\NormalTok{(}\StringTok{'abc bcd'}\NormalTok{)) }\OperatorTok{=>}\NormalTok{ [}\StringTok{' '}\NormalTok{,}
  510. \StringTok{'a'}\NormalTok{, }\StringTok{'b'}\NormalTok{, }\StringTok{'c'}\NormalTok{, }\StringTok{'d'}\NormalTok{]}
  511. \CommentTok{# 返回一个字符串排序后无重复的字母序列}
  512. \end{Highlighting}
  513. \end{Shaded}
  514. \begin{itemize}
  515. \item
  516. \texttt{zip()}函数可以把许多列表、元组或其他序列的元素配对起来创建一系列的元组。
  517. \end{itemize}
  518. \begin{Shaded}
  519. \begin{Highlighting}[]
  520. \BuiltInTok{zip}\NormalTok{(seq1, seq2) }\OperatorTok{=>}\NormalTok{ [(}\StringTok{'seq1_1'}\NormalTok{, }\StringTok{'seq2_1'}\NormalTok{), (..), ..]}
  521. \end{Highlighting}
  522. \end{Shaded}
  523. \begin{enumerate}
  524. \def\labelenumi{\arabic{enumi}.}
  525. \item
  526. \texttt{zip()}可以接收任意数量的序列作为参数,但是产生的元素的数目取决于最短的序列。
  527. \end{enumerate}
  528. 应用:多个序列同时迭代:
  529. \begin{verbatim}
  530. for i, (a, b) in enumerate(zip(seq1, seq2)):
  531. \end{verbatim}
  532. \begin{enumerate}
  533. \def\labelenumi{\arabic{enumi}.}
  534. \item
  535. \texttt{unzip}:另一种思考方式是把一些行转化为一些列:
  536. \end{enumerate}
  537. \begin{Shaded}
  538. \begin{Highlighting}[]
  539. \NormalTok{seq1, seq2 }\OperatorTok{=} \BuiltInTok{zip}\NormalTok{(zipOutput)}
  540. \end{Highlighting}
  541. \end{Shaded}
  542. \begin{itemize}
  543. \item
  544. \texttt{reversed()} 将一个序列的元素以逆序迭代。
  545. \end{itemize}
  546. \begin{verbatim}
  547. list(reversed(range(10)))
  548. \end{verbatim}
  549. \textbf{\texttt{reversed()} 会返回一个迭代器,\texttt{list()}
  550. 使之成为一个列表。}
  551. \hypertarget{header-n307}{\subsection{控制流}\label{header-n307}}
  552. \begin{itemize}
  553. \item
  554. 用于 \texttt{if-else} 条件中的操作符:
  555. \end{itemize}
  556. \begin{Shaded}
  557. \begin{Highlighting}[]
  558. \CommentTok{#检查两个变量是否是相同的对象}
  559. \NormalTok{var1 }\KeywordTok{is}\NormalTok{ var2}
  560. \CommentTok{#检查两个变量是否是不同的对象}
  561. \NormalTok{var1 }\KeywordTok{is} \KeywordTok{not}\NormalTok{ var2}
  562. \CommentTok{#检查两个变量的值是否相等}
  563. \NormalTok{var1 }\OperatorTok{==}\NormalTok{ var2}
  564. \end{Highlighting}
  565. \end{Shaded}
  566. \textbf{注:Python 中使用 \texttt{and}、\texttt{or}、\texttt{not}
  567. 来组合条件,而不是使用
  568. \texttt{\&\&}、\texttt{\textbar{}\textbar{}}、\texttt{!} 。}
  569. \begin{itemize}
  570. \item
  571. \texttt{for}循环的常见用法:
  572. \end{itemize}
  573. \begin{verbatim}
  574. #可迭代对象(list、tuple)或迭代器
  575. for element in iterator:
  576. #如果元素是可以解包的序列
  577. for a, b, c in iterator:
  578. \end{verbatim}
  579. \begin{itemize}
  580. \item
  581. \texttt{pass}:无操作语句,在不需要进行任何操作的块中使用。
  582. \item
  583. 三元表达式,又称简洁的 \texttt{if-else},基本形式:
  584. \end{itemize}
  585. \begin{Shaded}
  586. \begin{Highlighting}[]
  587. \NormalTok{value }\OperatorTok{=}\NormalTok{ true}\OperatorTok{-}\NormalTok{expr }\ControlFlowTok{if}\NormalTok{ condition }\ControlFlowTok{else}\NormalTok{ false}\OperatorTok{-}\NormalTok{expr}
  588. \end{Highlighting}
  589. \end{Shaded}
  590. \begin{itemize}
  591. \item
  592. Python 中没有 \texttt{switch/case} 语句,请使用 \texttt{if/elif}。
  593. \end{itemize}
  594. \hypertarget{header-n332}{\subsection{面向对象编程}\label{header-n332}}
  595. \begin{itemize}
  596. \item
  597. \textbf{对象}是 Python 中所有类型的根。
  598. \item
  599. 万物(数字、字符串、函数、类、模块等)皆为对象,每个对象均有一个类型(type)。对象变量是一个指向变量在内存中位置的指针。
  600. \item
  601. 所有对象均为\textbf{引用计数}。
  602. \end{itemize}
  603. \begin{Shaded}
  604. \begin{Highlighting}[]
  605. \NormalTok{sys.getrefcount(}\DecValTok{5}\NormalTok{) }\OperatorTok{=>}\NormalTok{ x}
  606. \NormalTok{a }\OperatorTok{=} \DecValTok{5}\NormalTok{, b }\OperatorTok{=}\NormalTok{ a}
  607. \CommentTok{#上式会在等号的右边创建一个对象的引用,因此 a 和 b 均指向 5}
  608. \NormalTok{sys.getrefcount(}\DecValTok{5}\NormalTok{)}
  609. \OperatorTok{=>}\NormalTok{ x }\OperatorTok{+} \DecValTok{2}
  610. \KeywordTok{del}\NormalTok{(a)}\OperatorTok{;}\NormalTok{ sys.getrefcount(}\DecValTok{5}\NormalTok{) }\OperatorTok{=>}\NormalTok{ x }\OperatorTok{+} \DecValTok{1}
  611. \end{Highlighting}
  612. \end{Shaded}
  613. \begin{itemize}
  614. \item
  615. 类的基本形式:
  616. \end{itemize}
  617. \begin{verbatim}
  618. class MyObject(object):
  619. # 'self' 等价于 Java/C++ 中的 'this'
  620. def __init__(self, name):
  621. self.name = name
  622. def memberFunc1(self, arg1):
  623. ..
  624. @staticmethod
  625. def classFunc2(arg1):
  626. ..
  627. obj1 = MyObject('name1')
  628. obj1.memberFunc1('a')
  629. MyObject.classFunc2('b')
  630. \end{verbatim}
  631. \begin{itemize}
  632. \item
  633. 有用的交互式工具:
  634. \end{itemize}
  635. \begin{Shaded}
  636. \begin{Highlighting}[]
  637. \BuiltInTok{dir}\NormalTok{(variable1) }\CommentTok{#列出对象的所有可用方法}
  638. \end{Highlighting}
  639. \end{Shaded}
  640. \hypertarget{header-n354}{\subsection{常见字符串操作}\label{header-n354}}
  641. \begin{Shaded}
  642. \begin{Highlighting}[]
  643. \CommentTok{#通过分隔符连接列表/元组}
  644. \CommentTok{', '}\NormalTok{.join([ }\StringTok{'v1'}\NormalTok{, }\StringTok{'v2'}\NormalTok{, }\StringTok{'v3'}\NormalTok{]) }\OperatorTok{=>} \StringTok{'v1, v2, v3'}
  645. \CommentTok{#格式化字符串}
  646. \NormalTok{string1 }\OperatorTok{=} \StringTok{'My name is }\SpecialCharTok{\{0\}}\StringTok{ }\SpecialCharTok{\{name\}}\StringTok{'}
  647. \NormalTok{newString1 }\OperatorTok{=}\NormalTok{ string1.}\BuiltInTok{format}\NormalTok{(}\StringTok{'Sean'}\NormalTok{, name }\OperatorTok{=} \StringTok{'Chen'}\NormalTok{)}
  648. \CommentTok{#分裂字符串}
  649. \NormalTok{sep }\OperatorTok{=} \StringTok{'-'}\OperatorTok{;}
  650. \NormalTok{stringList1 }\OperatorTok{=}\NormalTok{ string1.split(sep)}
  651. \CommentTok{#获取子串}
  652. \NormalTok{start }\OperatorTok{=} \DecValTok{1}\OperatorTok{;}
  653. \NormalTok{string1[start:}\DecValTok{8}\NormalTok{]}
  654. \CommentTok{#补 '0' 向右对齐字符串}
  655. \NormalTok{month }\OperatorTok{=} \StringTok{'5'}\OperatorTok{;}
  656. \NormalTok{month.zfill(}\DecValTok{2}\NormalTok{) }\OperatorTok{=>} \StringTok{'05'}
  657. \NormalTok{month }\OperatorTok{=} \StringTok{'12'}\OperatorTok{;}
  658. \NormalTok{month.zfill(}\DecValTok{2}\NormalTok{) }\OperatorTok{=>} \StringTok{'12'}
  659. \NormalTok{month.zfill(}\DecValTok{3}\NormalTok{) }\OperatorTok{=>} \StringTok{'012'}
  660. \end{Highlighting}
  661. \end{Shaded}
  662. 对列表和字典以及元组的深入理解
  663. \hypertarget{header-n357}{\subsection{异常处理}\label{header-n357}}
  664. \begin{itemize}
  665. \item
  666. 基本形式:
  667. \end{itemize}
  668. \begin{Shaded}
  669. \begin{Highlighting}[]
  670. \ControlFlowTok{try}\NormalTok{:}
  671. \NormalTok{ ..}
  672. \ControlFlowTok{except} \PreprocessorTok{ValueError} \ImportTok{as}\NormalTok{ e:}
  673. \BuiltInTok{print}\NormalTok{ e}
  674. \ControlFlowTok{except}\NormalTok{ (}\PreprocessorTok{TypeError}\NormalTok{, AnotherError):}
  675. \NormalTok{ ..}
  676. \ControlFlowTok{except}\NormalTok{:}
  677. \NormalTok{ ..}
  678. \ControlFlowTok{finally}\NormalTok{:}
  679. \NormalTok{ .. }\CommentTok{# 清理,比如 close db;}
  680. \end{Highlighting}
  681. \end{Shaded}
  682. \begin{itemize}
  683. \item
  684. 手动引发异常:
  685. \end{itemize}
  686. \begin{Shaded}
  687. \begin{Highlighting}[]
  688. \ControlFlowTok{raise} \PreprocessorTok{AssertionError} \CommentTok{# 断言失败}
  689. \ControlFlowTok{raise} \PreprocessorTok{SystemExit}
  690. \CommentTok{# 请求程序退出}
  691. \ControlFlowTok{raise} \PreprocessorTok{RuntimeError}\NormalTok{(}\StringTok{'错误信息 :..'}\NormalTok{)}
  692. \end{Highlighting}
  693. \end{Shaded}
  694. \hypertarget{header-n369}{\subsection{对列表和字典以及元组的深入理解}\label{header-n369}}
  695. 语法糖(syntactic sugar)会使代码变得更加易读易写。
  696. \subsubsection{对列表的理解}\label{header-n372}
  697. 将一些元素通过一个简短的语句传入一个过滤器进行过滤和转化,然后可以组成一个新的列表。
  698. \begin{Shaded}
  699. \begin{Highlighting}[]
  700. \CommentTok{#基本形式}
  701. \NormalTok{[expr }\ControlFlowTok{for}\NormalTok{ val }\KeywordTok{in}\NormalTok{ collection }\ControlFlowTok{if}\NormalTok{ condition]}
  702. \CommentTok{#ShortCut}
  703. \NormalTok{result }\OperatorTok{=}\NormalTok{ []}
  704. \ControlFlowTok{for}\NormalTok{ val }\KeywordTok{in}\NormalTok{ collection:}
  705. \ControlFlowTok{if}\NormalTok{ condition:}
  706. \NormalTok{ result.append(expr)}
  707. \end{Highlighting}
  708. \end{Shaded}
  709. 可以省略过滤条件,只留下表达式。
  710. \subsubsection{对字典的理解}\label{header-n378}
  711. 基本形式:
  712. \begin{Shaded}
  713. \begin{Highlighting}[]
  714. \NormalTok{\{key}\OperatorTok{-}\NormalTok{expr : value}\OperatorTok{-}\NormalTok{expr }\ControlFlowTok{for}\NormalTok{ value }\KeywordTok{in}\NormalTok{ collection }\ControlFlowTok{if}\NormalTok{ condition\}}
  715. \end{Highlighting}
  716. \end{Shaded}
  717. \subsubsection{对集合的理解}\label{header-n382}
  718. 基本形式:和列表一样,只是应该使用 \texttt{()} 而不是 \texttt{{[}{]}} 。
  719. \subsubsection{嵌套列表}\label{header-n385}
  720. 基本形式:
  721. \begin{Shaded}
  722. \begin{Highlighting}[]
  723. \NormalTok{[expr }\ControlFlowTok{for}\NormalTok{ val }\KeywordTok{in}\NormalTok{ collection }\ControlFlowTok{for}\NormalTok{ innerVal }\KeywordTok{in}\NormalTok{ val }\ControlFlowTok{if}\NormalTok{ condition]}
  724. \end{Highlighting}
  725. \end{Shaded}
  726. \end{document}