python知识总结

1、python是什么?

Python是一种编程语言,它有对象、模块、线程、异常处理和自动内存管理。可以加入与其他语言的对比。

  • Python是一种解释型语言,python代码在运行之前不需要编译
  • Python是动态类型语言,在声明变量时,不需要说明变量的类型
  • Python适合面向对象的编程,因为它支持通过组合与继承的方式定义类
  • 在Python语言中,函数是第一类对象
  • Python代码编写快,但是运行速度比编译语言通常要慢
  • Python用途广泛,常被用作“胶水语言”,可以帮助其他语言和组件改善运行状况
  • 使用python,程序员可以专注于算法和数据结构的设计,而不用处理底层的细节

2、什么是python自省?

python自省是python具有的一种能力,使程序员面向对象的语言所写的程序在运行时,能够获得对象的类python型。python是一种解释型语言,为程序员提供了极大的灵活性和控制力。

3、什么是PEP8?

PEP8是一种编程规范,内容是一些古纳与如何让你的程序更具可读性的建议

4、什么是pickling和unpickling?

pickle模块读入任何python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中----这个过程叫做picking。反之从存储的字符串文件中提取原始python对象的过程,叫做unpickling

5、什么是python装饰器?

python装饰器是python中的特有变动,可以使修改函数变得更容易

6、什么是python的命名空间?

在python中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作–这就是命名空间。它就好像一个盒子,每一个变量名字都对应装着一个对象。当查询变量的时候,会从该盒子里面寻找相应的对象

7、什么是字典推导式和列表推导式?

它们是可以轻松创建字典和列表的语法结构

8、Lambda函数是什么?

这是一个常被用于代码中的单个表达式的匿名函数

9、*args、**kwargs?参数是什么?

  • 如果我们不确定要往函数中传入多少个参数,或者我们想往函数中以列表和元组的形式传参数时,那就是要用*args;
  • 如果我们不知道要往函数中传入多少个关键词参数时,或者想传入字典的值作为参数时,那就要使用 **kwargs

10、什么是pass语句?

pass是一个在python中不会被执行的语句,在复杂语句中,如果一个地方需要暂时被留白,它常常被用于占位符

11、unittest是什么?

在python中,unittest是python中的单元测试框架。它拥有支持共享搭建、自动测试、在测试中暂停代码、将不同测试迭代成一组,等等的功能

12、构造器是什么?

构造器是实现迭代器的一种机制。它功能的实现依赖于yield表达式,除此之外它跟普通的函数没有两样

13、doc string是什么?

python中文档字符串被称为docstring,它在python中的作用是为函数、模块和类注释生成文档

14 负索引是什么?

python中的序列索引可以是正也可以是负。如果是正索引,0是序列中的第一个索引,1是第二个索引,(-1)是最后一个索引,(-2)是倒数第二个索引

15、模块和包是什么?

在python中,模块是搭建程序的一种方式。每一个python代码文件都是一个模块,并可以引用其他的模块,比如对象和属性

16、垃圾回收是什么?

在python中,为了解决内存泄露问题,采用了对象引用计数,并基于引用计数实现自动垃圾回收

17、CSRF是什么?

CSRF 是伪造客户端请求的一种攻击,CSRF 的英文全程是Cross Site Request Forgery,字面上的意思是跨站点伪造请求

18、如何让你的程序更具可读性?

适当地加入非前导空格,适当的空行以及一致的命名

19、python是如何被解释的?

python是一种解释性语言,它的源代码 可以直接运行。python解释器会将源代码转换成中间语言,之后再执行

20、如何在python中拷贝一个对象?

如果要在python中拷贝一个对象,大多时候你可以用copy.copy()或者copy.deepcopy()。但并不是所有的对象都可以被拷贝

21、浅拷贝与深拷贝区别?

在python中,对象赋值实际上是对象的引用。浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变,而深拷贝,包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

22、如何用python删除一个文件?

