1. re 的match和search区别?
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.search 扫描整个字符串并返回第一个匹配成功的值。
2. 什么是正则的贪婪匹配?
匹配一个字符串没有节制,能匹配多少就去匹配多少,直到没有匹配的为止。
3. 求结果:
a. [i % 2 for i in range(10)]
print([i % 2 for i in range(10)]) # [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
print([i for i in range(10)]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print([10 % 2]) # [0]
# % 是个运算符。
b. (i % 2 for i in range(10))
print((i % 2 for i in range(10)))
# <generator object <genexpr> at 0x00000233D5D45EB0> 生成器
# 在py中,有一种自定义迭代器的方式,称为生成器(Generator)。
# 定义生成器的两种方式:
# 1. 创建一个generator,只要把一个列表生成式的[]改成(),就创建了一个generator:generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素。没有更多的元素时,抛出StopIteration的错误。
# 2. 定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通的函数,而是一个generator。
4. 求结果
a. 1 or 2	# 1
b. 1 and 2 # 2
c. 1 < (2 == 2) # False
d. 1 < 2 == 2 # True
5. 如何实现 "1,2,3" 变成 ['1', '2', '3'], 反过来呢?
list("1, 2, 3".split(','))
[int(x) for x in ['1', '2', '3']]
6. 一行代码实现删除列表中重复的值?
list(set([1, 2, 3, 4, 1, 2, 5, 6, 4]))
7. 如何在函数中设置一个全局变量?

py中的global语句是被用来声明全局变量的。

x = 2
def func():
global x
x = 1
return x
func()
print(x) # 1
8. logging 模块的作用以及应用场景?
logging 模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统。
作用:可以了解程序运行情况,是否正常,在程序的出现故障快速定位出错地方及故障分析。
9. 请用代码简答实现 stack?
  • Stack() 创建一个新的空栈
  • push(item) 添加一个新的元素item到栈顶
  • pop() 弹出栈顶元素
  • peek() 返回栈顶元素
  • is_empty() 判断栈是否为空
  • size() 返回栈的元素个数
# 实现一个栈stack,后进先出
class Stack:
def __init__(self):
self.items = [] def is_empty(self):
# 判断是否为空
return self.items == [] def push(self, item):
# 加入元素
self.items.append(item) def pop(self):
# 弹出元素
return self.items.pop() def peek(self):
# 返回栈顶元素
return self.items[len(self.items) - 1] def size(self):
# 返回栈的大小
return len(self.items) if __name__ == '__main__':
stack = Stack()
stack.push("H")
stack.push("E")
stack.push("L")
print(stack.size()) # 3
print(stack.peek()) # L
print(stack.pop()) # L
print(stack.pop()) # E
print(stack.pop()) # H
10. 常用字符串格式化有哪几种?
  • 占位符 %

    %d 表示那个位置是整数;%f 表示浮点数;%s表示字符串。
print('Hello, %s' % 'Python')   # Hello, Python
print('Hello, %d %s %2f' % (666, 'Python', 9.99))
# Hello, 666 Python 9.990000
  • format
print('{k} is {v}'.format(k = 'python', v = 'easy'))    # python is easy
print('{0} is {1}'.format('python', 'easy')) # python is easy
11. 简述生成器、迭代器、可迭代对象、装饰器?
  1. 生成器:

    包括含有yield关键字,生成器也是迭代器,调动next把函数变成迭代器。

  2. 迭代器:

    含有 __iter____next__方法(包含__iter__方法的可迭代对象就是迭代器)

  3. 可迭代对象:

    一个类内部实现__iter__方法且返回一个迭代器。

  4. 装饰器:

    能够在不修改原函数代码的基础上,在执行前后进行定制操作,闭包函数的一种应用。

    场景:

  • flask 路由系统
  • flask before_request
  • csrf
  • django 内置认证
  • django 缓存
import functools

def wrapper(func):
@functools.wraps(func) # 不改变原函数属性
def inner(*args, **kwargs):
# 执行函数前
return func(*args, **kwargs)
# 执行函数后
return inner
# 1. 执行wrapper函数,并将被装饰的函数当做参数。 wrapper(index)
# 2. 将第一步的返回值,重新赋值给新index = wrapper(老index)
@wrapper # index=wrapper(index)
def index(x):
return x+100

调用装饰器其实是一个闭包函数,为其他函数添加附加功能,不修改被修改的源代码和不修改被修饰的方式,装饰器的返回值也是一个函数对象。

比如:插入日志、性能测试、事物处理、缓存、权限验证等,有了装饰器,就可以抽出大量与函数功能本身无关的雷同代码并继续重用。

12. def func(a, b=[]) 这种写法有什么坑?
def func(a, b=[]):
b.append(1)
print(a, b) func(a=2) # 2 [1]
func(2) # 2 [1, 1]
func(2) # 2 [1, 1, 1]
想每次执行只输出[1],默认参数应该设置为None
13. 列举常见的内置函数
  • abs() 返回数字的绝对值
  • map() 根据函数对指定序列做映射

    map() 函数接受两个参数,一个是函数,一个是可迭代对象,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

返回值:

py2:返回列表

py3:返回迭代器

例子1:

def mul(x):
return x*x
n = [1, 2, 3, 4, 5]
res = list(map(mul, n))
print(res) # [1, 4, 9, 16, 25]

例子2:

ret = map(abs, [-1, -5, 6, -7])
print(list(ret)) # [1, 5, 6, 7]
  • filter

    filter()函数接收一个函数 f(函数)和一个list(可迭代对象),这个函数 f的作用是对每个元素进行判断,返回True或False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
def is_odd(x):
return x % 2 == 1
v = list(filter(is_odd, [1, 4, 6, 7, 9, 12, 17]))
print(v) # [1, 7, 9, 17]

map 与 filter 总结

参数:都是一个函数名 + 可迭代对象
返回值:都是返回可迭代对象
区别:filter是做筛选的,结果还是原来就在可迭代对象中的项。map是对可迭代对象中每一项做操作的,结果不一定是原来就在可迭代对象中的项
  • isinstance/type

    isinstance()函数来判断一个对象是否是一个已知的类型,类似type()。

    isinstance() 与 type() 区别:

    type() 不会认为子类是一种父类类型,不考虑继承关系。

    isinstance() 会认为子类类型是一种父类类型,考虑继承关系。

    如果要判断两个类型是否相同推荐使用 isinstance()。
a = 2
print(isinstance(a, int)) # True
print(isinstance(a, str)) # False
class A:
pass
class B(A):
pass
print("isinstance", isinstance(A(), A)) # isinstance True
print("type",type(A()) == A) # type True
print("isinstance", isinstance(B(), A)) # isinstance True
print("type",type(B()) == A) # type False
  • 拉链函数

    zip 拉链函数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表迭代器。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。
print(list(zip([0, 1, 3], [5, 6, 7], ['a', 'b'])))  # [(0, 5, 'a'), (1, 6, 'b')]

zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = [4, 5, 6, 7, 8]
>>> zipped = zip(a, b) # 打包为元组的列表 [(1, 4), (2, 5), (3, 6)]
>>> zip(a, c) # 元素个数与最短的列表一致 [(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与zip相反,可理解为解压,返回二维矩阵式 [(1, 2, 3), (4, 5, 6)]
  • reduce

    reduce() 函数会对参数序列中元素进行累积。函数将一个数据集合(链表、元组等)中的所有数据进行下列操作

    注意:py3已经将reduce()函数从全局名字空间里移除了,它现在被放置在functools模块里,如果想要使用它,则需要用过引用引入functools模块来调用reduce()函数。
from functools import reduce
def add(x, y):
return x + y
print(reduce(add, [1, 2, 3, 4, 5])) # 15
print(reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])) # 15
print(reduce(add, range(1, 101))) # 5050
14. filter、map、reduce 的作用?

