【Python基础知识库】Python语言基础知识点梳理

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全局解释器锁

Python的底层

要理解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'
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值