面试题 - 1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/apollo_miracle/article/details/82998187

1. 下面代码会输出什么?说明理由。

def f(x,L=[]):
    for i in range(x):
        L.append(i*i)
    print(L)

f(2)
f(3,[3,2,1])
f(3)

答案: 

[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]

原因:函数的形参如果设置了默认参数,且默认参数为可变类型,在调用时,如果不传递参数值,使用默认参数,则默认参数使用同一个引用地址的数据,不会进行二次初始化

2. 下面代码会输出什么?说明理由。

a = [1,2,3]
b = a
b += [1,2,3]
print(a,b)

c = [1,2,3]
d = c
d = d + [1,2,3]
print(c,d)

答案:

a = [1,2,3]
b = a # a,b用的同一块内存空间
b += [1,2,3] # b.extend([1,2,3]) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
print(id(a))  # 140276163651016
print(id(b))  # 140276163651016
print(a,b) # [1, 2, 3, 1, 2, 3] [1, 2, 3, 1, 2, 3]

c = [1,2,3]
d = c # 此时c,d用的同一块内存空间
d = d + [1,2,3] # 修改了d的指向,又开辟了一块空间
print(id(c))  # 140276162975624
print(id(d))  # 140276162975880
print(c,d)  # [1, 2, 3] [1, 2, 3, 1, 2, 3]

3. 使用map和匿名函数生成一个列表,其中列中的元素都满足对1-10内的数据做平方和再加1的处理。

答案:

"""
map(function, iterable):会根据提供的函数对指定序列做映射,
                第一个参数 function 以参数序列中的每一个元素调用 function 函数,
                返回包含每次 function 函数返回值的新列表
参数:
    function -- 函数
    iterable -- 一个或多个序列
返回值:
    Python 2.x 返回列表。
    Python 3.x 返回迭代器。
"""

num_list = map(lambda x: x * x + 1, range(6))
# for num in num_list:
#     print(num)
print(list(num_list))

4. 写一个三次认证(编程):实现用户输入用户名和密码,当用户名为 admin 或 guest 且 密码为 123 时,显示登录成功,否则登录失败,失败时允许重复输入三次。

答案:

i = 0
while i < 3:
    username = input("请输入用户名:")
    pwd = input("请输入密码:")
    if username in ('admin', 'guest') and pwd == '123':
        print("登陆成功!")
        break
    else:
        if i < 2:
            print("登陆失败,请再次输入(^_^)")
        else:
            print("登陆失败!")
        i += 1

5. 随意编写两个对输入参数做加减乘除运算的函数(需要有除法),写完后,用装饰器实现对函数出现除数为0这种异常的捕获,如果有异常,使用print打印日志

答案:

"""
日志级别: debug < info < warning < error < critical
logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
logging.info('info级别,正常输出信息,一般用来打印一些正常的操作')
logging.warning('waring级别,一般用来打印警告信息')
logging.error('error级别,一般用来打印一些错误信息')
logging.critical('critical 级别,一般用来打印一些致命的错误信息,等级最高')

"""

import logging


def func(func):
    def call_func(*args, **kwargs):
        # 捕获异常
        try:
            func(*args, **kwargs)
        except Exception as error:
            logging.warning(error)

    return call_func


@func
def op(num1, num2):
    a = num1 + num2
    b = num1 - num2
    c = num1 * num2
    d = num1 / num2
    print(a, b, c, d)


num1 = int(input("请输入第一个数字:"))
num2 = int(input("请输入第二个数字:"))
op(num1, num2)

6. 简述python中的垃圾回收机制。

答案:

  1. 当内存中有不再使用的部分时,即引用计数(一种python的内存管理机制)为0的对象,垃圾收集器就会把他们清理掉。还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。
  2. 垃圾回收机制还有一个循环垃圾回收器,确保释放循环引用对象(a引用b,b引用a,导致其引用计数永远不为0)。

7. 简述python成员私有化的原理。下例中,如何在外部直接将 __score 改为120?

class score:
    def __init__(self):
        self.__score = 59

    def get_score(self):
        print(self.__score)

    def set_score(self, value):
        if value <= 100:
            self.__score = value
            print(self.__score)
        else:
            print("....")

答案:

原理:python会对私有成员进行名称改编为_Class__object,即保存的是:_score__score

class score:
    def __init__(self):
        self.__score = 59

    def get_score(self):
        print(self.__score)

    def set_score(self, value):
        if value <= 100:
            self.__score = value
            print(self.__score)
        else:
            print("....")


stu = score()
# print(stu._score__score)
stu._score__score = 120
print(stu._score__score)
# dir():内置函数,列出对象的所有属性及方法
print(dir(stu))
# 输出
"""
120
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_score__score', 'get_score', 'set_score']
"""

8. 用自己的语言说一下什么是多态(简洁)

答案:

多态就是同一种事物的多种形态,如不同的子类对象调用相同的父类方法,产生不同的执行结果

猜你喜欢

转载自blog.csdn.net/apollo_miracle/article/details/82998187