内置函数:map、reduce、filter 的用法和区别

  • map:根据函数对指定序列做映射
map
参数:接收两个参数一个是函数,一个是序列(可迭代对象)
返回值:py2返回列表,py3返回迭代器
例子:
abs() 函数返回数字的绝对值
新的内容的个数等于原内容的个数
ret = map(abs, [-1, -5, 6, -7])
print(list(ret)) # [1, 5, 6, 7]
  • filter:过滤函数 新的内容少于等于原内容的时候。才能使用filter,filter()函数用于过滤序列,过滤不符合条件的元素,返回由符合条件元素组成的新列表。

参数:

function 函数

iterable 可迭代对象

返回值:返回列表

# 筛选大于 10 的数
def is_odd(x):
if x > 10:
return True
ret = filter(is_odd, [1, 4, 5, 7, 8, 9, 76]) # 为迭代器
print(list(ret)) # 76
  • reduce:对于序列内所有元素进行累计操作

    reduce() 函数会对参数序列中元素进行累积,函数将一个数据集合(链表、元组等)中的所有数据进行下列操作。
from functools import reduce
def add(x, y):
return x + y
print(reduce(add, [1, 2, 3, 4, 5])) # 15
print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])) # 15
print(reduce(add, range(1, 101))) # 5050
15. 用py实现一个二分查找的函数?

