新鲜出炉面试题(三)

简介: 新鲜出炉面试题(三)

面试题

1.通过装饰器装饰的函数如何不改变其自身相关信息

答:可以使用模块 functools 中的 wraps 装饰器来装饰自定义装饰器的内函数。(有点绕口,下面查看示例)正常情况下被装饰的函数,虽然可以使用原函数名进行调用,但实际上此时的函数名指向了装饰器的内函数,可以通过打印 __name__ 以及 __doc__ 属性来验证。使用 wraps 后,被装饰的函数相关信息就会全部保留。

from functools import wraps  # <-- 导入模块
# 定义一个装饰器
def eg_decorator(func):
    @wraps(func)    # <-- 使用装饰器
    def wrapper(*args, **kwds):
        """内函数"""
        print('我是装饰器啊...')
        return func(*args, **kwds)
    return wrapper
# 使用定义的装饰器装饰函数
@eg_decorator
def noname():
    """
    函数自身
    :return: 无返回
    """
    print('我是示例函数噻...')
# 调用函数
noname()
# 打印函数的 __name__ 属性
print(noname.__name__)
# 打印函数的文档字符串
print(noname.__doc__)

然后查看输出结果进行验证:

我是装饰器啊...
我是示例函数噻...
noname
    函数自身
    :return: 无返回

2.手写一个类,可以连接 redis 并实现 get 和 set 方法

import redis
class RedisTest(object):
    def __init__(self, ip: str, port: int):
        self.conn = redis.Redis(host=ip, port=port, decode_responses=False)
    def get(self, key: str) -> str:
        return self.conn.get(key)
    def set(self, key, value):
        self.conn.set(key, value)
redis_obj = RedisTest('127.0.0.1', 6379)
redis_obj.set('name', 'ethanyan')
name = redis_obj.get('name')
print(name) # b'ethanyan'

3.elasticsearch 二次查询

答:elasticsearch 中可以通过 terms lookup (跨索引查询)实现二次查询。例如查询某个用户关注列表中所有用户发表的主帖,如果是拆开查询,需要两步:先查出关注列表,再查询发表的主帖。而使用 terms lookup 查询只需要一步即可。

POST my-index-post/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "user_item_id": {
              "index": "my-index-user",
              "type": "user",
              "id": "0f42d65be1f5287e1c9c26e3728814aa",
              "path": "friends"
            }
          }
        }
      ]
    }
  }
}

此示例来源于 https://www.playpi.org/2019060601.html。

分析一下上面的 DSL 语句,它先利用 id 查询用户索引my-index-user/user,返回关注列表 friends 中的所有 item_id;然后利用上一步骤中返回的 itemt_id 列表,去匹配主帖的 user_item_id 字段,从而查询所有的主帖。

4.语法糖 property

答:python 中提供了一个装饰器 property ,在使用对象的私有属性时,可以不再使用属性的函数的调用方式,而像普通的公有属性一样去使用属性。简单进行举例,假设一个类中有一些私有属性,我们可以通过 set/get 方法,专门来为这些私有属性提供访问接口以及设置属性时的校验操作,增加程序的健壮性和安全性,但这样操作后接口调用比较繁琐,使用装饰器 property 后,再去设置或访问私有属性时,如同正常公有属性一样实现无感操作。

如果需要设计一个「银行账户类」,只需提供姓名和余额的访问与设置操作即可。首先看一下传统的 set/get 方法:

class Account(object):
    def __init__(self, name, money):
        # 为了安全性考虑,不能向外部直接暴露私密信息
        self.__name = name  # 帐户人姓名
        self.__balance = money  # 帐户余额
    def get_name(self):
        return self.__name
    def set_balance(self, money):
        if isinstance(money, int):
            if money >= 0:
                self.__balance = money
            else:
                raise ValueError('输入的金额不正确')
        else:
            raise ValueError('输入的金额不是数字')
    def get_balance(self):
        return self.__balance

如果需要设置账户的余额,就需要调用方法 set_balance,而使用装饰器后,则大大进行了简化:

class Account(object):
    def __init__(self, name, money):
        self.__name = name  # 帐户人姓名
        self.__balance = money  # 帐户余额
    # property 只能对获取方法装饰,并且获取方法不需要再写 get
    @property
    def name(self):
        return self.__name
    # 如果 property 装饰的属性还有 set 方法,需要写到 get方法后定义
    @property
    def balance(self):
        return self.__balance
    # 实现 set 方法, 格式: @xxx.setter ,xxx 要和property装饰的方法名一致
    @balance.setter
    def balance(self, money):
        if isinstance(money, int):
            if money >= 0:
                self.__balance = money
            else:
                raise ValueError('输入的金额不正确')
        else:
            raise ValueError('输入的金额不是数字')
# 可以像共有属性一样进行访问与设置
ac = Account('tom', 10)
print(ac.name)
print(ac.balance)
ac.balance = 1000
print(ac.balance)

5.简单介绍一下 with 语句

