用于解答算法題目的Python3代碼框架
前言
最近在實習,任務并不是很重,就利用閑暇時間使用Python3在PAT網(wǎng)站上刷題,并致力于使用Python3的特性和函數(shù)式編程的理念,其中大部分題目都有著類似的輸入輸出格式,例如一行讀入若干個數(shù)字,字符串,每行輸出多少個字符串等等,所以產(chǎn)生了很多重復的代碼。
Python代碼
于是我就利用VS Code的代碼片段功能編寫了一個用于處理這些輸入輸出的代碼框架,并加入了測試功能(寫函數(shù)前先寫測試時正確的事情)。代碼如下:
- """Simple Console Program With Data Input And Output."""
- import sys
- import io
- def read_int():
- """Read a seris of numbers."""
- return list(map(int, sys.stdin.readline().split()))
- def test_read_int():
- """Test the read_int function"""
- test_file = io.StringIO("1 2 3\n")
- sys.stdin = test_file
- assert read_int() == [1, 2, 3], "read_int error"
- def read_float():
- """Read a seris of float numbers."""
- return list(map(float, sys.stdin.readline().split()))
- def test_read_float():
- """Test the read_float function"""
- test_file = io.StringIO("1 2 3\n")
- sys.stdin = test_file
- assert read_float() == [1.0, 2.0, 3.0], "read_float error"
- def read_word():
- """Read a seris of string."""
- return list(map(str, sys.stdin.readline().split()))
- def test_read_word():
- """Test the read_word function"""
- test_file = io.StringIO("1 2 3\n")
- sys.stdin = test_file
- assert read_word() == ["1", "2", "3"], "read_word error"
- def combine_with(seq, sep=' ', num=None):
- """Combine list enum with a character and return the string object"""
- res = sep.join(list(map(str, seq)))
- if num is not None:
- res = str(seq[0])
- for element in range(1, len(seq)):
- res += sep + \
- str(seq[element]) if element % num != 0 else '\n' + \
- str(seq[element])
- return res
- def test_combile_with():
- """Test the combile_with function."""
- assert combine_with([1, 2, 3, 4, 5], '*', 2) == """1*2 3*4 5""", "combine_with error."
- def main():
- """The main function."""
- pass
- if __name__ == '__main__':
- sys.exit(int(main() or 0))
VS Code代碼片段
添加到VS Code的默認代碼片段的操作大致如下:
文件->***項->用戶代碼片段,選擇Python
編輯"python.json"文件如以下內(nèi)容:
- {
- /*
- // Place your snippets for Python here. Each snippet is defined under a snippet name and has a prefix, body and
- // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
- // $1, $2 for tab stops, ${id} and ${id:label} and ${1:label} for variables. Variables with the same id are connected.
- // Example:
- "Print to console": {
- "prefix": "log",
- "body": [
- "console.log('$1');",
- "$2"
- ],
- "description": "Log output to console"
- }
- */
- "Simple Console Program With Data Input And Output": {
- "prefix": "simple",
- "body": ["\"\"\"Simple Console Program With Data Input And Output.\"\"\"\nimport sys\n\ndef read_int():\n \"\"\"Read a seris of numbers.\"\"\"\n return list(map(int, sys.stdin.readline().split()))\n\n\ndef read_float():\n \"\"\"Read a seris of float numbers.\"\"\"\n return list(map(float, sys.stdin.readline().split()))\n\n\ndef read_word():\n \"\"\"Read a seris of string.\"\"\"\n return list(map(str, sys.stdin.readline().split()))\n\n\ndef combine_with(seq, sep=' ', num=None):\n \"\"\"Combine list enum with a character and return the string object\"\"\"\n res = sep.join(list(map(str, seq)))\n if num is not None:\n res = str(seq[0])\n for element in range(1, len(seq)):\n res += sep + str(seq[element]) if element % num != 0 else '\\n' + str(seq[element])\n return res\n\n\ndef main():\n \"\"\"The main function.\"\"\"\n pass\n\n\nif __name__ == '__main__':\n sys.exit(int(main() or 0))\n"
- ],
- "description": "Simple Console Program With Data Input And Output"
- }
- }
總結
雖然Python不是特別適合解答算法題目這種性能要求很高的場景,但是在一些模擬題目如各種排隊型和字符串處理的條件下,使用Python可以極大地提高解體效率,另外還可以使用cimport使用C語言的數(shù)據(jù)結構和Python的語法特性,效率不弱于原生C代碼。