Python面试题

面试题1
面试题2
面试题3
面试题4
面试题5

is 和 == 有什么区别?

  • ==是比较运算符,用来比较两个对象的value(值)是否相等
  • is也叫做同一性运算符,用来比较对象间的唯一身份标识(id)是否一致
a = b = "abc"
X = "abc"

print a == b  # True
print a == X  # True
print a is b  # True
print a is X  # True

a = b = [1, 2, 3]
X = [1, 2, 3]

print a == b  # True
print a == X  # True
print a is b  # True
print a is X  # False

结论:只有数值型和字符串型比较,a is X才为True,当是tuple,list,dict或set型时,a is X为False。

sort 和 sorted 的区别

  • sort 只是应用在 list 上的方法,就地排序,无返回值
  • sorted 是内建函数,对所有可迭代的对象都可进行排序,返回新的list

sorted 语法:
sorted(iterable, key=None, reverse=False)
参数说明:

  • iterable – 可迭代对象。
  • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

成员变量用单、双下划线修饰的区别?

  • _xxx : 保护型成员变量,只允许该类及其子类访问;不能用于from module import * 。
  • __xxx : 私有型成员变量,只允许该类本身进行访问,连子类也不允许
  • __xxx__: python内置的专用特殊方法。像__init__()之类的。

lambda表达式的应用场景?

lambda 表达式的本质就是匿名的、函数体仅有一行的函数

# lambda表达式
lambda x , y : x + y

# 改写成函数
def add(x, y):
    return x+ y

虽然函数比 lambda 表达式的适应性更强,能够创建复杂的函数对象,但 lambda 表达式依然有如下两个优点:

  • 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁
  • 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高了性能。

copy 和 deepcopy 的区别是什么?

结论:

  • 浅拷贝,只拷贝父对象,不会拷贝父对象内部的子对象
  • 深拷贝,既拷贝父对象,又拷贝各级子对象
import copy

origin = [1, 2, [3, 4]]  # origin 里边有三个元素:1, 2,[3, 4]
cop1 = copy.copy(origin)
cop2 = copy.deepcopy(origin)
print cop1 == cop2  # True
print cop1 is cop2  # False
# 说明: cop1 和 cop2 目前看上去还相同,但已不再是同一个object

origin[2][0] = "hey!"
origin[0] = "a"
print origin  # ['a', 2, ['hey!', 4]]
print cop1  # [1, 2, ['hey!', 4]]
print cop2  # [1, 2, [3, 4]]
# 说明: origin第一层元素改变,对深浅拷贝都不会有影响;
# 但是子对象(origin[2] = [3, 4])发生改变后,浅拷贝会跟着变,深拷贝却不受影响

也就是说,如果父元素的第一层中存在可变对象,如list、dict以及普通类的实例对象等,使用浅拷贝只是传递了可变对象的引用,而深拷贝才是通俗理解上的完全复制。

什么是断言?应用场景?

python的assert是用来检查一个条件,如果它为真,继续往下执行。如果它为假,则会抛出AssertError 错误信息,并终止执行程序。
断言是保证程序运行可靠性的一种方式,因为,在条件不符合我们预期时,程序会自动在断言处终止运行,同时会抛出错误所在的代码行和相关信息,也算是一种程序问题定位的手段。

具体应用场景:函数入参检查、运行时程序逻辑检查、约定检查、程序常量以及文档检查等。

dir()是做什么的?

dir()是python的一种内置函数,dir(object)用于查看object内部的全部属性和方法
比如查看list、字符串或者是os模块的全部内部函数和方法,可以这样:

print dir(os)
print dir(list)
print dir("")
print dir(str) # 和上面运行结果一致

*args**kwargs 的含义及用法。

在函数定义中使用 *args**kwargs传递可变长参数。 *args 用来将参数打包成 tuple 给函数体调用** kwargs 用于将关键字参数打包成 dict 给函数体调用

***的用法:拆包

def fun1(a, b):
    print a, b

def fun2(b, a):
    print a, b

fun1(*[1, 2]) # *用于拆解list或元组,拆解结果作为位置参数
fun2(**{"a": 1, "b": 3}) # **用于拆解字典,并将其作为关键字参数

*args 用法实例:
*args用于接收元组作为位置参数。

def fun(a, *args):
    print a
    print "args:", args
    print "type(args):", type(args)
    for arg in args:
        print arg

# 调用
fun(1, 2, 3)

结果:

1
args: (2, 3)
type(args)<type 'tuple'>
2
3

**kwargs用于接收字典类型的参数

def fun(a, **kwargs):
    print "a is ", a
    print "kwargs:", kwargs
    print "type(kwargs):", type(kwargs)
    print "b is ", kwargs.get("b", None)
    print "c is ", kwargs.get("c", None)
    print "d is ", kwargs.get("d", None)

# 调用
fun(1, b=3, c=5)

结果:

a is  1
kwargs: {'c': 5, 'b': 3}
type(kwargs): <type 'dict'>
b is  3
c is  5
d is  None

type、class和object之间的关系?

type : 用来返回一个对象的类型
object:由于Python中一切皆对象,也就是说Python中的任何变量类型都是可以被修改的,这也是Python等动态编程语言的特点。type的基类是object,但是object也是由type生成的,他们之间形成了一个环路,这样设计的目的也就是为了方便对这些数据结构进行修改
class:class是用来描述一个类对象的通过class可以实例化出一个对象
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值