python面试的100题(18)

函数

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

列表推导式书写形式:  

[表达式 for 变量 in 列表]    

或者  

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

参考地址:https://www.cnblogs.com/yupeng/p/3428556.html

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

(1) read(size):按字节从头读到最后,返回的是一个字符串类型,其中参数size是表示读取的字节数,size的默认是读取全部。

(2) readline() :每次只读取一行,跟read一样,也是返回的是str字符串对象。

(3) readlines() : 读取文件的所有行,把读取的每一行作为一个元素放在一个列表中,返回的是一个列表对象。

参考地址:https://blog.csdn.net/gangzi__csdn/article/details/80703542

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

散列的概念属于查找,它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,查找的期望时间为O(1)。

hash函数就是把任意长的输入字符串变化成固定长的输出字符串的一种函数。输出字符串的长度称为hash函数的位数。

散列(Hashing)通过散列函数将要检索的项与索引(散列,散列值)关联起来,生成一种便于搜索的数据结构(散列表)。

性质

(1)确定性:哈希的散列值不同,那么哈希的原始输入也就不同。

(2)不确定性:同一个散列值很有可能对应多个不同的原始输入。称为“哈希碰撞”。

参考地址:https://blog.csdn.net/m0_37925202/article/details/82015731

55.python函数重载机制?

参考地址:https://blog.csdn.net/lx1607/article/details/50530045

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

arr_ = arr
arr_[np.argmax(arr_)] = np.min(arr)
print(arr_)
print("# arr中最大的数为{},位于第{}位".format(np.max(arr_), np.argmax(arr_)+1))

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

结果为:Hello backbp, 2019 Happy

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

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

59.编写函数的4个原则

1、函数设计要尽量短小,嵌套层次不宜过深。避免过长函数,嵌套最好能控制在3层之内。
2、函数申明应该合理,简单,易于使用。除函数名能够够正确反映其大体功能外,参数的设计也应该简洁明了,参数个数不宜太多。
3、函数参数设计应该考虑向下兼容。可以通过加入默认参数来避免退化。

4、一个函数只做一件事,就要尽量保证抽象层级的一致性,所有语句尽量在一个粒度上。若在一个函数中处理多件事,不利于代码的重用。

Python中函数设计的好习惯还包括,不要在函数中定义可变对象作为默认值,使用异常替换返回错误,保证通过单元测试等。

参考地址:https://www.jianshu.com/p/ef4196b47659

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

函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。

值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间来存放由主调函数放进来的实参的值,从而想成为了实参的一个副本。值传递的特点是被调函数对形势参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做任何的操作都影响了主调函数中的实参变量。

在python中,可以有多个引用同时指向一个内存。

python不允许程序员选择采用传值还是传引用。python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(字典、列表)的引用,就能修改对象的原始值--相当于‘传引用’来传递对象。如果函数收到的是一个不可变对象(数字、字符或元组)的引用,就不能直接修改原始对象--相当于通过‘值传递’来传递对象。

参考地址:https://www.cnblogs.com/spring-haru/p/9320493.html

猜你喜欢

转载自www.cnblogs.com/Fiona-Y/p/10592122.html