文章目录
-
- 1. Python语言的特性
- 2. python语言相比其他语言的优点和缺点
- 3. Python中的类型转换
- 4. __new__ 和 __init__的区别
- 5. 如何将python2的代码迁移到python3
- 6. python新式类和旧式类的区别
- 7. python自省
- 8. 猴子补丁技术
- 9. 迭代器和生成器
- 10. GIL全局解释器锁
- 11. 函数是一等公民
- 12. 函数与方法的区别
- 13. 面向对象编程OOP
- 14. 面向切面编程AOP
- 15. 函数式编程
- 16. 返回函数
- 17. 匿名函数
- 18. 偏函数
- 19. 字符集(字符编码)
- 20. *args和**kwargs的区别
- 21. 实参和形参的区别
- 22. python中可变对象和不可变对象
- 23. Numpy、Scipy、Panadas的区别
- 24. 列表的顺序访问和随机访问
- 25. 随机函数
- 26. Python中单下划线和双下划线
- 27. Python的作用域以及Python搜索变量的顺序
- 28. 编码与解码
- 29. 增量赋值
- 30. exec对字符串执行和eval对字符串求值
- 31. 协程与生成器
- 32. 模块和代码块
- 33. 上下文管理器
1. Python语言的特性
Python是一种解释型语言,不需要再运行之前进行编译。
Python是一种动态类型语言,不需要声明变量的类型。
python适合面向对象编程,允许类的定义以及组合和继承。
2. python语言相比其他语言的优点和缺点
-
优点
- 简单易懂,灵活简洁
- 强大的标准库和三方库
- 活跃的社区,许多开源项目
- 开发效率高,迭代便捷
- 应用领域广泛,Web开发、网络编程、自动化运维、Linux系统管理、数据分析、科学计算、人工智能、机器学习
-
缺点
- 执行效率较差,
- 异步生态不完善,相关的库较少(tornado)
- GIL的存在,无法充分利用多核的特性
3. Python中的类型转换
函数 | 作用 | 函数 | 作用 | 函数 | 作用 | ||
---|---|---|---|---|---|---|---|
int() | 转整型 | list() | 转列表 | bin() | 整数转2进制 | ||
float() | 转浮点型 | dict() | 转字典 | oct() | 整数转6进制 | ||
str() | 转字符串 | set() | 转集合 | hex() | 整数转16进制 | ||
ord() | 字符转整数 | tuple() | 转元组 | complex() | 实数转复数 |
4. new 和 __init__的区别
- __new__是一个静态方法,而__init__是一个实例方法
- __new__方法会返回一个创建的实例,而__init__什么都不返回
- 只有在__new__返回一个cls的实例时,后面的__init__才能被调用
- 创建一个新实例时调用__new__方法,初始化一个实例时调用__init__方法
5. 如何将python2的代码迁移到python3
第一步:使用自带的2to3.py文件,可以实现大部分代码从py2到py3的自动转换。命令:2to3 -w example.py
第二步:使用Pylint或者Pyflakes工具,检测代码错误。
第三步:检查模块和依赖库的变化。
第四步:人工修复被破坏的py2代码。
利用好__future__模块
from __future__ import division # 在Python 2 中表现 Python 3.x 中的整除
from __future__ import unicode_literals # 适应Python 3.x的新的字符串的表示方法
from __future__ import print_function # 使用打印功能
from __future__ import nested_scopes # 静态嵌套范围
from __future__ import generators # 简单生成器
from __future__ import absolute_import # 绝对/相对导入
from __future__ import with_statement # with声明
6. python新式类和旧式类的区别
新式类是在创建的时候继承内置的object对象或者是内置类型如list、dict,而旧式类(经典类)是直接声明的,可以用dir()方法查看新式类中内置了很多性的属性和方法。
新式类遍历方法是广度优先,经典类是深度优先。
7. python自省
在一些语言中也叫做反射,简单来说就是对象检查。面向对象的语言所写的程序在运行时,所能知道对象的类型。是什么(isinstance),是什么类型(type),有那些属性(hasattr),有哪些变量方法(dir),有哪些行为(hasattr),getattr、setattr、delattr、callable。
8. 猴子补丁技术
是一种让程序行为在运行时扩展或者变更的方法。
python充分利用动态语言的特性,在程序运行时动态改变类、模块、属性或方法,为的是将第三方代码打补丁在不按预期运行的bug或者feature上,gevent在这方面运用的比较多。
9. 迭代器和生成器
迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身。对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数。在没有后续元素时,next()会抛出一个StopIteration异常。
生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句,生成器使用yield语句返回一个值,yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)。生成器需要注意:只能遍历一次。
区别:生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常。
10. GIL全局解释器锁
要理解GIL的含义,我们需要从Python的基础讲起。像C++这样的语言是编译型语言,所谓编译型语言,是指程序输入到编译器,编译器再根据语言的语法进行解析,然后翻译成语言独立的中间表示,最终链接成具有高度优化的机器码的可执行程序。编译器之所以可以深层次的对代码进行优化,是因为它可以看到整个程序(或者一大块独立的部分)。这使得它可以对不同的语言指令之间的交互进行推理,从而给出更有效的优化手段。
与此相反,Python是解释型语言。程序被输入到解释器来运行。解释器在程序执行之前对其并不了解;它所知道的只是Python的规则,以及在执行过程中怎样去动态的应用这些规则。它也有一些优化,但是这基本上只是另一个级别的优化。由于解释器没法很好的对程序进行推导,Python的大部分优化其实是解释器自身的优化。更快的解释器自然意味着程序的运行也能“免费”的更快。也就是说,解释器优化后,Python程序不用做修改就可以享受优化后的好处。
要想利用多核系统,Python必须支持多线程运行。作为解释型语言,Python的解释器必须做到既安全又高效,但多线程编程会遇到问题,解释器要留意的是避免在不同的线程操作内部共享的数据,同时它还要保证在管理用户线程时保证总是有最大化的计算资源。这时,为了不同线程同时访问时保护数据,当一个线程运行python程序的时候会霸占整个python解释器,也就是给解释器加了一把全局锁,这使得对于任何python程序,不管有多少处理器,多少线程,任何时候都自由一个线程在执行,其他线程在等待正在运行的线程完成才能运行。
如果线程运行过程中遇到耗时操作,超时时间超过一个固定值,则单线线程将会解开全局解释器锁,使其他线程运行。所以在多线程中是有先后顺序的,并不是同时运行的。多进程因每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程同时运行,缺点就是系统资源开销大。
11. 函数是一等公民
在python中一切皆对象,num、list、dict、tuple、function、class和模块等都是对象,如公民一样地位平等,可以在运行时创建,并能被赋值给变量,作为集合对象的元素,还能够作为函数的参数和返回值。
Python 中函数是一等公民,意思是 Python 中的函数和整数、字符串等常见概念的地位是平等的,一个整数和一个字符串等对象可以干的事,一个函数也可以办到。
import re
def factorial(n):
"""
returns n!
"""
return 1 if n < 2 else n * factorial(n - 1)
class Domo:
pass
items = [1, 1.0, 'hello', [1], {
'a': 1}, {
1}, factorial, Domo(), re, None, object]
for item in items:
print(f'对象 {item} 的类型是 {type(item).__name__},', f'对象 {type(item).__name__}类 的类型是 {type(type(item)).__name__}.')
# 结果
'''
对象 1 的类型是 int, 对象 int类 的类型是 type.
对象 1.0 的类型是 float, 对象 float类 的类型是 type.
对象 hello 的类型是 str, 对象 str类 的类型是 type.
对象 [1] 的类型是 list, 对象 list类 的类型是 type.
对象 {'a': 1} 的类型是 dict, 对象 dict类 的类型是 type.
对象 {1} 的类型是 set, 对象 set类 的类型是 type.
对象 <function factorial at ...> 的类型是 function, 对象 function类 的类型是 type.
对象 <__main__.Dumb object at ...> 的类型是 Dumb, 对象 Dumb类 的类型是 type.
对象 <module 're' from 'C:\\...\\re.py'> 的类型是 module, 对象 module类 的类型是 type.
对象 None 的类型是 NoneType, 对象 NoneType类 的类型是 type.
对象 <class 'object'> 的类型是 type, 对象 type类 的类型是 type
'''
for item in items:
print(f'类对象 {item.__class__.__name__} 的基类是: {item.__class__.__bases__}')
print(f'类对象 {object.__name__} 的基类是: {object.__bases__}')
# 结果
'''
类对象 int 的基类是: (<class 'object'>,)
类对象 float 的基类是: (<class 'object'>,)
类对象 str 的基类是: (<class 'object'>,)
类对象 list 的基类是: (<class 'object'>,)
类对象 dict 的基类是: (<class 'object'>,)
类对象 set 的基类是: (<class 'object'