第一套面试题

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))

 

posted on 2018-02-16 21:32  海燕。  阅读(137)  评论(0)    收藏  举报