第一套面试题
1、Python中定义函数时如何书写可变参数和关键字参数?
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装成一个元组 def func(*args): sum = 0 for i in args: sum = sum+i*i return sum func(1,2) func(*(1,2,3)) 关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个字典 def person(name,age,**kwargs): print('name:', name, 'age:', age, 'other:', kwargs) person('hiayan',22) person('hiayan',22,city='lanzhou') person(**{'a':1,'b':2})
2、什么是命名关键字参数?
如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下: def person(name, age, *, city, job): print(name, age, city, job) 和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。 调用方式如下: >>> person('Jack', 24, city='Beijing', job='Engineer') Jack 24 Beijing Engineer 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
3、什么是lambda表达式?
lambda表达式也叫做匿名函数(一些简单的需要用函数去解决的问题) 举例: def f(x,y): return x*y #用lambda表示 g = lambda x,y:x*y #其中g是函数名,x,y是参数,x*y是返回的值 g(1,2)
4、(1):1 or 2和1 and 2 分别输出什么?为什么?
(2):1 <(2 ==2)和 l<2==2结果分别是什么?为什么?
答 :(1)1 ;2 (2)False; True 1<2==2#1<2为True,又2位True,所以返回True #对于and的理解 #如果整个表达式为假,就返回0 #如果表达式结果是真,返回最后一项。
5、[i %2 for i in range(10)] 和(i%2 for i in range(10))输出结果是什么?
答:[i%2 for i in range(10)] #输出[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] print((i%2 for i in range(10))) #[<generator object <genexpr> at 0x0000000002590E60> #生成器表达式,返回生成器
6、请描述with的用法?如果自己的类需要支持with语句,应该如何书写?
(1):with的用法 with open('a.txt','r') as f: f.read() 无论with里面的代码块执行过程中发生什么情况,文件最终都会被关闭。 如果在执行代码块的时候发生异常,在这个异常抛出之前,程序会先将打开的文件关闭。 (2):类中的书写 class WithTest(object): def __init__(self): print(23) def __enter__(self): print('开始进入执行啦') def __exit__(self, exc_type, exc_val, exc_tb): print('结束啦') obj = WithTest() #实例化类 print(obj)
7、Python中如何判断一个对象是否是可调用对象?那些对象可以是可调用对象
如何定义一个类,使其对象本身就是可调用对象? (1):判断是否是可调用方法有三种方法 1、使用内置的callable函数 - callable(func) 2、判断对象类型是否是FunctionType type(func) is FunctionType 或者 instance(func,FunctionType) 3、判断对象是否实现__call__方法 - hasattr(func,'__call__') (2):那些对象可以是可调用对象 函数是可调用对象, 方法是一种特殊的类函数 如果一个类实现了__call__方法,那么其实例也会成为一个可调用对象 (3):使其对象本身就是可调用对象 class MyClass(object): def __call__(self, *args, **kwargs): return self myclass = MyClass() print(callable(myclass)) #True
8、什么是进程、线程、协程?说一说Python对他们的支持
进程:一个程序正在进行的过程 线程:就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 协程:一个任务运行完,切到另一个任务,单线程下实现并发 #1.所以进程里面真正干活的是线程(进程里面有线程) #2.进程只是用来把资源互相隔离开,而线程才是真正负责cpu来调动他的
9、Python中怎么删除一个文件
import os # with open('a.txt','w') as f: # f.write('[1,2,3]') os.remove('a.txt') #删除文件
10、描述下字典的items()方法与iteritems()方法的不同?
d = {'a':1,'b':20}
print(d.items()) #dict_items([('a', 1), ('b', 20)])
# for i in d.items():
# print(i) #('a', 1)
第二套面试题
1、字符编码为题
ascii:一个bytes代表一个字符
Gbk:两个bytes代表一个字符
unicode:2bytes代表一个字符
utf-8:对英文字符只用1bytes,对中文字符用3bytes
2、unicode和utf-8的区别?
unicode:优点是字符转换数字的时候速度快,缺点是占用空间大 utf-8:优点是精准,可变长,转换速度慢,缺点是节省空间 【unicode:多的字符都是2bytes,优点是字符转换数字的时候速度快,缺点是占用空间大】 【utf-8:精准,可变长,优点是节省空间;缺点是转换速度慢,因为每次转换都需要计算出需要多长bytes才能准确表示】
3、unicode和utf-8的使用
1.内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是越快越好)
2.硬盘中或网络传输用utf-8,保证数据传输的稳定性。
4、Python2和Python3的区别
在Python2中的字符串是str和unicode
在python3中的字符串是str和bytes
python3中的字符串被识别为unicode,python3中的字符串encede得到bytes
python2中的字符串就是bytes,python2中的字符串前面加u,就是unicode
5、动态参数
按位置传值多余的参数都由args统一接收,保存成一个元组的形式
按照关键字传值多余的参数都由kwargs接收,保存成一个字典的形式
6、闭包:
1.闭 :内部的函数
2.包 :包含了对外部函数作用域中变量的引用
7、作用域
1、作用域:也就是作用范围 2、为什么要有作用域? 为了函数内的变量不影响到全局
8、global和nonlocal
global:强制转换成全局变量 nonlocal:让内部函数中的变量在上一层函数中生效,如果上一层函数中没有,就修改上上层的 一次类推,但是不会修改全局的
9、为什么要使用装饰器呢?
- 装饰器的功能:在不修改原函数及其调用方式的情况下对原函数的功能进行扩展一 - 装饰器的本质:就是一个闭包函数 实现计算每个函数的执行时间的功能 import time def wrapper(func): def inner(*args,**kwargs): start = time.time() #函数执行之前的时间 ret = func(*args,**kwargs) end = time.time() #函数执行之后的时间 print(end-start) return ret #函数的返回值 return inner @wrapper #hahah = wrapper(hahah) def hahah(): time.sleep(1) print('执行我啦') hahah()
10、查看能不能调用
print(callable(123))
浙公网安备 33010602011771号