蓝桥楼赛第9期-修复未正确实现的实验类

题目描述

  • 程序存放的位置 /home/shiyanlou/lab.py ;

  • 实验类名应该为 Lab ;

  • 实验对象中不能插入重复标签;

  • Python 中对象引用问题,尤其如复合对象 list, dict, tuple 的引用问题;

  • 代码中 FIXME 所在上下文存在 Bug;

要求

题目需使用 Python 3.6 完成,不能使用标准库 和 第三方库。

函数传入 text 为字符串类型,可能为空。

函数返回列表,且应按 text 字符串中的出现的正确用户名次数降序排列,次数相等无先后顺序,且不重复。

示例

然后修复 lab.py 中已经实现的 class Lab,使其能正常工作,lab.py 部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Lab(object):
""" 实验
"""

def __init__(self, name, tags=[]):
self.name = name
# FIXME
self._tags = tags

def insert_tag(self, tag):
""" 插入标签,需要检查标签是否存在
"""
# FIXME
self._tags.append(tag)

@property
def tags(self):
return self._tags[:]

def can_be_started(self, user):
"""判断用户能否启动实验,只有登录的会员用户才能启动实验
"""
# 传入的 user 为用户对象,is_authenticated 为 True 表示已登录
# FIXME
if not user.is_authenticated:
# 如果用户没有登陆
can = False
elif user.is_member:
# 如果用户是会员
can = True
return can
来源:蓝桥(实验楼)
链接:https://www.lanqiao.cn/challenges/2997/

  • 解题思路

    • 初始化函数:

      传值:被调函数局部变量改变不会影响主调函数局部变量

      传址:被调函数局部变量改变会影响主调函数局部变量

      传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针)

      Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值;如果是列表,字典则传址;

      copy使用场景:列表或字典,且内部元素为数字,字符串或元组

      deepcopy使用场景:列表或字典,且内部元素包含列表或字典

  • 题解1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import copy
    class Lab(object):
    """ 实验
    """

    def __init__(self, name, tags=[]):
    self.name = name
    # FIXED
    tags = copy.deepcopy(tags)
    self._tags = tags

    def insert_tag(self, tag):
    """ 插入标签,需要检查标签是否存在
    """
    # FIXED
    if tag:
    if tag not in self._tags:
    self._tags.append(tag)

    @property
    def tags(self):
    return self._tags[:]

    def can_be_started(self, user):
    """判断用户能否启动实验,只有登录的会员用户才能启动实验
    """
    # 传入的 user 为用户对象,is_authenticated 为 True 表示已登录
    # FIXED
    can = False
    if user.is_authenticated:
    if user.is_member:
    can = True
    return can
    • 测试

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      class User(object):
      def __init__(self, is_authenticated, is_member):
      self.is_authenticated = is_authenticated
      self.is_member = is_member
      user = User(True, True)

      lab = Lab('LLL', ['python', 'C'])
      print(lab.tags) # ['python', 'C']
      lab.insert_tag('C++')
      print(lab.tags) # ['python', 'C', 'C++']
      lab.insert_tag('C')
      print(lab.tags) # ['python', 'C', 'C++']
      c = lab.can_be_started(user)
      print(c) True
文章作者: Spaceack
文章链接: http://spaceack.com/2020/09/16/2020-09-16-%E8%93%9D%E6%A1%A5%E6%A5%BC%E8%B5%9B%E7%AC%AC9%E6%9C%9F-%E4%BF%AE%E5%A4%8D%E6%9C%AA%E6%AD%A3%E7%A1%AE%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%AE%9E%E9%AA%8C%E7%B1%BB/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 丸子家的小云吞
支付宝打赏
微信打赏