Python 面试题篇1

Python 面试题篇1

本文内容大部分来自网络 并结合自己理解编写整理

Python 面试题篇1

一行代码实现1–100之和

方法 :利用sum()函数求和

代码:

sum(range(1,101)

提示:

  • range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。
  • start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
  • stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
  • step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

如何在一个函数内部修改全局变量

方法:函数内部global声明 修改全局变量
代码:

aa = 123

def changaa():
    aa = 456
changaa()
print(aaa)
#123

aa = 123

def changaa():
    global aa
    aa = 456
changaa()
print(aa)
#aa 456

提示:声明global 可以在闭包的内容里修改 全局变量的值

列出5个python标准库

  • os:提供了不少与操作系统相关联的函数
  • sys: 通常用于命令行参数
  • re: 正则匹配
  • math: 数学运算
  • datetime:处理日期时间

字典如何删除键和合并两个字典

方法:del和update方法

代码:

dic1 = {"name":11,"age":12}

dic2 = {"sex":1,"age":13}

#合并到一个字典中去
dic1.update(dic2)
print(dic1)

提示:update会修改原字典 而且字典有相同key的会更新

谈下python的GIL

GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大

解决方法:在需要大量计算的时候启用进程池再申请一个解释器python3-cookbook第十二章:并发编程 » 12.9 Python的全局锁问题

python实现列表去重的方法

先通过集合去重,在转列表
alist = [1,1,2,3,5,6]
alist = set(alist)
alist = list(alist)
print(alist)
#[1, 2, 3, 5, 6]

fun(args,kwargs)中的args,**kwargs什么意思?

  • 元组参数,即 *args,参数格式化存储在一个元组中,长度没有限制,必须位于普通参数和默认参数之后。

代码:

和传入一个元祖参数不同,*args的意思是传入不定量的单个参数
def fun(a, *args):
    print(a)
    print("args can receive a tuple of any number of arguments, let's print all that.")
    for arg in args:
        print(arg)
fun(1,5,6,7)

#1
#args can receive a tuple of any number of arguments, let's print all that.
#5
#6
#7
  • 字典参数,即 **kwargs,参数格式化存储在一个字典中,必须位于参数列表的最后面。

代码:

def fun(a, **kwargs):
    print(a, kwargs)
fun(1, b=4, c=5)
#1 {'b': 4, 'c': 5}

python2和python3的range(100)的区别

python2返回列表,python3返回迭代器,节约内存
range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。
不会将整个结果生成后返回,而是现生成

一句话解释什么样的语言能够用装饰器?

#函数可以作为参数传递的语言,可以使用装饰器
#装饰器的作用就是为已经存在的对象添加额外的功能。


def w1(func):
  def inner():
    print('...验证权限...')
    func()
 
  return inner
 
 
@w1
def f1():
  print('f1 called')
 
 
@w1
def f2():
  print('f2 called')
 
f1()
f2()

#...验证权限...
#f1 called
#...验证权限...
#f2 called
#可以通过代码及输出看到,在调用f1 f2函数时,成功进行了权限验证,那么是怎么做到的呢?其实这里就使#用到了装饰器,通过定义一个闭包函数w1,在我们调用函数上通过关#键词@w1,这样就对f1 f2函数完成了装饰。


通过装饰器。将函数f1,f2作为参数传递给w1,w1在执行完成inner内容后执行func()的方法

装饰器的使用场景

比如一个原始项目的一个函数在许多代码中都有使用。新需求要求有权限才可以调用。类似这样的场景我们就可以使用装饰器方法

以往的解决方案

  • 让调用方也在调用的时候,先主动进行权限验证
  • 让原函数中,首先进行权限认证,然后再进行真正的函数操作

以往的解决方案的问题

  • 方案一,将本不该暴露给外层的权限认证,暴露在使用方面前,需要验证的方法都需要修改
  • 方案二,看似看行,可是函数内部的方法也需要逐个修改

python内建数据类型有哪些

  • 整型–int
  • 布尔型–bool
  • 字符串–str
  • 列表–list
  • 元组–tuple
  • 字典–dict

简述面向对象中newinit区别

  • new 是真正创建对象
  • init 是对对象初始化

init是初始化方法,创建对象后,就立刻被默认调用了,可接收参数,如图

  1. new至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别
  2. new必须要有返回值,返回实例化出来的实例,这点在自己实现new时要特别注意,可以return父类(通过super(当前类名, cls))new出来的实例,或者直接是object的new出来的实例
  3. init有一个参数self,就是这个new返回的实例,initnew的基础上可以完成一些其它初始化的动作,init不需要返回值
  4. 如果new创建的是当前类的实例,会自动调用init函数,通过return语句里面调用的new函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的init函数,也不会调用其他类的init函数。

简述with方法打开处理文件帮我我们做了什么?

打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open
写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close

列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]

方法:map()函数第一个参数是fun,第二个参数是一般是list,第三个参数可以写list,也可以不写,根据需求

代码:

lista = [1,2,3,4,5]
def fn(x):
    return x**2
ret = map(fn,lista)
ret = [i for i in ret if i>10]
print(ret)
#[16, 25]

python中生成随机整数、随机小数、0–1之间小数方法

  • 随机整数:random.randint(a,b),生成区间内的整数
  • 随机小数:习惯用numpy库,利用np.random.randn(5)生成5个随机小数
  • 0-1随机小数:random.random(),括号中不传参

避免转义给字符串加哪个字母表示原始字符串?

方法:r+字符串 表示需要原始字符串,不转义特殊字符
代码:

strs = r'assdsdss'

用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的

<div class="nam">中国</div>

方法:使用python的 re模块

代码:

import re
strhtml = "<div class='nam'>中国</div>"
restr = "<div class='.*'>(.*?)</div>"
ret = re.findall(restr,strhtml)
print(ret)
#['中国']

python中断言方法举例

方法:assert()方法,断言成功,则程序继续执行,断言失败,则程序报错用于出发异常
代码:

a =3 
assert(a>1)
print("正常继续执行")

assert(b>7)
print("程序中断,触发异常")

#正常继续执行
---------------------------------------------------------------------------
#AssertionError                            #Traceback (most recent call last)
#<ipython-input-32-655e33f3f349> in <module>
#      3 print("正常继续执行")
#      4 
#----> 5 assert(b>7)
#      6 print("程序中断,触发异常")
#
#AssertionError: 

数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句

select  distinct  name  from  student

10个Linux常用命令

  • ls 列出当前文件夹下的文件和目录
  • pwd 当前文件夹的绝对路径
  • cd 跳转到某个文件夹内
  • touch 创建一个文件
  • rm 删除文件
  • mkdir 创建文件夹
  • tree 展示目录树
  • cp 复制文件
  • mv 移动文件 一般不删除文件 而是移动文件
  • cat 快速查看文件内容 会输出到控制台
  • more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读
  • grep 命令用于查找文件里符合条件的字符串。
  • echo

python2和python3区别?列举5个

  1. Python3 使用 print 必须要以小括号包裹打印内容,比如 print(‘hi’)
    Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print ‘hi’
  2. python2 range(1,10)返回列表,python3中返回迭代器,节约内存
  3. python2中使用ascii编码,python中使用utf-8编码
  4. python2中unicode表示字符串序列,str表示字节序列python3中str表示字符串序列,byte表示字节序列
  5. python2中为正常显示中文,引入coding声明,python3中不需要
  6. python2中是raw_input()函数,python3中是input()函数

发表评论

电子邮件地址不会被公开。 必填项已用*标注