python 2.11 软件开发目录规范 + 考试题

2. 项目开发规范

现阶段,我们在开发一些程序时(终端运行),应该遵循一些结构的规范,让你的系统更加专业。

软件规范目录结构
bin 目录,执行程序的目录,小型项目一般放到程序的根目录,不会创建该目录,省略了环境变量的设置
conf目录,配置文件的目录
core 目录,核心代码的目录
lib 目录,共享模块的目录
db 目录 ,数据库的目录
log 目录,日志的目录
interface 接口目录
readme.md  项目说明书 !!!一定要有,规范

2.1 单文件应用

当基于python开发简单应用时(一个py文件就能搞定),需要注意如下几点。

"""
文件注释
"""

import re
import random

import requests
from openpyxl import load_workbook

DB = "XXX"


def do_something():
    """ 函数注释 """

    # TODO 待完成时,下一期实现xxx功能
    for i in range(10):
        pass


def run():
    """ 函数注释 """

    # 对功能代码进行注释
    text = input(">>>")
    print(text)


if __name__ == '__main__':
    run()
image-20210105160728297

2.2 单可执行文件

新创建一个项目,假设名字叫 【crm】,可以创建如下文件和文件夹来存放代码和数据。

crm
├── app.py        文件,程序的主文件(尽量精简)
├── config.py     文件,配置文件(放相关配置信息,代码中读取配置信息,如果想要修改配置,即可以在此修改,不用再去代码中逐一修改了)
├── db            文件夹,存放数据
├── files         文件夹,存放文件
├── src           包,业务处理的代码
└── utils         包,公共功能

示例程序见附件:crm.zip

image-20210105163335127

2.3 多可执行文件

新创建项目,假设名称叫【killer】,可以创建如下文件和文件夹来存放代码和数据。

killer
├── bin					文件夹,存放多个主文件(可运行)
│   ├── app1.py
│   └── app2.py
├── config              包,配置文件
│   ├── __init__.py
│   └── settings.py
├── db                  文件夹,存放数据
├── files               文件夹,存放文件
├── src                 包,业务代码
│   └── __init__.py
└── utils               包,公共功能
    └── __init__.py

image-20210105164740583

总结

  1. json格式和json模块
  2. json模块处理特殊的数据类型
  3. datetime格式与字符串、时间戳以及相关之间的转换。
  4. datetime格式时间与timedelta的加减。
  5. 两个datetime相减可以计算时间间隔,得到的是一个timedelta格式的时间。
  6. 了解正则表达式的编写方式和python中re模块的使用。
  7. 项目开发规范。
  • 视频的文件名为:视频id-年-月-日-时-分-秒.mp4

  • 视频下载代码示例

    import requests
    
    res = requests.get(
        url='https://video.pearvideo.com/mp4/adshort/20210105/cont-1715046-15562045_adpkg-ad_hd.mp4'
    )
    
    # 视频总大小(字节)
    file_size = int(res.headers['Content-Length'])
    
    download_size = 0
    with open('xxx.mp4', mode='wb') as file_object:
        # 分块读取下载的视频文件(最多一次读128字节),并逐一写入到文件中。 len(chunk)表示实际读取到每块的视频文件大小。
        for chunk in res.iter_content(128):
            download_size += len(chunk)
            file_object.write(chunk)
            file_object.flush()
            message = "视频总大小为:{}字节,已下载{}字节。".format(file_size, download_size)
            print(message)
        file_object.close()
    
    res.close()
    
  • 下载的过程中,输出已下载的百分比,示例代码如下:

    import time
    
    print("正在下载中...")
    for i in range(101):
        text = "\r{}%".format(i)
        print(text, end="")
        time.sleep(0.2)
    
    print("\n下载完成")
    

考试题手写

  1. 一个大小为100G的文件 etl_log.txt,要读取文件中的内容,写出具体过程代码。

  2. 编写一个函数,这个函数接受一个文件夹名称作为参数,寻找文件夹中所有文件的路径并输入(包含嵌套)。

  3. 以下的代码数据的结果是什么?

    def extend_list(val,data=[]):
        data.append(val)
        return data
    
    list1 = extend_list(10)
    list2 = extend_list(123,[])
    list3 = extend_list("a")
    
    print(list1,list2,list3)
    
  4. python代码获取命令行参数。

  5. 简述深浅拷贝?

  6. 基于推导式一行代码生成1-100以内的偶数列表。

  7. 请把以下函数转化为python lambda匿名函数

    def add(x,y):  
        return x+y
    
  8. 看代码写结果

    def num():
        return [lambda x: i * x for i in range(4)]
    
    result = [m(2) for m in num()]
    print(result)
    
  9. 列表推导式和生成器表达式 [i % 2 for i in range(10)] 和 (i % 2 for i in range(10)) 输出结果分别是什么?

  10. 写装饰器

    # 写timer装饰器实现:计算fun函数执行时间,并将结果给 result,最终打印(不必使用datetime,使用time.time即可)。
    
    @timer
    def func():
        pass
    
    result = func()
    print(result) 
    
  11. re的match和search区别?

  12. 什么是正则的贪婪匹配?或 正则匹配中的贪婪模式与非贪婪模式的区别?

  13. sys.path.append("/root/mods")的作用?

  14. 写函数

    有一个数据结构如下所示,请编写一个函数从该结构数据中返画由指定的 字段和对应的值组成的字典。如果指定字段不存在,则跳过该字段。
    DATA = {
        "time": "2016-08-05T13:13:05",
        "some_id": "ID1234",
        "grp1": {"fld1": 1, "fld2": 2, },
        "xxx2": {"fld3": 0, "fld4": 0.4, },
        "fld6": 11,
        "fld7": 7,
        "fld46": 8
    }
    
    fields:由"|"连接的以fld开头的字符串, 如fld2|fld7|fld29  
    
    def select(fields):
        print(DATA)
        return result
    
  15. 编写函数,实现base62encode加密(62进制),例如:

    内部维护的数据有:0123456789AB..Zab..z(10个数字+26个大写字母+26个小写字母)。
    当执行函数:
    	base62encode(1),获取的返回值为1
    	base62encode(61),获取的返回值为z
    	base62encode(62),获取的返回值为10
    
  16. 基于列表推导式一行实现输出9*9乘法表。

posted @ 2022-01-24 13:08  mmszxc  阅读(76)  评论(0)    收藏  举报