\documentclass[实验报告模板]{subfiles}

\renewcommand{\mydate}{
    2023/10/27
}
\renewcommand{\mychapternum}{4}

\begin{document}
    \mytitle
    \begin{enumerate}
        \myitem{实验目的}{
            \item 使用第四章知识解决数组和字符串
            的问题。
        }
        \myitem{实验内容}{
            \item 给你一个 m 行 n 列的矩阵 matrix，请按照顺时针螺旋顺序，返回矩
            阵中的所有元素。
            \item 给定一个字符串，输出所有长度至少为 2 的回文子串。回文子串即从左
            往右输出和从右往左输出结果是一样的字符串，比如：abba，
            cccdeedccc 都是回文字符串。
        }
        \myitem{实验原理}{
            \item 程序设计原理。
        }
        \myitem{实验步骤}{
            \item 问题抽象
            \item 编写程序
            \item 调试程序
            \item 完善总结
        }
        \myitem{调试过程、结果和分析}{
            \item Python的切片取反时要注意stop的参数可能会小于0，就变成负向索引了。例如正向切片时使用a[i:j + 1]可以取出[i,j + 1)区间，即[i,j]闭区间内的元素，但要是反向切片的话，因为切片的区间包含start但不包含stop，所以应该为(i - 1, j]，也就是start为j，stop为i - 1，即a[j:i - 1:-1]，但是如果i = 0的时候，正向切片是取出[0, j + 1)区间内的元素，但反向取就变成了(-1, j]，而-1在切片中是负向索引，而每个元素的位置肯定小于等于最后一个元素所在的位置，因此不管j怎么取，最终的结果都是空的序列。因此最终的代码采用了先赋值再切片防止出现这样的情况。
        }
        \item \textbf{总结}
        \begin{enumerate}
            \itemsep 1.6em
            \item 在不考虑复杂度的情况下，Python实现功能真的特别方便；
            \item Python的and和or有短路规则，即：and连接的前后两个操作数，如果前一个操作数的逻辑取值为假，则会直接返回前一个操作数（注意是返回原操作数而不是False也不是0，这和C/C++中不一样）；如果前一个操作数的逻辑取值为真，则会返回后一个操作数（注意也是返回原操作数）。同理，or连接的前后两个操作，如果前一个操作数的逻辑取值为真，则会返回前一个操作数；如果前一个操作数的逻辑取值为假，则会返回后一个操作数；
            \item 空列表、空字典、空元组、空集合、空字符串、0的逻辑取值为假；
            \item 列表可以直接使用加号拼接；
            \item 单个星号“*”表示按位置参数解包操作符，即把星号后面的操作数按顺序依次取出作为位置参数；
            \item zip函数的功能是依次把传递给它的每个位置参数同时取出一个元素并进行组合，（不好描述，建议看官方文档）可以理解为矩阵转置，以下是官方文档中的解释：\\
            \url{https://docs.python.org/zh-cn/3/library/functions.html#zip}
            \item 如果将二维列表看成是矩阵的话，zip函数和*操作符一起使用是真正的矩阵转置，之后[::-1]这样的切片操作表示将外层列表反向，一个二维矩阵转置再反向后就相当于这个二维矩阵逆时针旋转了90度；
            \item matrix[0]表示这个矩阵的第一行，matrix[1:]表示这个矩阵去掉第一行后的部分，所以将矩阵去掉第一行的部分逆时针旋转90度，再去掉第一行，再逆时针旋转90度，不断重复这样的操作就可以顺时针遍历矩阵中的元素；
            \item \_\_import\_\_可以导入模块并返回模块，sys.stdin是标准输入，sys.stdin.readlines()是读取标准输入并按行存储，之后使用列表解析式，对每一行line.split()表示按空白字符分割，之后返回的就是一个二维列表；
            \item “:=”是赋值表达式，会将表达式右端赋值给左端并返回表达式右端的值，相当于C/C++中的“=”；
            \item f"..."是格式化字符串字面值，参考官方文档：\\
            \url{https://docs.python.org/zh-cn/3/reference/lexical_analysis.html#formatted-string-literals}
            \item “\_”存储最后一次求值的结果，也可以用来命名无需使用的变量，参考官方文档：\\
            \url{https://docs.python.org/zh-cn/3/reference/lexical_analysis.html#reserved-classes-of-identifiers}\\
            这里使用是为了防止在Jupyter等交互式解释器中运行此段代码时Jupyter自动返回最后一次求值的结果。
        \end{enumerate}
        \myitem{附件}{
            \itemsep 5em
            \item 给你一个 m 行 n 列的矩阵 matrix，请按照顺时针螺旋顺序，返回矩
            阵中的所有元素。
            \inputminted[linenos=true, breaklines=true]{python3}{../Python/第四章作业4.1.py}
            \item 给定一个字符串，输出所有长度至少为 2 的回文子串。回文子串即从左
            往右输出和从右往左输出结果是一样的字符串，比如：abba，
            cccdeedccc 都是回文字符串。
            \inputminted[linenos=true, breaklines=true]{python3}{../Python/第四章作业4.2.py}
        }
    \end{enumerate}
\end{document}