python基础知识

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

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

语法糖指那些没有给计算机语言添加新功能,而只是对人类来说更"甜蜜"的语法,

语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读

例子:

  1. c = [b,a][a>b] 取两个中的最大值

    根据条件 a > b 来确定选择的元素。如果条件成立(即 a 大于 b),则选择索引为 1 的元素 a;
    如果条件不成立(即 a 小于等于 b),则选择索引为 0 的元素 b。

  2. 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

  3. `list1=[2*x+1 for x in range(10)]

  4. 对列表 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)

  5. 装饰器

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 语句或语句块中发生异常,会调用默认的异常处理器处理,

但文件还是会正常关闭。

相关推荐
敲敲敲-敲代码1 分钟前
游戏设计:推箱子【easyx图形界面/c语言】
c语言·开发语言·游戏
明月清风徐徐9 分钟前
Scrapy爬取豆瓣电影Top250排行榜
python·selenium·scrapy
theLuckyLong10 分钟前
SpringBoot后端解决跨域问题
spring boot·后端·python
ROC_bird..10 分钟前
STL - vector的使用和模拟实现
开发语言·c++
Yongqiang Cheng13 分钟前
Python operator.itemgetter(item) and operator.itemgetter(*items)
python·operator·itemgetter
MavenTalk16 分钟前
Move开发语言在区块链的开发与应用
开发语言·python·rust·区块链·solidity·move
FksLiao28 分钟前
Superset安装
python
L Jiawen35 分钟前
【Python · PyTorch】卷积神经网络(基础概念)
pytorch·python·cnn
goomind40 分钟前
深度学习模型评价指标介绍
人工智能·python·深度学习·计算机视觉
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】生产消费模型 & 阻塞队列
java·开发语言·java-ee