答:with 语句是一种简化的语法,适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的「清理」操作,释放资源。比如在连接数据库并进行相关操作后可以自动关闭,无需手动调用。其原理为自动调用了上下文管理器中的关闭语句,内部主要有两个方法构成 __enter__ 和 __exit__。__enter__ 方法会在执行 with 后面的语句时执行,一般用来处理操作前的内容。比如一些创建对象,初始化等。__exit__ 方法会在 with 内的代码执行完毕后执行,一般用来处理一些善后收尾工作,比如文件的关闭,数据库的关闭等。

相关文章
|
2月前
|
人工智能 缓存 自然语言处理
阿里云百炼模型订阅怎么选?Token Plan、Coding Plan与Night Plan节省计划对比指南
阿里云百炼作为一站式大模型服务平台,提供了丰富的订阅计划与模型服务,覆盖个人开发、团队协作、企业级应用等全场景。从面向个人开发者的Coding Plan,到团队协同的Token Plan,再到夜间特惠的Night Plan与成本优化的AI通用节省计划,不同计划在计费模式、模型支持、使用限制上差异显著。本文将系统拆解百炼四大核心订阅计划,详解Qwen系列模型能力差异,提供完整API接入代码与配置流程,并给出不同场景下的选型与省钱策略,帮助开发者与企业高效、低成本使用大模型服务。
373 1
|
3月前
|
人工智能 自然语言处理 前端开发
阿里云秒悟 Meoo是什么?功能、适用场景、使用教程与最新优惠
阿里云秒悟Meoo是面向AI原生时代的云端极速应用创作平台,主打“会编程、懂设计、自部署”,用户仅用自然语言描述需求,就能在分钟级生成完整前后端代码,自动配置数据库、存储等云资源并一键上线,产出可直接分享的公网链接。平台内置通义千问、Kimi等多类大模型,还支持Meoo CLI实现本地开发与云端部署联动,覆盖个人创意落地、企业MVP原型搭建、运营活动页生成等场景。
|
5月前
|
SQL 机器学习/深度学习 自然语言处理
帆软BI接了智能问数,为什么还是逃不出固定看板的局限?
帆软BI接入智能问数后仍难摆脱固定看板,主因是其依赖预置指标、SQL模板或宽表,提问范围被建设期框架锁死,本质是“预制问答界面”而非真智能。真正破局需转向本体语义层路线——通过业务对象语义建模实现任意问题精准查询,但需配套语义治理投入。
|
5月前
|
人工智能 监控 安全
多模态AI(图像+文本)该怎么测试?不是把图片丢给模型这么简单
本文系统阐述多模态AI测试新范式:突破传统文本测试局限,聚焦图像理解、图文对齐、跨模态推理、幻觉防控、安全注入与鲁棒性验证六大核心维度,提出分层模型、六维测试矩阵及自动化评测体系,强调“证据链”验证——答案必须可追溯至图片真实信息。
|
4月前
|
运维 监控 关系型数据库
运维实战:UnixBench + Geekbench 服务器性能评估完全指南
本文详解服务器基准测试实战:为何必须用UnixBench和Geekbench跑分验证?揭示超售、vCPU定义模糊、性能波动等隐形陷阱;深度解读关键测试项(Dhrystone、File Copy、Crypto等)的运维意义;提供排查框架、自动化方案及选型决策矩阵,助运维科学选型、持续监控、快速定位性能问题。
542 0
|
6月前
|
Web App开发 Rust 前端开发
基于Rust开发的m3u8下载器:支持断点续传、边下边播
M3U8 Quicker是一款轻量(仅2MB)跨平台M3U8下载播放器,基于Tauri+Rust+React开发。支持断点续传、AES解密、边下边播、自动转MP4及Chrome一键抓取地址,让课程保存与媒体管理更高效稳定。
1251 4
|
7月前
|
网络协议
个人/企业通用:Socks5代理服务商选择攻略
选Socks5代理,关键看4点:IP纯净度(属地/运营商真实、存活周期适配)、稳定性(延迟<30ms、断线率<0.1%、支持TCP/UDP)、服务响应(24h支持、多设备授权、透明计费)与性价比(拒绝共享IP陷阱)。避开3坑:虚假节点、共享带宽、协议捆绑收费。实测试用,精准匹配需求。
471 11
|
6月前
|
人工智能 监控 安全
AI应用开发的流程
AI应用开发已转向以模型对齐与数据闭环为核心的迭代范式。其标准生命周期涵盖场景验证、技术选型、数据工程、提示词与智能体编排、评估体系、安全合规及持续监控七阶段,强调实验性、可评估性与可控性。(238字)
|
7月前
|
缓存 运维 安全
Linux coreutils 命令列表
Core Utils 是 GNU 基础工具集,提供近90个常用命令,涵盖文件操作(cp、mv、rm)、文本处理(grep、sort、cut)、系统信息(uname、df、du)、权限管理(chmod、chown)、编码校验(base64、sha256sum)及进程控制(nice、timeout)等核心功能,是 Linux/Unix 系统日常运维与脚本开发的基石。