函数面试题合集

是否使用过functools中的函数?他的作用是什么?
  1. functools.wraps()
    • 在装饰器中用过,如果不使用wraps,则原始函数的__name__和__doc__的值就会丢失
  2. functools.reduce()
    • 第一个参数是一个函数,第二个参数是一个可迭代对象,代码如下:
# 下面代码相当于从1加到9
from functools import reduce
a=reduce(lambda x,y:x+y,range(10)) print(a)
如何判断一个值是方法还是函数?

参考链接

  1. 使用type()来判断,如果是method为方法,如果是function则是函数。
  2. 与类和实例无绑定关系的function都属于函数(function)
  3. 与类和实例有绑定关系的function都属于方法
请编写一个函数将ip地址转换成一个整数。如10.3.9.12转换成00001010 00000011 00001001 00001100,然后转换成整数
def ip2int(ip):
    nums=ip.split('.') # zfill()函数是补0 to_bin=[bin(int(i))[2:].zfill(8) for i in nums] return int(''.join(to_bin),2) i=ip2int('127.0.0.1') print(i)
lambda表达式格式以及应用场景?
  • 格式:lambda 参数列表 : 返回表达式
  • 应用场景:常见的在filter,reduce以及map中使用。
pass的使用
  • 通常用来标记一个还未写的代码的位置,pass不做任何事情,一般用来做占位语句,保持程序结构的完整性
*arg和**kwargs的作用
  • 用来接收不确定个数的参数,*args通常用来接收不确定个数的非关键字参数,而**kwargs通常用来接收不确定个数的关键字参数
如何在函数中设置一个全局变量?
  • 在函数中使用global关键字定义变量
求以下代码结果:
def num():
    return [lambda x:i*x for i in range(4)] print([m(2) for m in num()])
  • 答案:[6,6,6,6]
yield from 和 yield 的区别

简述yield和yield from

# 下面a()和b()是等价的
def a():
    yield from [1,2,3,4,5] def b(): for i in [1,2,3,4,5]: yield i for i in a(): print(i) for i in b(): print(i)
  • yield将一个函数变成一个生成器
  • yield 返回一个值
  • yield from后面接可迭代对象,一个一个返回值。
求以下代码的输出结果
collapse=True
processFunc=collapse and (lambda s:' '.join(s.split())) or (lambda s:s) print(processFunc('i\tam\ntest\tproject!')) collapse=False processFunc=collapse and (lambda s:' '.join(s.split())) or (lambda s:s) print(processFunc('i\tam\ntest\tproject!'))
  • 答案:
i am test project! i am test project!
编写一个函数,找出数组中没有重复的值的和
def func(lis):
    lis1=[]
    del_lis=[]
    for i in lis: if i not in lis1: if i not in del_lis: lis1.append(i) else: del_lis.append(i) lis1.remove(i) return sum(lis1) def func2(lis): return sum([i for i in set(lis) if lis.count(i)==1]) print(func2([3,4,1,2,5,6,6,5,4,3,3]))
下面代码的执行结果是
a=1
def bar():
    a+=3 bar() print(a)
  • 答案:运行出错
写一个函数,计算出以下字母所代表的数字,每个字母值不一样
for A in range(1,10):
    for B in range(10): if A==B: continue for C in range(1,10): if C in [A,B]: continue for D in range(10): if D in [A,B,C]: continue for E in range(1,10): if E in [A,B,C,D]: continue for F in range(10): if F in [A,B,C,D,E]: continue for G in range(1,10): if G in [A,B,C,D,E,F]: continue for H in range(10): if H in [A,B,C,D,E,F,G]: continue for P in range(1,10): if P in [A,B,C,D,E,F,G,H]: continue if (A*10+B)-(C*10+D)==(E*10+F) and (E*10+F)+(G*10+H)==(P*100+P*10+P): print(A,B,C,D,E,F,G,H,P)

写出如下代码的输出结果

参考链接

def decorator_a(func):
    print('Get in decorator_a') def inner_a(*args, **kwargs): print('Get in inner_a') return func(*args, **kwargs) return inner_a def decorator_b(func): print('Get in decorator_b') def inner_b(*args, **kwargs): print('Get in inner_b') return func(*args, **kwargs) return inner_b @decorator_b #f=decorator_b(f) @decorator_a #f=decorator_a(f) def f(x): print('Get in f') return x * 2 f(1)
  • 答案
Get in decorator_a Get in decorator_b Get in inner_b Get in inner_a Get in f
  • 解释
当我们对f传入参数1进行调用时,inner_b被调用了,他会先打印Get in inner_b,然后在inner_b内部调用了inner_a,所以会再打印Get in inner_a,然后再inner_a内部调用原来的f,并且将结果作为最终的返回总结:装饰器函数在被装饰函数定义好后立即执行从下往上执行函数调用时从上到下执行
写出以下代码的输出结果:
def test():
    try:
        raise ValueError('something wrong') except ValueError as e: print('error occured') return finally: print('ok') test()
  • 结果(finally无论怎样都会执行)
error occured ok
求出以下代码的输出结果
mydict={'a':1,'b':2} def func(d): d['a']=0 return d func(mydict) mydict['c']=2 print(mydict)
  • 结果
{'a': 0, 'b': 2, 'c': 2}
写个函数接收一个文件夹名称作为参数,显示文件夹中文件的路径,以及其中包含的文件夹中文件的如今
# 方法一
import os
def Test1(rootDir): list_dirs = os.walk(rootDir) for root, dirs, files in list_dirs: for d in dirs: print(os.path.join(root, d)) for f in files: print(os.path.join(root, f)) Test1(r'C:\Users\felix\Desktop\aaa') print('###################') # 方法二 import os def Test2(rootDir): paths=os.listdir(rootDir) for lis in paths: path=os.path.join(rootDir,lis) print(path) if os.path.isdir(path): Test2(path) Test2(r'C:\Users\felix\Desktop\aaa')

猜你喜欢

转载自www.cnblogs.com/yhq123/p/11360860.html