python 测试

一、基础部分

  1. 给定一个字符串aStr,返回使用空格或者'\t'分割后的倒数第二个子串

    "hello Bruce \t huan \t\nying kai \n\t xue"
    
  • 答案
    print(aStr.split(None)[-2])
    
  1. 一个学校,有3个办公室,现在有8位老师等待工位的分配,请编写程序,完成随机的分配
  • 答案

    import random
    offices = [[], [], []]
    
    
    names = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    
    
    for name in names:
        index = random.randint(0, 2)
        offices[index].append(name)
    
    
    for office in offices:
        print('办公室%d中有老师' % (offices.index(office)+1))
        print(*office)
    
  • 效果图

  1. 请用函数实现一个判断用户输入的年份是否是闰年的程序
  • 答案
    def years(input_years):
        if input_years%4 == 0:
            print('%d是闰年' % input_years)
        else:
            print('%d不是闰年' % input_years)
    
    
    if __name__ == '__main__':
        while True:
            input_years = int(input('请输入年份'))
            years(input_years)
    
  • 效果图
  1. 请任意写一个模块,完成模块的发布,安装和使用
  • 在项目根目录下新建setup.py

    from distutils.core import setup
    
    setup()
    
    • setup()
    参数 备注
    name 字符串
    version 字符串
    description 字符串
    author 字符串
    py_modules 列表
  • 构建模块

    python setup.py build
    
  • 生成发布压缩包

    python setup.py sdist
    
  • 安装

    python setup.py install --prefix=安装路径
    
  1. 写出你理解的进程和线程
  • 答案
    进程 线程
    资源分配的最小单位 程序执行的最小单位
    程序执行时的一个实例 进程的一个执行流
    一个进程有一个或多个线程组成 线程时一个进程中代码的不同执行路线
    进程之间相互独立 同一进程下的各个线程共享程序的数据
  1. 简述网络通信过程TCP ”三次握手“,”四次挥手“
  • 三次握手
    • 第一次握手:建立连接时,客户端向服务器发送一个SYN包,并进入SYN_SENT状态,等待服务器确认
    • 第二次握手:当服务器收到客户端的请求后,此时要给客户端给一个确认信息ACK,同时发送SYN包,此时服务器进入 SYN_RECV状态
    • 第三次握手:客户端收到服务器发的ACK+SYN包后,向服务器发送ACK,发送完毕之后,客户端和服务器进入 ESTABLISHED(TCP连接成功)状态,完成三次握手
  • 四处挥手
    • 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传输,客户端进入FIN_WAIT_1状态
    • 第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序 号),服务器进入CLOSE_WAIT状态
    • 第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传输,服务器进入LAST_ACK状态
    • 第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个AKC给服务器,确认序号为收到序号+1,服务器进入CLOSED状态,完成四次挥手
  1. 写一个正则表达式,匹配11位手机号码
  • 答案
    r"^1[35789]\d{9}$"
    
  1. 举例写出面向对象中的封装,继承,多态,常用内置函数,类方法和静态方法等

  2. 使用Python写一个最简单的http服务器

