技能书答题——python
一、预备知识
1.python简介
Hello World
答案
if __name__ == '__main__':
str1 = "Hello,"
str2 = "World!"
print('str1'+'str2')
解析
直接把str1和str2当成字符串而不是变量当然不可能输出hello world
注:
- eval的用法是把括号里面的代码用python执行一下
str1="Helo,"
str2="World!"
print(eval("str1+str2"))
#### Helo,World!
- join的用法
str_list = ["Hello,","World!"]
res = ''.join(str_list)
2.程序设计思想
2.1 编程语言简史
答案
if __name__ == '__main__':
languages = ...
years = ...
for language in languages:
for year in years:
print(language, ':', year)
解析
错误选项:一个语言都和每个年份一起打印了出来,正确的应该是一个语言按顺序对应一个年份。
2.2 编程语言发明家
答案
def parse_creators(creators):
profiles = []
i = 0
while i<len(creators):
creator = creators[i]
name, achievement = parse_parts(creator)
profiles.append({ 'name_cn': name, 'name_en': name, 'achievement': achievement })
i+=1
return profiles
解析
缺少继续拆分中英文姓名的功能
2.3 Alice、Bob 和他们的朋友们
答案
class CryptographyCity:
def __init__(self):
self.peoples = []
def add(self, text):
parser = SimpleCryptographyPeopleParser(text)
people = parser.parse(text)
self.peoples.append(people)
def introduce():
for people in peoples:
say(people)
def say(people):
info = f'{people.name_cn}({people.name_en}): 密码学家说我是一位{people.role},{people.desc}。'
print(info)
解析
class中定义函数的正确写法,即类中定义函数必须要有一个self参数
3.安装python
Python 安装交互式查询程序
答案
while True:
ret = input("请选择安装平台[w/c/u/m, 按q退出]:")
platform = shortcut_keys.get(ret)
if ret == 'q':
break
if platform is None:
print("不支持的平台")
break
doc = install.get(platform)
print(f"{platform}: {doc}")
解析
break退出循环,continue结束本次循环,进入下一轮循环。
4.运行方式
操作系统如何运行程序
答案
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
解析
- 因为ret只有在用户输入r或s时才有值,如果用户输入其他字符,那么ret就没有值,会导致程序出错。应该在判断用户输入是否合法后再进行has_learn_repl和has_learn_source的赋值操作.
- ret == ‘r’ or ret == 's’也符合elif的判断
5.常用开发工具
现代集成开发环境(IDE)
答案
find_records = {}
for top_ide in top_ides:
for py_ide in py_ides:
py_ide_name = py_ide['name']
if not find_records.get(py_ide_name):
if py_ide['name'].lower() == top_ide['IDE'].lower():
find_records[py_ide['name']] = True
dump_join_result(py_ide, top_ide)
解析
错误的打印是在满足两个都有同样IDE名称的时候打印共有的三个IDE信息,而其他的都是打印下面四个IDE信息。
可更改为
find_records = {}
find_records_names = []
for top_ide in top_ides:
for py_ide in py_ides:
py_ide_name = py_ide['name']
if not find_records.get(py_ide_name):
if py_ide['name'].lower() == top_ide['IDE'].lower():
find_records[py_ide['name']] = True
find_records_names.append(py_ide['name'].lower())
dump_join_result(py_ide, top_ide)
for py_ide in py_ides:
if py_ide['name'].lower() not in find_records_names:
dump_join_result(py_ide, None)
6.编码规范
代码规范(风格)
答案
if not word in word_dict:
word_info = {'word': word, 'count': 0}
word_dict[word] = word_info
word_info['count'] += 1
解析
其他正确选项的第一句都是:word_info = word_dict.get(word)。作用是将word_info指向word_dict中对应的值上。缺少这一句的话,word_info会指向上一个while循环的位置。
举例说明:
guides = “a b c d a b ” # 因为在分割符位置进行计数,所以最后要有一个空格,才能将最后一个数计入
''' 输出结果 '''
单词排行榜
--------
1. 单词:d, 词频:3
2. 单词:a, 词频:1
3. 单词:b, 词频:1
4. 单词:c, 词频:1
7.模块管理
7.1 Python标准库模块导入
答案
import time.time
if __name__ == '__main__':
print(time())
解析
没有time.time模块,所以无法导入。可以frome time import time 。time.time()返回的是时间戳。
7.2 从前有座山,山上有座庙,庙里有个老和尚说:使用Python 包(package)组织代码
答案
import sys
if __name__ == '__main__':
while True:
import parent
import parent.one.one
import parent.two
del sys.modules['parent']
del sys.modules['parent.one.one']
del sys.modules['parent.two']
解析
注:导入子目录会自动导入父目录的module
import parent
缓存已有---无
输出---从前有座山,
缓存新增---parent
import parent.one.one
缓存已有---parent
输出---山上有座庙,庙里有个老和尚,
缓存新增---parent.one, parent.one.one
import parent.two
缓存已有---parent,parent.one, parent.one.one
输出---老和尚说
缓存新增---parent.two
del sys.modules['parent']
缓存还有---parent.one, parent.one.one, parent.two
del sys.modules['parent.one.one']
缓存还有---parent.one, parent.two
del sys.modules['parent.two']
缓存还有---parent.one (这里没删干净!!!!!)
(下一次循环)
import parent
缓存已有---parent.one
输出---从前有座山,
缓存新增--- parent
import parent.one.one
缓存已有---parent.one, parent
输出--庙里有个老和尚,(这里因为parent.one缓存还在,不会执行“山上有座庙”)
...
7.3 使用相对路径导入包
答案
import ..subpackage2.moduleZ
解析
import module_name。即import后直接接模块名
from package_name import module_name。一般把模块组成的集合称为包(package)。与第一种写法类似,Python会在sys.path和运行文件目录这两个地方寻找包,然后导入包中名为module_name的模块。
二、基础语法
1.缩进规则
看不见的开始和结束
答案
if __name__ == '__main__':
i = 0
c = 5
max = 10
while i < max:
d = max-i-i
if abs(d) < 3:
print(i, max-i)
else:
pass
i += 1
解析
缩进问题
2.函数
2.1 使用函数组织代码
答案
circulate_print(str, count)
解析
没有count+1,会导致死循环
2.2 循环计算阶乘函数
答案
import math
z = n + 1
p = [1.000000000190015, 76.18009172947146, -86.50532032941677,
24.01409824083091, -1.231739572450155, 1.208650973866179E-3, -5.395239384953E-6]
d1 = math.sqrt(2 * math.pi) / z
i = 1
d2 = p[0]
while i <= 6:
d2 += p[i] / (z + i)
i += 1
d3d4 = math.pow((z + 5.5), (z + 0.5))*math.exp(-(z + 5.5))
d = d1 * d2 * d3d4
r = int(d)
解析
计算的不是阶乘
2.3 Python 函数递归(1)
答案
def inner_fact(n, m, r):
if m == n:
return r
return inner_fact(n, m+1, r*m)
def fact4(n):
return inner_fact(n, 1, 1)
解析
m 等于 n 时, 阶乘 r 还只是乘到了 m - 1, 没有乘到 m, 计算 10 的阶乘, 实际只计算了 9 的阶乘
代码可以改为
def inner_fact(n, m, r):
if m == n:
return r
return inner_fact(n, m+1, r*m)
def fact4(n):
return inner_fact(n+1, 1, 1)
2.4 Python 斐波那契(fibonacci)(I)
答案
def fibonacci_inner(n, r):
if n == 1 or n == 2:
return r
return fibonacci_inner(n-1, fibonacci_inner(n-2, r))
def fibonacci4(n):
return fibonacci_inner(n, 0)
解析
r没有参与到迭代中
改为
def fibonacci_inner(n, r):
if n == 1 or n == 2:
return r
return fibonacci_inner(n-1, fibonacci_inner(n-2, r+1))
def fibonacci4(n):
return fibonacci_inner(n, 1)