python基础面试题(四)

1.有一个列表[3,4,1,2,5,6,6,5,4,3,3]请写一个函数,找出该列表中没有重复的数的总和

def func(l):
    res = []
    sum_s = 0
    for i in l:
        if i not in res:
            res.append(i)
            sum_s += i

    return sum_s

list1 = [3, 4, 1, 2, 5, 6, 6, 5, 4, 3, 3]

print(func(list1))  # 21

2.字典根据键从小到大排序

dict={“name”:“zs” , “age”:18, “city”:“深圳”, “tel”:“1362626627”}

在这里插入图片描述

3.map(str,[1,2,3,4,5,6,7,8,9]) 输出是什么

在这里插入图片描述
关于map函数上次面试题有讲,还不清楚的可以看看复习巩固一下。

4.利用collections库的Counter方法统计字符串每个字符出现的次数"kjalfj;你ldsjafl;你hdsllfdhg;lahfbl;hl;ahlf;h"

在这里插入图片描述

5.请简述标准库中functools.wraps的作用

Python装饰器(decorator)在实现的时候,有一些细节需要被注意。例如,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变)。这样有时候会对程序造成一些不便,所以,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。

直接上代码看效果:

# 定义一个最简单的装饰器

  def user_login_data(f):
    def wrapper(*args, **kwargs):
      return f(*args, **kwargs)

    return wrapper

  # 用装饰器装饰以下两个函数
  
  @user_login_data
  def num1():
    print("aaa")



  @user_login_data
  def num2():
    print("bbbb")

  if __name__ == '__main__':
    print(num1.__name__)
    print(num2.__name__)

 #以上代码的输出结果为:

    wrapper

    wrapper

由此函数使用装饰器时,函数的函数名即 __name__已经被装饰器改变.

一般定义装饰器的话可以不用考虑这点,但是如果多个函数被两个装饰器装饰时就报错,因为两个函数名一样,第二个函数再去装饰的话就报错.
解决方案就是引入 functools.wraps ,以上代码的解决如下:
 def user_login_data(f):
    @functools.wraps(f)
      def wrapper(*args, **kwargs):
        return f(*args, **kwargs)
      return wrapper

增加@functools.wraps(f), 可以保持当前装饰器去装饰的函数的 name 的值不变

以上输出结果就是:
num1
num2

6.请给出下面代码片段的输出结果

def func():
    try:
        raise ValueError("something wrong")
    except ValueError as e:
        print("Error occurred")
        return
    finally:
        print("Done")

func()

#输出结果:
# Error occurred
# Done

7.filter方法求出列表所有奇数并构造新列表,a = [1,2,3,4,5,6,7,8,9,10]

filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回True 或 False,最后将返回True的元素放到新列表

a = [1,2,3,4,5,6,7,8,9,10]

def func(a):
    return a%2==1

a = list(filter(func,a))
print(a) # [1, 3, 5, 7, 9]

8.请写出log实现(主要功能时打印函数名)

@log
def now():
    print("2020-12-14")
now()

# 输出
'''
call now()
2020-12-14
'''

参考代码:


def log(f):
    def inner(*args,**kwargs):
        print('call now()')
        return f(*args,**kwargs)
    return inner

@log
def now():
    print("2020-12-14")
now()

9.log 日志中,我们需要时间戳记录error,warning等发生的时间,请用datetime模块打印当前时间戳

import datetime


print(datetime.datetime.now())
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) #当前时间戳
a = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + ' 星期' + str(datetime.datetime.now().isoweekday())
print(a)

'''
输出结果:
2020-12-14 14:39:06.758521
2020-12-14 14:39:06
2020-12-14 14:39:06 星期1
'''

10.选择代码运行结果


country_counter = {}
def addone(country):
    if country in country_counter:
        country_counter[country] += 1
    else:
        country_counter[country] = 1


addone("Japan")
addone('china')
addone("china")
print(len(country_counter))

'''
A.  0
B.  1
C.  2
D.  3
E.  4
'''

# 答案 C

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰履踏青云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值