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

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

皋兰网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。成都创新互联成立于2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联

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对象。


当前名称:Python基础常见问题总结(一)
本文地址:http://pwwzsj.com/article/jdghje.html