版权声明:本文为博主原创文章,未经博主允许不得转载。 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中的垃圾回收机制。
答案:
- 当内存中有不再使用的部分时,即引用计数(一种python的内存管理机制)为0的对象,垃圾收集器就会把他们清理掉。还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。
- 垃圾回收机制还有一个循环垃圾回收器,确保释放循环引用对象(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. 用自己的语言说一下什么是多态(简洁)
答案:
多态就是同一种事物的多种形态,如不同的子类对象调用相同的父类方法,产生不同的执行结果