二分查找算法:简单地说,就是将一个列表先排序好,比如按照从小到大的顺序排列,当给定一个数据,比如3,查找3在列表中的位置时,可以先找到列表中间的数li[middle]和3进行比较,当它比3小时,那么3一定是在列表的右边,反之则3在列表的左边。比如它比3小,则下次就可以只比较[middle+1, end]的数,继续使用二分法,将它一分为二,直到找到3这个数返回或者列表全部遍历完成(3不在列表中)

优点:效率高,时间复杂度为O(logN);

缺点:数据要是有序的,顺序存储。

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def search(someone, li):
l = -1
h = len(li)
while l + 1 != h:
m = int((l + h) / 2)
if li[m] < someone:
l = m
else:
h = m
p = h
if p >= len(li) or li[p] != someone:
print("元素不存在")
else:
str = "元素索引为%d" % p
print(str)
search(3, li) # 元素索引为2
16. 谈谈你对闭包的理解?
def foo():
m = 3
n = 5
def bar():
a = 4
return m+n+a
return bar
bar = foo()
print(bar()) # 12

说明:bar在foo函数的代码块中定义。我们称bar是foo的内部函数。在bar的局部作用域中可以直接访问foo局部作用域中定义的m、n变量。简单地说,这种内部函数可以使用外部函数变量的行为,就叫闭包。

闭包的意义与应用

17. 如何生成一个随机数?
import random
# 生成一个0-1的随机浮点数:0 <= n < 1.0
print(random.random())
# 生成一个指定范围内的整数
print(random.randint(1, 10))
18. 如何使用py删除一个文件?
import os
file = r'E:/test.txt'
if os.path.exists(file):
os.remove(file)
print('delete success')
else:
print('no such file: %s' % file)
19. 谈谈你对面向对象的理解(三大特性及解释)?

面向对象是一种编程思想,以类的眼光来看待事物的一种方式。将共有的属性和方法的事物封装到同一个类下面。

封装:将共同的属性和方法封装到同一个类下面

  • 第一层面:创建类和对象会分别创建二者的名称空间,我们只能用类名. 或者obj. 的方式去访问里面的名字,这本身就是一种封装
  • 第二层面:类中把某些属性和方法隐藏起来(或者说定义成私有的),只在类的内部使用、外部无法访问,或者留下少量接口(函数)供外部访问。

继承:将多个类的共同属性和方法封装到一个父类下面,然后再用这些类来继承这个类的属性和方法

多态:python天生是支持多态的。指的是基类的同一个方法在不同的派生类中有着不同的功能。

20.面向对象中深度优先和广度优先是什么?

Python的类可以继承多个类,如果继承了多个类,那么其寻找方法的方式有两种:

当类是经典类时,多继承情况下,会按照深度优先方式查找。 py3

当类是新式类时,多继承情况下,会按照广度优先方式查找。 py2

简单点说就是:经典类是纵向查找,新式类是横向查找。

经典类和新式类的区别就是,在声明类的时候,新式类需要加上object关键字。在py3中默认全是新式类。

