Python基础常见问题总结(一)

发布时间:2019-07-11 09:51:51编辑:auto阅读(1304)

    1.__ foo 、foo_ 和 __foo__ 三者之间的区别是什么?
    __foo表示私有属性、_foo表示受保护的属性、__foo__表示Python自带的属性

    2.请您简述Python编译的工作原理,PyCodeObject 和 PyFrameObject 对象的作用。
    Python编译的工作原理:Python语言写的程序不需要编译成二进制代码,它可以直 接从源代码运行程序。当我们运行Python文件程序的时候, Python解释器把源代码转换成中间形式:字节码,然后再由Python虚 拟机来执行这些字节码。
    PyCodeObject对象:pyc 字节码在Python虚拟机中对应的是PyCodeObject对象,虚拟机将字节封装成一个PyCodeObject对象再一条条执行字节码指令。
    PyFrameObject对象:当发生函数调用时,创建新的帧,对应Python的实现就是PyFrameObject对象。

    3.如何理解self、cls、和super?

    self是实例方法定义中的第一个参数,代表该方法的实例对象
    cls是类方法中的第一个参数,代表当前类
    super是指在Python面向对象的继承特征下中,若子类调用父类方法则需要super()实现。

    4.如何区分@classmethod和@staticmethod?

    @classmethod是类装饰器,使用装饰器方法定义类方法告知Python的解释器该方法为类方法,装饰器优化该方法的执行效率。
    @staticmethod是静态方法装饰器,使用装饰器方法定义静态方法告知Python的解释器该方法为静态方法,装饰器优化该方法的执行效率。

    5.如何理解闭包Closure(作用)?其语法规范要求?(可编写片段代码实现闭包规范)
    闭包:在一个外函数内定义了一个内函数 ,内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就形成了闭包

    闭包函数实例:
    
    outer为外函数、inner为内函数,a和b都是外函数的临时变量
    def outer(a):
        b=10
        def inner():
            print(a+b)
        return inner
    if __name__=="__main__":
        demo=outer(5)
            #在这里我们调用外函数传入参数5,此时外函数两个临时变量a=5,b=10并创建了内函数,然后把内函数的引用返回存给了demo,外函数结束时发现内函数将会用到自己的临时变量,这两个变量就不会释放,会绑定给内函数。
        demo()

    6.什么是迭代器Iterator ? 编写片段代码说明应用方式.

    迭代器就是用于迭代操作(for循环)的对象,它像列表一样,可以迭代获取其中的每一个元素,任何实现了next()方法的对象都可以被称为迭代器。
    对于可迭代对象(序列、range函数返回值、zip函数返回值、enumerate函数返回值等等)调用iter()函数就会返回一个迭代器,对于迭代器用iter方法就会返回迭代器自身。

    迭代器代码实例说明:
    
    it =iter([1,2,3,4,5])
    while True:
        try:
            x=next(it)
        except StopIteration:
            break
    #迭代器通过不断调用next方法会依次前进到序列中的下一个元素,并将其返回最后到达一系列结果的末尾时,会引发StopIteration异常               

    7.说明list、tuple和dictionary之间的异同点。

    列表list支持的特性:索引、切片、连接、重复、成员操作符
    元组tuple支持的特性:索引、切片、连接、重复、成员操作符
    字典dictionary不支持这些特性
    列表list属于可变数据类型,是有序的、可迭代的(支持for循环遍历)
    元组tuple属于不可变数据类型,是有序的、可迭代的(支持for循环遍历)
    字典dictionary属于可变数据类型,是无序的、可迭代的(支持for循环遍历)

    8.如何理解生成器Generator? 在Python中有几种实现方式(可编写片段代码说明)?

    生成器本质上是一个高级迭代器,使得所需要返回的一系列元素所需的代码更加简单和高效。
    生成器有两种实现方式:
    (1).生成器函数
    生成器函数:常规函数定义中使用return返回结果,在生成器函数中使用yield关键字代替return,yield语句一次返回一个结果,在每个结果中间挂起函数的状态,以便下一次从它离开的地方执行。

    代码说明:
    def gensquares(Num):
        for i in range(Num):
            yield i**2
    for item in gensquares(5):
         print(item)

    (2).生成器表达式
    生成器表达式:和列表生成式相似,不过将“[]”改为“()”,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

    代码说明:
    squares=(i2 for i in range(2,5))
    print(type(squares))
    #使用next()方法每次返回一个结果
    next(squares)

    9.Python中的异常是什么?分为几种?多except捕获异常的规范要求都有哪些?

    异常是一个事件,该事件会在程序执行过程中发生,影响程序正常执行,在Python中程序无法正常处理时,就会抛出异常。在Python中常见的异常处理为单异常和多异常处理,在Python3中长使用try ... except ... finally处理,常见的有try ... except ...、try ... except ... except ... except ...(多except捕获)、try ... except ... else/finally.对于try ... except ... else/finally来说,else中的语句是当try语句块出现异常时不执行,当try语句块无异常时执行,如果替换为finally则是不论try语句块是否出现异常finally都会执行。
    多except捕获异常:一个try语句块可能包含多个except字句,分别用来处理不同的特定的异常,在多异常捕获时,我们常将小异常放在前面,大异常在后面,用于避免程序在处理时,异常不能分别处理,从而将所有异常归为一个异常进行处理。

    10.如何理解“鸭子模型”,其主要作用是什么?

    Python不支持多态,并且也用不到多态,多态是应用于Java和c#这一类强类型语言中,而Python推崇“鸭子类型”。
    “鸭子类型”是动态类型的一种风格,在这种风格中,一个对象有效的语义不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。

    11.装饰器decorator的作用,编写片段代码说明。

    装饰器就是用来装饰函数的,想要增强原有函数的功能,但不希望改变现函数的定义,是一种在代码运行期间动态增加功能的方式。定义的装饰器实际上是返回函数的高阶函数。

    代码说明:
    #装饰器(无参数)
    import time
    def Timelt(ProMain):
        def program_times():
            startTime = time.time()
            ProMain()
            endTime = time.time()
            msecsTime = (endTime - startTime) * 1000
            print("程序%s运行时间:%s 毫秒" % (main.__name__,msecsTime))
        return program_times
    @Timelt #python提供的语法糖,@deco 和 main = deco(main) 是完全等价的,本质是一样的
    def main():
        print("程序运行开始...")
        time.sleep(0.5)
        print("程序运行结束...")
    if __name__=="__main__": #脚本程序入口
        main()
    补充:语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

    12.*args和**kwargs的异同点

    这两个参数为函数定义中参数列表中排名最后的参数
    *args代表该参数位置可以任意个参数,最后都会转为元组数据类型在函数体内处理
    **kwargs代表该参数位置可以放key-value格式的数据,最终都会转化为字段形式数据在函数体内处理。

    13.@property装饰器的作用,请举例说明。

    @property装饰器将方法定义为属性,后续可以使用对象.属性名的方式输出

    举例说明:
    class person():
        def __init__(self,name):
            self.__name=name
            pass
        @property #使用@property将私有实例变量变为一个属性,从而可以使用对象.属性的名称的方式进行输出。
        def name(self):
            return self.__name
    if __name__=="__main__":
        obj=person("Lee")
        print('name属性:{0}'.format(obj.name))

    14.请您简述Python如何理解对象序列化和反序列化操作?

    所谓序列化是将编程语言中的各种对象转化为字节流的过程,同时也可以逆向操作将字节流还原成一个对象,这个过程称为发序列化。

    15.Python连接数据库实现读写操作的标准流程描述。

    #导入模块
    import pymysql
    db=pymysql.connect("localhost","root","root","mysql")
    #创建游标对象
    cursor=db.cursor()
    #使用execute()方法执行SQL语句
    cursor.execute("select * from mysql")
    #使用fechone()方法获取单条数据
    data=cursor.fetchone()
    #关闭数据库
    db.close()

    16.python异常的关键字有哪些?每个代码块执行的规则是什么?

    python异常的关键字有:try,except,else,finally
    try语块执行方式:
    (1)首先执行try字句.
    (2)如果没有异常发生,忽略except子句,try子句执行后结束
    (3)如果执行try子句过程中发生异常,那么try子句余下的部分将被忽略,如果异常与except关键字后的名称相同,那么对应的except子句被执行,最后执行try语句之后的代码
    (4)如果一个异常没有与任何except匹配,那么这个异常会传递给上层的try中,对于可选子句else子句,如果使用这个子句,那么必须放在所有的except子句后,这个子句在try子句没有发生任何异常的时候执行,对于finally来说,不管前面子句是否执行,finally中的语句都会执行。

    17.pickle模块中的dumps()/loads()和dump()/load()的区别。

    pickle模块支持讲一个Python对象转化为字节流,同时还能对相应的字节流逆操作得到原来的对象
    pickle模块的常用函数:
    pickle.dump(obj.file [,protocol])对象序列化操作函数
    pickle.load(file)将file中的对象序列化读取
    pickle.dumps(obj,[,protocol]) 将对象转化为string字符串类型
    pickle.loads(string)从string中读取并反序列化还原之前的obj对象。

关键字