技能书答题——python

一、预备知识

1.python简介

Hello World

答案

if __name__ == '__main__':
    str1 = "Hello,"
    str2 = "World!"
    print('str1'+'str2')

解析
直接把str1和str2当成字符串而不是变量当然不可能输出hello world

注:

  1. eval的用法是把括号里面的代码用python执行一下
str1="Helo,"   
str2="World!"   
print(eval("str1+str2"))


#### Helo,World!
  1. 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

解析

  1. 因为ret只有在用户输入r或s时才有值,如果用户输入其他字符,那么ret就没有值,会导致程序出错。应该在判断用户输入是否合法后再进行has_learn_repl和has_learn_source的赋值操作.
  2. 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)

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>