二、Django

  1. 写出你理解的Django优缺点
  • 优点
    • 功能完善、要素齐全:自带大量常用工具和框架(比如分页,auth,权限管理), 适合快速开发企业级网站。
    • 完善的文档:经过十多年的发展和完善,Django有广泛的实践案例和完善的在线文档。开发者遇到问题时可以搜索在线文档寻求解决方案。
    • 强大的数据库访问组件:Django的Model层自带数据库ORM组件,使得开发者无须学习SQL语言即可对数据库进行操作。
    • Django先进的App设计理念: App是可插拔的,是不可多得的思想。不需要了,可以直接删除,对系统整体影响不大。
    • 自带后台管理系统admin:只需要通过简单的几行配置和代码就可以实现一个完整的后台数据管理控制平台。
    • Django debug信息详尽: 很容易找出代码错误所在。
  • 缺点
    • 大包大揽: 对于一些轻量级应用不需要的功能模块Django也包括了,不如Flask轻便。
    • 过度封装: 很多类和方法都封装了,直接使用比较简单,但改动起来就比较困难。
    • 性能劣势: 与C, C++性能上相比,Django性能偏低,当然这是python的锅,其它python框架在流量上来后会有同样问题。
    • 模板问题: django的模板实现了代码和样式完全分离,不允许模板里出现python代码,灵活度对某些程序员来说可能不够。
  1. 写出Django ORM 常见字段类型和参数
  • 常见的字段类型

    • 数值型
    字段 对应sql
    AutoField 自增主键 int(11)
    BooleanField 布尔类型字段 tinyint(1)
    IntergerField int(11)
    • 字符型
    字段 对应sql
    CharField varchar
    UUIDField char(32)
    EmailField 继承自CharField
    FileField 继承自CharField
    TextField longtext
    ImageField 继承自FileField
    • 日期类型
    字段 对应sql
    DateField date
    DateTimeField datetime
    TimeField time
  • 参数

    参数 备注
    null null用于设定在数据库层面是否允许为空
    blank 针对业务层面,该值是否允许为空
    choices 配置字段的choices后,在admin页面上就可以看到对应的可选项展示
    db_column 默认情况下,定义的field就是对应数据库中的字段名称,通过这个参数可以指定Model中的某个字段对应数据库中的哪个字段
    db_index 数据库索引配置
    default 默认值配置
    help_text 字段提示语,配置这一项后,在页面对应字段的下方会展示此配置
    primary_key 主键,一个Model只允许设置一个字段为primary_key
    unique 唯一约束,当需要配置唯一值时,设置unique=True,设置此项后,不需要设置db_index
    verbose_name 字段对应的展示文案
  1. Django ORM中Models常见的API
    • object.All()
    • object.filter()
    • object.first()
    • save()
  2. 简述Django ORM中F和Q对象
  • F
    • 可以获取到自己的属性值
    • 实现自己关联的复杂条件
    • 支持运算
  • Q
    • 对条件的一个封装
    • 支持逻辑运算
    • 与或非
    • 支持嵌套
  1. 在Django中使用adminlte或xadmin后台

    xadmin的使用

  2. MTV是什么?为什么要使用设计模式?常用的设计模式还有哪些?

  • MTV是一种框架模式
    • M 代表模型 Model ORM
    • T 代表模板 Template 把页面展示给用户
    • V 代表视图 View 业务逻辑
  • 设计模式就是经过前人无数次的实践总结出的,设计过程中可以反复使用的、可以解决特定问题的设计方法
  • 常用的设计模式有单例模式, 工厂模式

三、DRF

  1. 使用DRF的FBV,CBV,GCBV,viewsets开发课程信息的增删改查接口

FBV

@api_view(['GET', 'POST', 'PUT', 'DELETE'])
def cousre(request):
    if request.method == 'GET':
        pass
    if request.method == 'POST':
        pass
    if request.method == 'PUT':
        pass
    if request.method == 'DELETE':
        pass

CBV

class CourseView(APIView):
    def get(request):
        pass
    def post(request):
        pass
    def put(request):
        pass
    def delete(request):
        pass

GCBV

class CourseView(
    generics.GenericAPIView,
    mixins.RetrieveAPIView,
    mixins.CreateModelMixin,
    mixins.UpdateModelMixin,
    mixins.DestroyModelMixin
)
    queryset = Source.objects.all()
    serializer_class = SourceSerializer

viewsets

class CourseView(viewsets.ModelViewSet):
    queryset = Source.objects.all()
    serializer_class = SourceSerializer
  1. DRF权限管理的使用
  • 全局配置settings.py
REST_FRAMEWORK = {
    # 权限
    'DEFAULT_PERMISSION_CLASSES': [
        # 'rest_framework.permissions.IsAuthenticated',
    ],
    # 认证
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
}
  • 视图中配置
    permission_classes = [permissions.IsAuthenticated, permissions,IsAdminUser]

四、其他

  1. 假设前端使用React或Vue,后端使用DRF写一个在线教育网站bwonline,请写出把这个项目部署到阿里云服务器的详细步骤;
    • vue或react项目进行打包
    • drf项目和打包好的vue上传到服务器
    • 创建虚拟环境下载项目中需要的依赖
    • 进入虚拟环境
    • 在项目根目录中创建uwsgi.ini文件,写好uwsgi服务器配置
    • 使用uwsgi启动本地服务器
    • 使用nginx反向代理
    • 使用nginx静态资源转发找到vue项目的index.html
    • end!!!
  2. 使用你所学的爬虫技术,爬取成都所有热门景点,网址为:https://www.tripadvisor.cn/Attractions-g297463-Activities-Chengdu_Sichuan.html#ATTRACTION_SORT_WRAPPER,并且按照评论数进行排名,剔除无效数据,将排名情况通过pyechart柱状图展示出来
posted @ 2021-01-02 11:10  一文g  阅读(486)  评论(0编辑  收藏  举报