使用函数os.remove(‘file’)

23、如何将一个数字转换成一个字符串?

可以使用自带函数str()将一个数字转换成字符串。如果你想要八进制或者十六进制数,可以用oct()或hex()

24、python是如何进行内存管理的?

python的内存管理是由私有heap空间管理的。所有的python对象和数据结构都在一个私有heap中。程序员没有访问该heap的权限,只有解释器才能对它进行操作。为python的heap空间分配内存是由python的内存管理模块进行的,其核心API会提供一些访问该模块的方法供程序员使用。python有自带的垃圾回收系统,它回收并释放没有被使用的内存,让它们能够被其他程序使用

25、如何实现tuple和list的转换?

以list作为参数将tuple类初始化,将返回tuple类型
以tuple作为参数将list类初始化,将返回List类型

26、python里面如何生成随机数?

在python中用于生成随机数的模块是random,在使用前需要导入import:

  • random.random():生成一个0-1之间的随即浮点数
  • random.uniform(a,b): 生成[a,b]之间的浮点数
  • random.randint(a,b):生成[a,b]之间的整数
  • random.randrange(a,b,step):在指定的集合[a,b)中,以step为基数随机取一个数
  • random.choice(sequence):从特定序列中随机取一个元素,这里的序列可以是字符串,列表,元组等

27、如何在一个function里面设置一个全局变量

如果要给全局变量在一个函数里赋值,必须使用global语句。global VarName的表达式会告诉python,VarName是一个全局变量,这样Python就不会在局部命名空间里寻找这个变量了

28、python如何实现单例模式?其他23种设计模式python如何实现

  • 单例模式主要有四种方法:__new__、共享属性、装饰器、import
  • 其他23种设计模式可基本分为创建型、结构型和行为型模式
  • 创建模式,提供实例化的方法,为适合的状况提供相应的对象创建方法
  • 结构化模式,通常用来处理实体之间的关系,使得这些实体能够更好地协同工作
  • 行为模式,用于在不同的实体间进行通信,为实体之间的通信提供更容易,更灵活的通信方法
  • 各模式的实现可根据其特点来编写代码

29、如何判断单向链表中是否有环?

首先遍历链表,寻找是否有相同地址,借此判断链表中是否有环。如果程序进入死循环,则需要一块空间来存储指针,遍历新指针时将其和存储的旧指针对比,若有相同指针,则该链表有环,否则将这个新指针存下来后继续往下读取,直到遇见NULL,这说明这个链表没有环

30、如何遍历一个内部未知的文件夹?

常用的有以下这几种方法:os.path.walk(),os.walk(),listdir

31、mysql数据库如何分区、分表?

分表可以通过三种方式:mysql集群、自定义规则和merge存储引擎。
分区有四类:
RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区

LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择

HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含Mysq中有效的、产生非负整数值的任何表达式

KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供自身的哈希函数。必须有一列或多列包含整数值

32、如何对查询命令进行优化?

  • 应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引
  • 应尽量避免在where子句中对字段进行Null值判断,避免使用!=或<>操作符,避免使用or连接条件,或在where字句中使用参数、对字段进行表达式或函数操作,否则会导致权标扫描
  • 不要在where子句中的‘=’左边进行函数】算术运算或者其他表达式运算,否则系统可能无法正确使用索引
  • 使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为i条件时才能保证系统使用该索引,否则该索引将不会被使用
  • 很多时候可考虑用exists代替 in
  • 尽量使用数字型字段
  • 尽可能的使用 varchar/nvarchar 代替 char/nchar
  • 任何地方都不要使用 select * from table,用具体的字段列表代替 ‘*’,不要返回用不到的任何字段
  • 尽量使用表代替’*’,不要返回用不到的任何字段
  • 避免频繁创建和删除临时表,以减少系统表资源的消耗
  • 尽量避免使用游标,因为游标的效率较差
  • 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON,在结束时设置 SET NOCOUNT OFF
  • 尽量避免大事务操作,提高系统并发能力
  • 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理

