python基础知识

1、不使用反转函数,将字符串逆序

str = "abcdefg"
str[::-1]

2、求从10到100中能被3与5整除的数和

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]

s = sortrd(set(list1,list2))

5、python里面search()与match()的区别

match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配

6、用Python匹配HTML tag的时候,<.>和<.?>有什么区别

贪婪和非贪婪 *号是一个量词 量词后面加? 号表示 非贪婪,也就是尽可能少的匹配

7、什么是闭包?

简单说,闭包就是根据不同的配置信息得到不同的结果, 装饰器就是一种闭包, 闭包有效的减少了函数所需定义的参数数目。

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)以空间换时间的方法提高垃圾回收效率。

  1. 内存管理&引用计数
    python创建新对象都是在内存上开辟一个块, 每个对象只存有一份数据, 赋值和复制都是创建了新的引用, 使用的是对象和引用分离策略
    在Python中,每个对象都有存有指向该对象的引用总数,即引用计数, 如果引用计数为0, 那这个对象就会被python垃圾回收机制回收
  2. 标记-清除机制
    基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。
    同时为了保证效率, Python只会在垃圾达到一定阈值时,垃圾回收才会启动。
  3. 分代回收策略
    这一策略的基本假设是,存活时间越久的对象,越不可能在后面的程序中变成垃圾。Python默认定义了三代对象集合,索引数越大,对象存活时间越长。

11、动态语言和静态语言的区别

动态语言:在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化
例如:一个类中只定义了一个对象的名字和性别, 可以动态为其加入年龄属性
静态语言:在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量前必须声明数据类型
强类型语言是一旦变量的类型被确定,就不能转化的语言。
弱类型语言则反之,一个变量的类型是由其应用上下文确定的。

12、字典推导式

d={key:value for (key,value) in iterable}

13、Python中单下划线和双下划线

__foo__ :一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突。
__foo: 一种约定,用来指定变量私有,程序员用来指定私有变量的一种方式
__foo:这个有真正的意义:解析器用__classname、__foo来代替这个名字,以区别和其他类相同的命名。

14、迭代器

访问集合元素的一种方式,从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只往前不会后退
不像列表是把所有元素一次性加载到内存,迭代器是以一种延迟计算的方式返回元素。不要求事先准备好所有的元素,迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或 者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合

迭代器有两个基本的方法 next 方法:返回迭代器的下一个元素 __ 方法:返回迭代器对象本身

15、生成器

语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用 def 语句
进行定义,差别在于,生成器使用 yield 语句返回一个值,而常规函数使用 return
语句返回一个值(只要一个函数内出现了 yield,那它就是一个生成器函数,执行
这个函数就得到一个生成器)

自动实现迭代器协议:对于生成器,Python 会自动实现迭代器协议,以便应用到
迭代背景中(如for 循环,sum 函数)。由于生成器自动实现了迭代器协议,所以,
我们可以调用它的 next 方法,并且,在没有值可以返回的时候,生成器自动产生
StopIteration 异常

状态挂起:生成器使用 yield 语句返回一个值。yield 语句挂起该生成器函数的状
态,保留足够的信息,以便之后从它离开的地方继续执行
生成器的唯一注意事项就是:生成器只能遍历一次。

16、python 语法糖

语法糖指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法,
语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读
例子:

  1. c = [b,a][a>b] 取两个中的最大值
根据条件 a > b 来确定选择的元素。如果条件成立(即 a 大于 b),则选择索引为 1 的元素 a;
如果条件不成立(即 a 小于等于 b),则选择索引为 0 的元素 b。
  1. 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
  1. `list1=[2*x+1 for x in range(10)]
  2. 对列表 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)
  3. 装饰器

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 语句或语句块中发生异常,会调用默认的异常处理器处理,
但文件还是会正常关闭。

你可能感兴趣的:(面试问题,python,开发语言)