1、不使用反转函数,将字符串逆序
python
str = "abcdefg"
str[::-1]
2、求从10到100中能被3与5整除的数和
python
a=[]
for i in range(10,100):
if i%3 == 0 and i%5==0:
a.append(i)
print(a,sum(a))
3、什么是python
一种解释性语言、动态语言、python中一切都是对象、目前在大数据/人工智能/机器学习中应用广泛
4、将两个list合并,并去除重复元素
list1 = [a,b,c,d]
list2 = [d,e,c]
python
s = sortrd(set(list1,list2))
5、python里面search()与match()的区别
match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配
6、用Python匹配HTML tag的时候,<.>和<.?>有什么区别
贪婪和非贪婪 *号是一个量词 量词后面加? 号表示 非贪婪,也就是尽可能少的匹配
7、什么是闭包?
简单说,闭包就是根据不同的配置信息得到不同的结果, 装饰器就是一种闭包, 闭包有效的减少了函数所需定义的参数数目。
python
def line_conf(a, b):
def line(x):
return a*x + b
return line
line1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5), line2(5))
# (6, 25)
例子中, 如果没有闭包,我们需要每次创建直线函数的时候同时说明a,b,x。这样,我们就需要更多的参数传递,也减少了代码的可移植性。利用闭包,我们实际上创建了泛函。
8、C++/C/JAVA/Python之间的区别?
•python: 快速开发应用程序
•java: 健壮的大型软件
•C++: 需求效率的软件
•C: 操作系统及驱动
9、python2与python3区别
3没有long,增加了dict等数据类型,返回迭代器,3有抽象基类
10、内存管理与垃圾回收机制
Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,
通过"标记-清除"(mark and sweep)解决容器对象可能产生的循环引用问题,通过"分代回收"(generation)以空间换时间的方法提高垃圾回收效率。
- 内存管理&引用计数
python创建新对象都是在内存上开辟一个块, 每个对象只存有一份数据, 赋值和复制都是创建了新的引用, 使用的是对象和引用分离策略
在Python中,每个对象都有存有指向该对象的引用总数,即引用计数, 如果引用计数为0, 那这个对象就会被python垃圾回收机制回收 - 标记-清除机制
基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。
同时为了保证效率, Python只会在垃圾达到一定阈值时,垃圾回收才会启动。 - 分代回收策略
这一策略的基本假设是,存活时间越久的对象,越不可能在后面的程序中变成垃圾。Python默认定义了三代对象集合,索引数越大,对象存活时间越长。
11、动态语言和静态语言的区别
动态语言:在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化
例如:一个类中只定义了一个对象的名字和性别, 可以动态为其加入年龄属性
静态语言:在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量前必须声明数据类型
强类型语言是一旦变量的类型被确定,就不能转化的语言。
弱类型语言则反之,一个变量的类型是由其应用上下文确定的。
12、字典推导式
python
d={key:value for (key,value) in iterable}
13、Python中单下划线和双下划线
python
__foo__ :一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突。
__foo: 一种约定,用来指定变量私有,程序员用来指定私有变量的一种方式
__foo:这个有真正的意义:解析器用__classname、__foo来代替这个名字,以区别和其他类相同的命名。
14、迭代器
访问集合元素的一种方式,从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只往前不会后退
不像列表是把所有元素一次性加载到内存,迭代器是以一种延迟计算的方式返回元素。不要求事先准备好所有的元素,迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或 者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合
迭代器有两个基本的方法 next 方法:返回迭代器的下一个元素 __ 方法:返回迭代器对象本身
15、生成器
语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用 def 语句
进行定义,差别在于,生成器使用 yield 语句返回一个值,而常规函数使用 return
语句返回一个值(只要一个函数内出现了 yield,那它就是一个生成器函数,执行
这个函数就得到一个生成器)
自动实现迭代器协议:对于生成器,Python 会自动实现迭代器协议,以便应用到
迭代背景中(如for 循环,sum 函数)。由于生成器自动实现了迭代器协议,所以,
我们可以调用它的 next 方法,并且,在没有值可以返回的时候,生成器自动产生
StopIteration 异常
状态挂起:生成器使用 yield 语句返回一个值。yield 语句挂起该生成器函数的状
态,保留足够的信息,以便之后从它离开的地方继续执行
生成器的唯一注意事项就是:生成器只能遍历一次。
16、python 语法糖
语法糖指那些没有给计算机语言添加新功能,而只是对人类来说更"甜蜜"的语法,
语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读
例子:
-
c = [b,a][a>b] 取两个中的最大值
根据条件 a > b 来确定选择的元素。如果条件成立(即 a 大于 b),则选择索引为 1 的元素 a;
如果条件不成立(即 a 小于等于 b),则选择索引为 0 的元素 b。 -
lambda、filter、map、reduce 函数
lambda 函数:匿名函数,也称为"一次性函数"
语法:lambda 参数列表: 表达式例子:
add = lambda x, y: x + y
print(add(2, 3))filter 函数: 用于过滤序列中的元素,根据指定的条件筛选出满足条件的元素。它接受两个参数:一个是函数,另一个是序列。函数用来判断序列中的元素是否满足条件,filter 函数返回一个迭代器,包含满足条件的元素。
语法:filter(函数,序列)
举例:筛选出列表中偶数
numbers = [1,2,3,4,5,6]
a = list(filter(lambda x:x%2==0,numbers))
print(a)map 函数: 用于对序列中的每个元素应用相同的操作或函数,并返回一个新的列表,该列表包含了应用操作或函数后的结果。
map 函数将序列中的每个元素依次应用给定的函数,并将结果收集到一个新的列表中
语法:map(函数,序列)
举例:number = [1,2,3,4,5]
dd = list(map(lambda x:x*2,number))
print(dd)reduce 函数: 用于对序列中的元素进行累积操作,将序列中的前两个元素用指定的函数计算得出结果,然后将该结果与下一个元素继续进行计算,直到处理完所有的元素。
reduce 函数需要通过 functools 模块导入
语法:reduce(函数,序列)
举例:累加和
from functools import reduce
numbers = [1, 2, 3, 4, 5]
sum = reduce(lambda x, y: x + y, numbers)
print(sum) # 输出:15 -
`list1=[2*x+1 for x in range(10)]
-
对列表 lst = [1, -2, 10, -12, -4, -5, 9, 2] 实现排序,按照正的放前面,
负的放后面,并且分别按绝对值从小到大。即输出:[1, 2, 9, 10, -2, -4, -5,
-12]方法是:lst.sort(key=lambda x: (x < 0, abs(x)))等同于:
lst.sort(key=lambda x: abs(x))--->lst.sort(key=lambda x: x < 0) -
装饰器
17、lambda 函数(匿名函数),匿名函数有什么局限性
匿名函数,也就是 lambda 函数,通常用在函数体比较简单的函数上。匿名函数顾
名思义就是函数没有名字,因此不用担心函数名冲突。
不过 Python 对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。
18、KISS 原则
KISS 原则是英语 Keep It Simple, Stupid 的首字母缩写。
KISS 原则是指在设计当中应当注重简约的原则。
19、简述函数式编程
在函数式编程中,函数是基本单位,变量只是一个名称,而不是一个存储单元。
除了匿名函数外,Python 还使用 fliter(),map(),reduce(),apply()函数来支持函
数式编程
20、copy()与 deepcopy()区别
deepcopy()-----深复制,即将被复制对象完全再复制一遍作为独立的 新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
copy()-----而浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一
个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签
也会随之改变。
浅拷贝只拷贝一层, 深拷贝拷贝全部
第一:非容器类型(不可变对象, 比如数字,字符串和其他原子类型的对象,例如
代码,类型和 range 对象等)没有拷贝一说,浅拷贝是完全用切片操作来完成的。
第二:如果元组变量只包含原子类型对象,那么深拷贝将不会进行。
21、如何捕获异常,常用的异常机制?
如果没有对异常进行任何预防,那么在程序执行的过程中发生异常,就会中断
程序,调用 python 默认的异常处理器,并在终端输出异常信息。
try...except...finally 语句 :
当 try 语句执行时发生异常,回到 try 语句层,寻 找后面是否有 except 语句。
找到 except 语句后,会调用这个自定义的异常处理器。except 将异常处理完毕后,
程序继续往下执行。finally 语句表示,无论异常发生与否,finally 中的语句都要执
行。
assert 语句:
判断 assert 后面紧跟的语句是 True 还是 False,如果是True 则继续
执行 print,如果是 False 则中断程序,调用默认的异常处理器,同时输出assert
语句逗号后面的提示信息。
with 语句:
如果 with 语句或语句块中发生异常,会调用默认的异常处理器处理,
但文件还是会正常关闭。