33、如何理解开源

开源,即开放源代码。开源诞生于软件行业,它不仅仅代表软件源代码的开放,本身即意味着自由、共享和充分利用资源。开源是一种精神,是一种文化,如今已经成为软件业发展的大势所趋

34、如何理解MVC/MTV框架?

MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起。MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义有些许不同

35、MYSQL的死锁是如何产生的?

如下是死锁产生的四个必要条件:

互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占用资源的进程用毕释放

请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但又对自己已获得的其他资源保持不放

不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放

环路等待条件:指在发生死锁时,必然存在一个进程–资源的环形链,即进程集合{P0,P1,P2,…,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,…,Pn正在等待已被P0占用的资源

36、Sql注入是如何产生的,如何防止?

程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行
产生Sql注入,下面是防止办法:

  • 过滤掉一些常见的数据库操作关键字,或者通过系统函数来进行过滤
  • 在PHP配置文件中将Register_globals=off;设置为关闭状态
  • SQL语句书写的时候尽量不要省略小引号(tab键上面那个)和单引号
  • 提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的
    对于常用的方法加以封装,避免直接暴露SQL语句
  • 开启PHP安全模式:safe_mode=on;
  • 打开magic_qutotes_gpc来防止SQL注入
  • 控制错误信息:关闭错误提示信息,将错误信息写到系统日志
  • 使用mysqli或pdo预处理

37、XSS如何预防?

XSS漏洞难以检测,但是为了WEB安全仍需要尽力避免

针对反射型和存储型XSS,需要服务端和前端共同预防,针对用户输入的数据做解析和转义,对于前端开发而言,则是善于使用escape,针对data URI内容做正则判断,禁止用户输入非显示信息

对于DOM XSS,由于造成XSS的原因在于用户输入,因此在前端,需要特别注意用户输入源,并对可能造成的XSS的操作需要进行字串转义

38、如何生成共享秘钥?如何防范中间人攻击?

密钥的生成是通过使用全局配置完成的:对于不可能输出密钥是<crypto key generate rsa label {label string },而对于可输出密钥则是<crypto key generate rsa exportable label {label string}>。标记(label)是可选择的;如果没有指定标记,那么密钥名称将是hostname.domain-name

对于中间人的攻击。可以采用如下防范手段:

  • 通过采用动态ARP检测、DHCP Snooping等控制操作加强网络基础设施
  • 采用传输加密
  • 使用CASBs(云访问安全代理)
  • 创建RASP(实时应用程序自我保护)
  • 阻止自签名证书
  • 强制使用SSL pinning
  • 安装DAM(数据库活动监控)

39、如何管理不同版本的代码?

进行代码管理,可举例告知如何使用git,(或是其他工具)进行追踪

40、数据和元组之间的区别?

数组在python中叫做列表。列表可以修改,而元组不可以修改,如果元组仅有一个元素,则要在元素后加上逗号。元组和列表的查询方式一样。元组只可读不可修改,如果程序中的数据不允许修改可用元组

41、__new__和__init__的区别?

__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值

__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法

也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数

42、python中单下划线和双下划线

‘单下划线’开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量

‘双下划线’开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问这个数据

43、使用装饰器的单例和使用其他方法的单例,在后续使用中,有何区别?

Import 方法改变了类,new方法,但是只是把所有实例对象共享属性,每次产生一个新对象。算作伪单例,共享属性方法实例化了许多个相同属性。所以,装饰器方法最为实用

44、多进程与多线程的区别?

  • 简而言之,一个程序至少有一个进程,一个进程至少有一个线程
  • 线程的划分尺度小于进程,使得多线程程序的并发性高
  • 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
  • 线程在执行过程中与进程还是有区别的
原创文章 149 获赞 338 访问量 28万+

猜你喜欢

转载自blog.csdn.net/Sunny_Future/article/details/105659259