Python面试题大全(二):python高级语法

4.接口中基本数据类型为static而抽象类不是

47.Python中如何动态获取和设置对象的属性?

if hasattr(Parent, ‘x’):

print(getattr(Parent, ‘x’))

setattr(Parent, ‘x’,3)

print(getattr(Parent,‘x’))

内存管理与垃圾回收机制


48.哪些操作会导致Python内存溢出,怎么处理?

49.关于Python内存管理,下列说法错误的是 B

A,变量不必事先声明 B,变量无须先创建和赋值而直接使用

C,变量无须指定类型 D,可以使用del释放资源

50.Python的内存管理机制及调优手段?

内存管理机制: 引用计数、垃圾回收、内存池

引用计数:引用计数是一种非常高效的内存管理手段,当一个Python对象被引用时其引用计数增加1,

当其不再被一个变量引用时则计数减1,当引用计数等于0时对象被删除。弱引用不会增加引用计数

垃圾回收:

1.引用计数

引用计数也是一种垃圾收集机制,而且也是一种最直观、最简单的垃圾收集技术。当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。比如某个新建对象,它被分配给某个引用,对象的引用计数变为1,如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收。不过如果出现循环引用的话,引用计数机制就不再起有效的作用了。

2.标记清除

https://foofish.net/python-gc.html

调优手段

1.手动垃圾回收

2.调高垃圾回收阈值

3.避免循环引用

51.内存泄露是什么?如何避免?

内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

__del__()函数的对象间的循环引用是导致内存泄露的主凶。不使用一个对象时使用: del object 来删除一个对象的引用计数就可以有效防止内存泄露问题。

通过Python扩展模块gc 来查看不能回收的对象的详细信息。

可以通过 sys.getrefcount(obj) 来获取对象的引用计数,并根据返回值是否为0来判断是否内存泄露

函数

52.python常见的列表推导式?

[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]

53.简述read、readline、readlines的区别?

read 读取整个文件

readline 读取下一行

readlines 读取整个文件到一个迭代器以供我们遍历

54.什么是Hash(散列函数)?

散列函数(英语:Hash function)又称散列算法哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表

55.python函数重载机制?

函数重载主要是为了解决两个问题。 1。可变参数类型。 2。可变参数个数。

另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。

好吧,那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。

那么对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。

好了,鉴于情况 1 跟 情况 2 都有了解决方案,python 自然就不需要函数重载了。

56.写一个函数找出一个整数数组中,第二大的数

57.手写一个判断时间的装饰器

import datetime

class TimeException(Exception):

def init(self, exception_info):

super().init()

self.info = exception_info

def str(self):

return self.info

def timecheck(func):

def wrapper(*args, **kwargs):

if datetime.datetime.now().year == 2019:

func(*args, **kwargs)

else:

raise TimeException(“函数已过时”)

return wrapper

@timecheck

def test(name):

print(“Hello {}, 2019 Happy”.format(name))

if name == “main”:

test(“backbp”)

58.使用Python内置的filter()方法来过滤?

list(filter(lambda x: x % 2 == 0, range(10)))

59.编写函数的4个原则

1.函数设计要尽量短小

2.函数声明要做到合理、简单、易于使用

3.函数参数设计应该考虑向下兼容

4.一个函数只做一件事情,尽量保证函数语句粒度的一致性

60.函数调用参数的传递方式是值传递还是引用传递?

Python的参数传递有:位置参数、默认参数、可变参数、关键字参数。

函数的传值到底是值传递还是引用传递、要分情况:

不可变参数用值传递:像整数和字符串这样的不可变对象,是通过拷贝进行传递的,因为你无论如何都不可能在原处改变不可变对象。

可变参数是引用传递:比如像列表,字典这样的对象是通过引用传递、和C语言里面的用指针传递数组很相似,可变对象能在函数内部改变。

61.如何在function里面设置一个全局变量

globals() # 返回包含当前作用余全局变量的字典。

global 变量 设置使用全局变量

62.对缺省参数的理解 ?

缺省参数指在调用函数的时候没有传入参数的情况下,调用默认的参数,在调用函数的同时赋值时,所传入的参数会替代默认参数。

*args是不定长参数,它可以表示输入参数是不确定的,可以是任意多个。

**kwargs是关键字参数,赋值的时候是以键值对的方式,参数可以是任意多对在定义函数的时候

不确定会有多少参数会传入时,就可以使用两个参数

63.Mysql怎么限制IP访问?

64.带参数的装饰器?

带定长参数的装饰器

def new_func(func):

def wrappedfun(username, passwd):

if username == ‘root’ and passwd == ‘123456789’:

print(‘通过认证’)

print(‘开始执行附加功能’)

return func()

else:

print(‘用户名或密码错误’)

return

return wrappedfun

@new_func

def origin():

print(‘开始执行函数’)

origin(‘root’,‘123456789’)

带不定长参数的装饰器

def new_func(func):

def wrappedfun(*parts):

if parts:

counts = len(parts)

print(‘本系统包含 ‘, end=’’)

for part in parts:

print(part, ’ ‘,end=’')

print(‘等’, counts, ‘部分’)

return func()

else:

print(‘用户名或密码错误’)

return func()

return wrappedfun

65.为什么函数名字可以当做参数用?

Python中一切皆对象,函数名是函数在内存中的空间,也是一个对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值