擅长:python、mysql、java
<p>检查<code>read()</code>返回的字符串的长度是简单、干净和高效的。Python的所有集合对象(字符串、列表、元组、dict、set等)都将它们的长度存储为一个属性,因此获取长度是一个非常廉价和快速的操作。在</p>
<p>然而,在对数据进行操作之前测试数据是否正确可能是乏味和繁琐的。如果这样的数据几乎总是无效的,那么这些数据几乎总是正确的。这种编码样式称为Look-beforyouleap或<a href="https://docs.python.org/3/glossary.html#term-lbyl" rel="nofollow">LBYL</a>。相反,Python中一种流行的编码风格是请求原谅比请求许可或<a href="https://docs.python.org/3/glossary.html#term-eafp" rel="nofollow">EAFP</a>更容易。换句话说,与其测试数据然后决定如何继续,不如假设数据是正确的,然后在出现问题时引发异常。在</p>
<p>EAFP代码通常比LBYL代码更易于实现、读取和维护。在Python中,<code>try: ... except</code>非常高效,而且通常比等价的<code>if: ... else:</code>代码快,因此鼓励使用异常。请参阅维基百科的文章<a href="http://en.wikipedia.org/wiki/Python_syntax_and_semantics#Exceptions" rel="nofollow">Python syntax and semantics</a>。在</p>
<p>因此,不必在试图解包之前测试数据的长度是否正确,您只需将所有的<code>struct.unpack()</code>调用放入一个<code>try: ... except struct.error</code>块中,并在引发异常时退出。这种方法意味着您不必担心每个<code>seek()</code>或<code>read()</code>调用是否会超过文件的结尾。在</p>
<p>如果您确实想坚持LBYL方法,那么您可以为<code>seek()</code>编写一个包装器,但是效率不高,因为没有简单的方法来判断您是否查找到了文件的末尾。因此,这样的包装器会给每个<code>seek()</code>调用增加额外的开销,如果这些调用中的大多数都没有让您超过文件的结尾,则会浪费CPU时间。在</p>