diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/2.\347\250\213\345\272\217\350\256\276\350\256\241\346\200\235\346\203\263/function.md" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/2.\347\250\213\345\272\217\350\256\276\350\256\241\346\200\235\346\203\263/function.md" index 3fccb414ee63876d4fb345b1436bdfbed0f9a457..5bb326dee4adc10589b336ae6a21780714a5173e 100644 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/2.\347\250\213\345\272\217\350\256\276\350\256\241\346\200\235\346\203\263/function.md" +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/2.\347\250\213\345\272\217\350\256\276\350\256\241\346\200\235\346\203\263/function.md" @@ -157,7 +157,7 @@ def parse_profile(creator): def parse_creators(creators): profiles = [] for creator in creators: - profile = parse_creator(creator) + profile = parse_profile(creator) profiles.append(profile) return profiles ``` diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/3.\345\256\211\350\243\205Python/install.md" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/3.\345\256\211\350\243\205Python/install.md" index 982fa292c1d84ee4c21034d1b786b7a70a70b22b..ab0737ce5cd0558e560db8fcf26aa3c708b73b0c 100644 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/3.\345\256\211\350\243\205Python/install.md" +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/3.\345\256\211\350\243\205Python/install.md" @@ -14,7 +14,7 @@ Python 历史上有几个重要的版本节点: * Windows 平台没有默认安装 Python * Linux/Mac 平台大部分默认安装了 Python2.7 -一般建议安装Python3.x 版本进行学习或开发。不同平台的安装信息如下: +一般建议安装Python3.x 版本进行学习或开发。下面的`Python字典`给出了不同平台的安装信息: ```python install = { @@ -61,7 +61,7 @@ MacOS: 安装brew包管理器,然后执行命令: brew install python3 请选择安装平台[w/c/u/m, 按q退出]:q ``` -以下选对对`Python3.x安装文档交互式查询代码`的实现错误的是? +以下选项中对`Python3.x安装文档交互式查询代码`的实现错误的是? ## template diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/repl.png" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/repl.png" new file mode 100644 index 0000000000000000000000000000000000000000..6b1c4df13bc3227537113ea34cc8583e7b77cbc6 Binary files /dev/null and "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/repl.png" differ diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.json" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.json" index e89dfe7684a315bcd533ba159d3a28b050f0dabe..c17a62e21918f33fda179686d5980f582a381e7d 100644 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.json" +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.json" @@ -1,19 +1,5 @@ { - "one_line": { - "break": [ - "continue" - ], - "if has_learn_i and has_learn_f": [ - "if has_learn_i or has_learn_f" - ], - "elif": [ - "else if" - ], - "item = run.get(ret)": [ - "item = run[ret]" - ] - }, - "source": "run.py", + "source": "run.md", "depends": [], "exercise_id": 32, "type": "code_options" diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.md" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.md" new file mode 100644 index 0000000000000000000000000000000000000000..bf1e7af1d9c20d4c564fb4e92a7604d14211369b --- /dev/null +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.md" @@ -0,0 +1,276 @@ +# 操作系统如何运行程序 + +人和操作系统如何交互?最早Ken Thompson设计Unix的时候,使用的是命令解释器,命令解释器接受用户的命令,然后解释他们并执行。 + +`Shell`是人和机器交互的界面,分为`GUI`和`命令行(CLI)`两种方式,这里重点介绍命令行的方式。概念`Shell`路易斯·普赞(Louis Pouzin)在1964年至1965年间首次提出,随后在Multics(MULTiplexed Information and Computing System)项目中首次被实现出来。肯·汤普逊(Ken Thompson)以Multics上的shell为范本实现的第一个Unix壳层(Unix shell):`Thompson shell`。AT&T贝尔实验室的史蒂夫·伯恩在1977年实现了`Bourne shell`,或`sh`,它是Version 7 Unix默认的Unix shell,替代执行文件同为sh的Thompson shell。微软的Windows操作系统也提供了命令行壳层的功能,它们是Windows 95 / 98下的`command.com`、Windows NT内核下的`cmd.exe`以及`PowerShell`。 + +下面的`Python 列表`包含了常见Unix系统常见的`shell`: + +```python +shells = [ + 'Bourne shell(sh)', + 'Almquist shell(ash)', + 'Debian Almquist shell(dash)', + 'Bourne-Again shell(bash)', + 'Korn shell(ksh)', + 'Z shell(zsh)', + 'C shell(csh)', + 'TENEX C shell(tcsh)', + 'EMACS shell (eshell)', + 'Es shell(es)', + 'esh (Unix) – Easy Shell', + 'friendly interactive shell(fish)', + 'rc shell(rc)– shell for Plan 9 from Bell Labs and Unix', + 'scsh(Scheme Shell)', + 'Stand-alone Shell(sash)', + 'BeanShell(bsh,bsh.Interpreter , bsh.Console)', + 'Rhino JavaScript壳层(org.mozilla.javascript.tools.shell.Main)' +] +``` + +通过shell,我们可以让操作系统执行Python程序。而Python是解释型语言,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。有两种执行Python程序的方式,下面的`Python 字典`包含了这两种方式的信息: + +```python +run = { + "repl": { + "title": "交互式编程( Interactive )", + "desc": [ + "打开终端,输入 python 回车", + "进入 Python 交互式命令行", + "输入 print('monkey king is coding!')" + ] + }, + "source": { + "title": "Python 源代源文件( File )", + "desc": [ + "使用你喜欢的编辑器拷贝本练习的代码, 保存为run.py", + "打开终端,cd 到 run.py 保存的目录", + "输入 python run.py" + ] + } +} +``` + +交互式命令行通常也称`REPL`,表示`Read-Eval-Print-Loop`,顾名思义是:`读取`-`评估`-`打印`-`循环`的意思。当你在`shell`环境里输入`python`并回车,就进入了`Python的REPL环境`,程序总是: + +1. 等待用户输入 Python 代码 +2. 当收到回车信号后就读取(`Read`)用户输入的 Python 代码 +3. 解释读取到的 Python 代码(`Eval`) +4. 打印Python 代码的解释结果(`Print`) +5. 回到步骤1,循环(`Loop`)该过程 + +实际上,我们在之前的习题里已经见过这样的程序,经过重新认识后,现在可以再次编写一个这样的`REPL`程序,**功能需求如下**: + +* 提示用户选择想要了解的Python 的两种运行方式 +* 用户选择后输出对应Python 运行方式的基本说明,如果用户输入错误则提示后让用户重新选择 +* 循环该过程直到用户输入`q`退出 +* 最后输出用户学习了几种运行方式 + +基本代码框架如下: + +```python +if __name__ == '__main__': + run = { + "i": { + "title": "交互式编程( Interactive )", + "desc": [ + "打开终端,输入 python 回车", + "进入 Python 交互式命令行", + "输入 print('monkey king is coding!')" + ] + }, + "f": { + "title": "Python 源代源文件( File )", + "desc": [ + "使用你喜欢的编辑器拷贝本练习的代码, 保存为run.py", + "打开终端,cd 到 run.py 保存的目录", + "输入 python run.py" + ] + } + } + + print("有两种基本的方式运行 Python") + for s in run: + item = run.get(s) + print("* {}: {}".format(s, item['title'])) + + has_learn_i = False + has_learn_f = False + + # TODO(You): 请在此实现代码 + + if has_learn_i and has_learn_f: + print("[2/2]您已完成两种 Python 运行方式的学习") + elif has_learn_f: + print("[1/2]您已完成 Python 源代码方式运行学习") + elif has_learn_i: + print("[1/2]您已完成 Python 交互式命令行运行学习") + else: + print("[0/2]您似乎跳过了运行方式的学习?期待下次光临!") +``` + +程序的示例操作过程如下: + +```bash +有两种基本的方式运行 Python +* repl: 交互式编程( Interactive ) +* source: Python 源代源文件( File ) +请选择你想了解的 Python 运行方式(输入:r/s选择,输入 q 退出):r +0. 打开终端,输入 python 回车 +1. 进入 Python 交互式命令行 +2. 输入 print('monkey king is coding!') +请选择你想了解的 Python 运行方式(输入:r/s选择,输入 q 退出):s +0. 使用你喜欢的编辑器拷贝本练习的代码, 保存为run.py +1. 打开终端,cd 到 run.py 保存的目录 +2. 输入 python run.py +请选择你想了解的 Python 运行方式(输入:r/s选择,输入 q 退出):q +[2/2]您已完成两种 Python 运行方式的学习 +``` + +以下选项是对代码中`TODO`部分的多种实现,你能找出实现错误的选项吗? + +## template + +```python +if __name__ == '__main__': + run = { + "repl": { + "title": "交互式编程( Interactive )", + "desc": [ + "打开终端,输入 python 回车", + "进入 Python 交互式命令行", + "输入 print('monkey king is coding!')" + ] + }, + "source": { + "title": "Python 源代源文件( File )", + "desc": [ + "使用你喜欢的编辑器拷贝本练习的代码, 保存为run.py", + "打开终端,cd 到 run.py 保存的目录", + "输入 python run.py" + ] + } + } + + print("有两种基本的方式运行 Python") + shoutcut_keys = {} + for name in run: + key = name[0].lower() + shoutcut_keys[key] = name + item = run.get(name) + print("* {}: {}".format(name, item['title'])) + + has_learn_repl = False + has_learn_source = False + + while True: + ret = input("请选择你想了解的 Python 运行方式(输入:r/s选择,输入 q 退出):") + if ret == 'q': + break + elif ret == 'r': + has_learn_repl = True + elif ret == 's': + has_learn_source = True + + name = shoutcut_keys.get(ret) + if name is None: + print("[错误] 不支持的运行方式") + else: + item = run.get(name) + desc = item['desc'] + for i in range(0, len(desc)): + print("{}. {}".format(i, desc[i])) + + if has_learn_repl and has_learn_source: + print("[2/2]您已完成两种 Python 运行方式的学习") + elif has_learn_source: + print("[1/2]您已完成 Python 源代码方式运行学习") + elif has_learn_repl: + print("[1/2]您已完成 Python 交互式命令行运行学习") + else: + print("[0/2]您似乎跳过了运行方式的学习?期待下次光临!") +``` + +## 答案 + +```python +while True: + ret = input("请选择你想了解的 Python 运行方式(输入:r/s选择,输入 q 退出):") + if ret == 'r' or ret == 's': + has_learn_repl = ret=='r' + has_learn_source = ret=='s' + desc = run.get(shoutcut_keys.get(ret))['desc'] + for i in range(0, len(desc)): + print("{}. {}".format(i, desc[i])) + elif ret != 'q': + print("[错误] 不支持的运行方式") + break + else: + pass +``` + +## 选项 + +### 普通实现 + +```python +while True: + ret = input("请选择你想了解的 Python 运行方式(输入:r/s选择,输入 q 退出):") + if ret == 'q': + break + elif ret == 'r': + has_learn_repl = True + elif ret == 's': + has_learn_source = True + + name = shoutcut_keys.get(ret) + if name is None: + print("[错误] 不支持的运行方式") + else: + item = run.get(name) + desc = item['desc'] + for i in range(0, len(desc)): + print("{}. {}".format(i, desc[i])) +``` + +### 合并错误处理 + +```python +while True: + ret = input("请选择你想了解的 Python 运行方式(输入:r/s选择,输入 q 退出):") + + name = shoutcut_keys.get(ret) + if name is None: + if ret=='q': + break + else: + print("[错误] 不支持的运行方式") + continue + + has_learn_repl = ret=='r' + has_learn_source = ret=='s' + + desc = run.get(name)['desc'] + for i in range(0, len(desc)): + print("{}. {}".format(i, desc[i])) +``` + +### 极简模式 + +```python +while True: + ret = input("请选择你想了解的 Python 运行方式(输入:r/s选择,输入 q 退出):") + if ret == 'r' or ret == 's': + if ret=='r': + has_learn_repl = True + else: + has_learn_source = True + item = run.get(shoutcut_keys.get(ret)) + desc = item['desc'] + for i in range(0, len(desc)): + print("{}. {}".format(i, desc[i])) + elif ret == 'q': + break + else: + print("[错误] 不支持的运行方式") +``` diff --git "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.py" "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.py" index 2620f8f1ab9e27c35a6ad27e62d80054f67363e1..cbdbb5e0b52e1ab5bfcd2edc1318e2a02a102370 100644 --- "a/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.py" +++ "b/data/1.python\345\210\235\351\230\266/1.\351\242\204\345\244\207\347\237\245\350\257\206/4.\350\277\220\350\241\214\346\226\271\345\274\217/run.py" @@ -3,9 +3,9 @@ # 标题:Python 运行方式 # 描述:提示用户选择想要了解的Python 的两种运行方式,选择后输出对应方式的基本说明,最后输出用户学习了几种运行方式 -def test(): +if __name__ == '__main__': run = { - "i": { + "repl": { "title": "交互式编程( Interactive )", "desc": [ "打开终端,输入 python 回车", @@ -13,7 +13,7 @@ def test(): "输入 print('monkey king is coding!')" ] }, - "f": { + "source": { "title": "Python 源代源文件( File )", "desc": [ "使用你喜欢的编辑器拷贝本练习的代码, 保存为run.py", @@ -24,39 +24,39 @@ def test(): } print("有两种基本的方式运行 Python") - for s in run: - item = run.get(s) - print("* {}: {}".format(s, item['title'])) + shoutcut_keys = {} + for name in run: + key = name[0].lower() + shoutcut_keys[key] = name + item = run.get(name) + print("* {}: {}".format(name, item['title'])) - has_learn_i = False - has_learn_f = False + has_learn_repl = False + has_learn_source = False while True: - ret = input("请选择你想了解的 Python 运行方式(输入:i/f选择,输入 q 退出):") + ret = input("请选择你想了解的 Python 运行方式(输入:r/s选择,输入 q 退出):") if ret == 'q': break - elif ret == 'i': - has_learn_i = True - elif ret == 'f': - has_learn_f = True + elif ret == 'r': + has_learn_repl = True + elif ret == 's': + has_learn_source = True - item = run.get(ret) - if item is None: + name = shoutcut_keys.get(ret) + if name is None: print("[错误] 不支持的运行方式") else: + item = run.get(name) desc = item['desc'] for i in range(0, len(desc)): print("{}. {}".format(i, desc[i])) - if has_learn_i and has_learn_f: + if has_learn_repl and has_learn_source: print("[2/2]您已完成两种 Python 运行方式的学习") - elif has_learn_f: + elif has_learn_source: print("[1/2]您已完成 Python 源代码方式运行学习") - elif has_learn_i: + elif has_learn_repl: print("[1/2]您已完成 Python 交互式命令行运行学习") else: print("[0/2]您似乎跳过了运行方式的学习?期待下次光临!") - - -if __name__ == '__main__': - test()