我一辈子都在写代码,但从来没有掌握编码的精髓。大部分情况下使用Visual Basic,因为我用VB最舒服。同时还略微了解一点其他语言(R、C、JavaScript、Applescript、Hypertext和1979年学习的BASIC)。几年前,我决定只用Python,以此来提高我的编码能力。在此过程中重复发明了许多轮子,但我并不介意,因为我享受解决问题的乐趣。同时有时能发现更有效、Python式的解决方案。时间长了以后,会有顿悟的时刻,意识到根本没必要用困难且冗长的方式处理问题。下面列出10条Python用法,如果我早点发现,也许能节省很多时间。
这里没有列表推导和lambda函数。虽然这两个用法都是Python式的,效率高也非常酷,但由于经常在StackOverflow或其他地方碰到,所以学Python的应该都知道这两个东西。同时也没有三元运算符、装饰器和生成器,因为我很少用到。
本文还有一个IPython notebook nbviewer版本。
Python 2与Python 3不兼容,这让我不知道该选择哪个版本的Python。最终我选择了Python 2,因为当时许多我需要用的库都与Python 3不兼容。
但实际上,日常使用中最大的版本差异是输出(print)和除法行为。现在我在Python 2的代码中都用import from future来导入Python 3的输出和除法。现在我用到的几乎所有库都支持Python 3,因此会很快迁移到Python 3中。
1234567891011121314 | mynumber = 5 print \”Python 2:\”print \”The number is %d\” % (mynumber)print mynumber / 2,print mynumber // 2 from __future__ import print_functionfrom __future__ import division print(\’nPython 3:\’)print(\”The number is {}\”.format(mynumber))print(mynumber / 2, end=\’ \’)print(mynumber // 2) |
123 | Python 2:The number is 52 2 |
123 | Python 3:The number is 52.5 2 |
对了,对于C系的那些更喜欢括号而不是缩进的开发者,这里还有一个彩蛋:
1234 | from __future__ import bracesFile \”\”, line 1from __future__ import bracesSyntaxError: not a chance |
2. enumerate(list)
很明显,迭代列表时,应该同时迭代其中的元素及其索引,但在很长一段时间内,我都尴尬的使用计数变量或切片。
1234 | mylist = [\”It\’s\”, \’only\’, \’a\’, \’model\’] for index, item in enumerate(mylist): print(index, item) |
1234 | 0 It\’s1 only2 a3 model |
由于我以前使用的是静态语言(在这些语言中该用法有二义性),从来没有将两个比较操作符放在一个表达式中。在许多语言中,4 > 3 > 2会返回False,因为4 > 3的结果是布尔值,而True > 2将得出False。
1234 | mynumber = 3 if 4 > mynumber > 2: print(\”Chained comparison operators work! n\” * 3) |
我一辈子都在写代码,但从来没有掌握编码的精髓。大部分情况下使用Visual Basic,因为我用VB最舒服。同时还略微了解一点其他语言(R、C、JavaScript、Applescript、Hypertext和1979年学习的BASIC)。几年前,我决定只用Python,以此来提高我的编码能力。在此过程中重复发明了许多轮子,但我并不介意,因为我享受解决问题的乐趣。同时有时能发现更有效、Python式的解决方案。时间长了以后,会有顿悟的时刻,意识到根本没必要用困难且冗长的方式处理问题。下面列出10条Python用法,如果我早点发现,也许能节省很多时间。
这里没有列表推导和lambda函数。虽然这两个用法都是Python式的,效率高也非常酷,但由于经常在StackOverflow或其他地方碰到,所以学Python的应该都知道这两个东西。同时也没有三元运算符、装饰器和生成器,因为我很少用到。
本文还有一个IPython notebook nbviewer版本。
Python 2与Python 3不兼容,这让我不知道该选择哪个版本的Python。最终我选择了Python 2,因为当时许多我需要用的库都与Python 3不兼容。
但实际上,日常使用中最大的版本差异是输出(print)和除法行为。现在我在Python 2的代码中都用import from future来导入Python 3的输出和除法。现在我用到的几乎所有库都支持Python 3,因此会很快迁移到Python 3中。
1234567891011121314 | mynumber = 5 print \”Python 2:\”print \”The number is %d\” % (mynumber)print mynumber / 2,print mynumber // 2 from __future__ import print_functionfrom __future__ import division print(\’nPython 3:\’)print(\”The number is {}\”.format(mynumber))print(mynumber / 2, end=\’ \’)print(mynumber // 2) |
123 | Python 2:The number is 52 2 |
123 | Python 3:The number is 52.5 2 |
对了,对于C系的那些更喜欢括号而不是缩进的开发者,这里还有一个彩蛋:
1234 | from __future__ import bracesFile \”\”, line 1from __future__ import bracesSyntaxError: not a chance |
2. enumerate(list)
很明显,迭代列表时,应该同时迭代其中的元素及其索引,但在很长一段时间内,我都尴尬的使用计数变量或切片。
1234 | mylist = [\”It\’s\”, \’only\’, \’a\’, \’model\’] for index, item in enumerate(mylist): print(index, item) |
1234 | 0 It\’s1 only2 a3 model |
由于我以前使用的是静态语言(在这些语言中该用法有二义性),从来没有将两个比较操作符放在一个表达式中。在许多语言中,4 > 3 > 2会返回False,因为4 > 3的结果是布尔值,而True > 2将得出False。
1234 | mynumber = 3 if 4 > mynumber > 2: print(\”Chained comparison operators work! n\” * 3) |