python面试题

 

1.一行代码实现1-100的和

print(sum(range(1,101)))
#range中的参数是1<=i<101
#sum是计算参数的和

  

2.在函数内部改变全局变量

a = 5
def foo1():
    global a
    a = 4
foo1()
print(a)

  

3.列出5个python标准库

time,获取时间戳,时间等。

os获取系统信息,如目录,pid。

subprocess,与linux shell交互

re,正则表达式,如match,findall,search

sys,获取程序的参数,路径,退出消息等

psutil,获取系统运行状态,如cpu,mem,disk,net。

 

4.如何删除字典中的元素,如何更新元素的值,如何合并两个字典

dictA = {'age':18,'name':'jab'}
del dictA['age']    #删除一个键值对
dictA['name'] = 'eric'  #改变一个key的value
tel = {'tel':'131111111'}
dictA.update(tel)   #将tel字典合并到dictA字典
print(dictA)

  

5 如何删除列表中的元素,如何将删除的元素赋值给变量,如何在列表头部插入元素,如何在列表尾部插入元素

listA = [1,2,3]
del listA[0]    #删除index=0的元素
num = listA.pop(-1) #将index为-1的元素弹出,赋值给num
listA.insert(0,1)   #在index为0的位置插入元素1
listA.append(3)     #在尾部追加元素3

  

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

*args 传递多个值时使用

**kwargs 传递多组关键字时使用,比如django中的model定义,可能会有多组关键字,后面的函数就会用它作为形参

    appid = models.IntegerField(primary_key=True)

  

7 什么样的语言能使用装饰器?

函数能作为参数传递的语言

 

8 面向对象中__new__和__init__的区别

init是初始化方法,对象创建后,就被调用,并且可以接受参数。

 

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

f = open('admin.py','r')
try:
    str = f.read()
    print(str)
except:
    pass 
finally:
    f.close()
#这样打开文件,需要处理异常,还要在finally里关闭文件
#with中会自己close,也可以处理异常

  

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

listA = [1,2,3,4,5]

def fn(i):
    return i*i

listB = map(fn,listA)
listC = [i for i in listB if i > 10]
print(listC)
#map()是 python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的object并返回。(python2返回列表,Python3返回迭代对象)
#[i for i in listB if i > 10]为列表推导式,把listB中大于10的元素给listC

  

 11 解释 Python 中的三元表达式

根据一个表达式判断,x的值是什么。

a = 1
b = 2
x = a if a > b else b

  

12 python如何实现多线程

 

13 join()和split的区别

join是把一个字符串的字典组成成一个字符串,用确定的分隔符。

split是把一个字符串按特定分隔符转化成一个列表

 

13 如何删除字符串中的前置空格,或者最后的/字符。

前置 lstrip(' ') 后置 rstrip('/')

 

14 改字母大小写,查字母大小写

str.lower 改小写

str.upper 改大写

str.islower 判断是否小写,字符串需要全部小写

str.ipupper  判断是否大写,字符串需要全部大写

 

答:要把bytes类型解码为str类型的时候,ascii码不能解码,因为这个bytes不是由ascii码编码的,可以换一个试试,像utf-8,gbk。

 

正则表达式

python里match()和search()的区别

import re

sql = 'select * from table'

match_sql =  re.match('from',sql)
print(match_sql)

search_sql  = re.search('from',sql)
print(search_sql.span())
-->
None
(9, 13)

#match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配;
#span()用于给出匹配字符范围

 

写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。

#输入文件名和匹配字符串,返回出现次数
def countof(file_name,str):

    with open(file_name,'r') as file_obj:
        parse = file_obj.read()
        count = len(re.findall(str,parse))
        return count

  

列表字典字符处理

python如何实现tuple和list的转换

t = (1,2,3)
l = [2,3,4]
print(list(t))
print(tuple(l))

 

写一段python代码,删除列表里的重复元素(删除字符串里的重复字符)

list1 = [1,2,3,4,2,3,4]
s1 = set(list1)
print(s1)

str1 = 'google'
s2 = set(str1)
print(s2)
-->
{1, 2, 3, 4}
{'g', 'l', 'o', 'e'}
#set函数将list或str里的重复项删除,并返回一个无序字典

 

上下文管理

设计一个类Foo,使其满足以下代码输出

with Foo() as a:
  print("2")
输出为:123 (每个整数数字为一行)
class Foo():
    def __enter__(self):
        print('1')
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('3')

with Foo() as a:
    print('2')
#将Foo()这个类赋值给a
#在执行with下面的语句之前,会调用__enter__方法
#执行完之后,会执行__exit__方法。


#扩展
class foo():
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('type',exc_type)
        print('value',exc_val)
        print('trace',exc_tb)

    def func1(self):
        pass

with foo() as foo:
    foo.func1()
#将foo()赋值给foo,可知返回一个实例
#然后执行这个实例下的func1函数
#如果with下面的代码有异常,__exit__就被执行
#开发库时,清理资源,关闭文件等等操作,都可以放在__exit__方法当中。
#Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。

  

装饰器

设计一个装饰器"addhttp",使其满足以下代码输出
@addhttp
def test():
    return www.changyou.com
print(test()) #输出为http://www.changyou.com
def addhttp(func):
    def wrapper(*args,**kwargs):
        return  "http://%s" %func()
    return wrapper

  

设计一个装饰器,在函数执行前先执行附加功能

def add_func(func):
    def wrapper():
        print('[DEBUG]:func {}() start'.format(func.__name__))
        func()
    return wrapper()

  

 

迭代器&生成器

1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身。对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数。在没有后续元素时,next()会抛出一个StopIteration异常

2)生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)

区别:生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常

 

posted @ 2019-07-19 10:37  jabbok  阅读(261)  评论(0编辑  收藏  举报