Skip to content

Latest commit

 

History

History
75 lines (43 loc) · 4.16 KB

200730.md

File metadata and controls

75 lines (43 loc) · 4.16 KB

30 - 7 - 2020 题目

表达式 min ( ['11', '2', '3’] ) 的值是什么?

A '11'

B '2'

C '3'

D 2"

答案: A. ‘11’

解析过程

首先,根据 Python 官方文档,min 这个函数的意思是 minimum,即找最小值的意思。

那么答案是就是 ’2’ 咯!其实并不是,而是 ’11’。为什么呢?

我们仔细看清楚这几个数字,原来他们都是被 ‘ 号包围着,那就代表他们都是字符串 (string),所以现在是在找哪个字符串最小,而不是实际数字的大小。

既然是找大小的问题,那就牵涉到比较的问题了,有比较才能找到最小,是吧?于是我们找到 Comparisons 章节底下的 Value comparisons 分支章节,接着再找到字符串的比较说明,以下是撷取的文字说明。

Strings (instances of str) compare lexicographically using the numerical Unicode code points (the result of the built-in function ord()) of their characters.[3]

当中的关键词为 numerical Unicode code points,中文意思是“统一码码位”,其实电脑上的每个字符背后都有一个相对应的统一码码位,关于统一码 (unicode) 的细节,你可以再翻去另一章节 Unicode HOWTO 了解更多。

一个统一码码位是由 “U+” 字符串作开头,然后连接着 4 至 6 个位以 16 进制表示的数字。例如对英文字符“A”的统一码码位是 U+0041,而数字字符“9”则是 U+0039。如果我们想知道每个字符对应的统一码码位是什么,我们可以使用两个方法。

  1. 上统一码的官方网站看码表,例如这里便是其中一个关于基础拉丁文的码表。

  2. 另一个更快的方法是利用 ord ( ) 函数找出每个字符的统一码码位。

统一码码位的大小比较很直接,直接将其 16 进制的数字进行比较就行了。例如 U+265E(即十进制的 9,822) 比 U+0061(即十进制的 97) 大。

265E > 0061

所以字符串的比较就是按照统一码码位的大小作出比较的。

我们看回题目,里边有 3 个元素,’11’、’2’ 和 ‘3’,而当中的 ’11’ 事实上是由两个 ‘1’ 字符组成的。

那么把两个字符组成一组的字符串(string),怎样跟别的单一字符作比较呢?

首先,我们要知道字符串的属性是什么,根据 Text Sequence Type — str 这个章节里的说到了。

Textual data in Python is handled with str objects, or strings. Strings are immutable sequences of Unicode code points.

字符串是一串不可变的统一码序列。就是说,例如字符串“ABC”的另一个写法便是 [“ \u0041 ”, ” \u0042 ”, ” \u0043 ”]。 在这里说一句,如果你想知道为什么统一码码位的写法是这样,你可以查看 String and Bytes literals 这个章节。

而关于序列的比较方式,我们需要再次参考到 Comparisons 章节底下的 Value comparisons 分支章节,底下有说到 Sequences compare 的方法。

Sequences compare lexicographically using comparison of corresponding elements. The built-in containers typically assume identical objects are equal to themselves. That lets them bypass equality tests for identical objects to improve performance and to maintain their internal invariants.

第一句便说明了,就是将两个序列里的同一个位置的元素作比较,如果相同的话,就跳到下一个相同的位置再作比较,直到分出大小或完全相等为止。

综以上所说,我们看回题目,['11', '2', '3’] 里的每个元素的比较方法其实是 [‘1’, ‘1’]、[‘2’] 和 [‘3’] 在作比较。

我们先看各个序列里的第一个元素 —— ’1’、’2’、’3’,还有他们所对应的统一码码位(Unicode code points)。

字符 统一码码位
‘1’ U+0031
‘2’ U+0032
‘3’ U+0033

依据以上的码位大小,我们就有了以下的排列顺序了。

1 < 2 < 3

既然第一回合就已经能分出大小了,那么比较也就结束了。

所以最后就返回了 ‘1’ 所属的组别 ’11’ 了。