Python企业面试题2 —— 基础篇的更多相关文章

  1. Java面试题之基础篇概览

    Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...

  2. Python 企业面试题集锦之Python基础

    △字符串.列表.元组.字典每个常用的5个方法? 字符串: 字符串用单引号(')或双引号(")括起来,不可变. s.strip(c):去除空格或指定的字符c:lstrip/rstrip: s. ...

  3. 生产消费者模式与python+redis实例运用(基础篇)

    根据这个图,我们举个简单的例子:假如你去某个餐厅吃饭,点了很多菜,厨师要一个一个菜的做,一个厨师不可能同时做出所有你点的菜,于是你有两个选择:第一个,厨师把所有菜都上齐了,你才开始吃:还有一个选择,做 ...

  4. Python微信公众号教程基础篇——收发文本消息

    1. 概述: 在本篇教程中,你将学会使用华为云弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果 ...

  5. 基于python的webUI自动化-小白基础篇

    最近打算研究一下基于python的webUI自动化,先自学了一下相关基础知识,大概用了一个多月的时间,主要是找视频,一边看视频或者文档一边对照着敲代码运行. 重点强调:一定要一边看一边对照着敲代码运行 ...

  6. python之路——面向对象(基础篇)

    面向对象编程:类,对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 "类" 和 "对象" 来实现,所以,面向对象编程其实就是对 "类&quo ...

  7. Python全栈之路-----基础篇

    Python诞生 Python是著名的”龟叔“Guido van Rossum(吉多·范罗苏姆)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. Python语法很多来自C,但又受到 ...

  8. Python自动化开发 - Django【基础篇】

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为: 大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能 ...

  9. Python企业面试题(系列目录)

    本系列计划把Python面试中出现频率比较高知识点整理出来,以便各位童鞋复习和练习: [第1题] Python内存管理以及垃圾回收机制 [第2题] 链表的逆置 [第3题] 两个队列创建一个栈 [第4题 ...

  10. 面试题_Spring基础篇

    Spring基础题 1. 什 么 是 Spring? Spring 是 个 java 企 业 级 应 用 的 开 源 开 发 框 架 .Spring 主 要 用 来 开 发 Java 应 用 , 但 ...

随机推荐

  1. win32 - 使用GDI+播放gif图片

    今天做case的时候遇到一个这样的问题,故记录下来. Codeproject有类似的案例,不过是使用的MFC模板编译的. 因为我们只需要win32程序,所以就....代码如下: CodeProject ...

  2. flutter打包android的一些配置修改(解决白屏,视频闪退)

    1.打包后视频播放闪退 视频播放器选择了flutter_tencentplayer(https://github.com/qq326646683/flutter_tencentplayer) 解决:不 ...

  3. React native随笔——解决navigation导航栏 android和ios样式不统一

    navigation导航栏存在android和ios样式不统一的问题.Android手机上标题不居中,导航栏与状态栏重合. 解决方法为在navigationOptions中进行如下配置. 一.Andr ...

  4. Jetpack Compose(1) —— Android 全新的 UI 框架

    写在前面 Jetpack Compose 已经不是什么新技术了,Google 早在 2019 年就推出 Jetpack Compose 的首个 alpha 版本,时至今日,相当大比例的国内 Andro ...

  5. 【Azure 应用服务】使用Docker Compose创建App Service遇见"Linux Version is too long. It cannot be more than 4000 characters"错误

    问题描述 使用Docker Compose方式合并多个镜像(Images)文件,然后部署到App Service中,结果失败.报错 Linux Version 太长,不能超过4000个字符. 错误消息 ...

  6. linux系统信息命令笔记

    1,时间和日期 2,磁盘信息 4,进程概念介绍 4.1,ps 基本命令使用 ps aux 显示内容太多了.一般用ps a 或 ps au 4.2, top命令的基本使用 top 可以动态的显示运行中的 ...

  7. C/C++ 的 指针/引用 传参

    #include <stdio.h> //指针传值 void addOne(int *a) { printf("%8p\n",a); *a = *a+1; } //引用 ...

  8. MySQL汇总数和分组数据

    1.使用SQL语句对数据库表中的数据进行简单的汇总和分组,这里要注意 count(*) 是对表中的所有数据目进行计数,不管表列中包含的是空值还是非空值. 而使用count(column)是对特定的列中 ...

  9. idea editor tabs 标题头 多行显示,全部显示出来 (vscode也放一个)

  10. Istio中的核心资源及定义

    Istio 的核心资源主要包括以下几种: 1. Gateway 用于建模边缘网关,可以为进入或离开网格的流量提供专用的入口和出口点.Gateway 定义了在网格边缘运行的负载均衡器,用于接收传入或传出 ...