python基础知识一

1.python的特点和优点:

  1. 解释性:把源程序编译成中间代码(字节码),然后用解释器把中间代码一条条翻译成目标机器代码。
  2. 动态特性:在运行时可以改变其结构的语言。(引入新的函数、对象、属性等)【动态绑定】
  3. 面向对象
  4. 语法简洁
  5. 开源

2.深拷贝和浅拷贝的区别

python 6个标准的数据类型:
不可变:Number(数字)、String (字符串)、 Tuple(元组)
可变数据:List(列表)、Dictionary(字典)、Set(集合)

**深拷贝:**将对象本身复制给另一个对象,这就意味着如何对对象副本进行更改不会影响原对象。【深拷贝使用deepcopy()】

  1. 浅拷贝,除了顶层拷贝,还对子元素也进行了拷贝(本质是递归的浅拷贝)
  2. 经过深拷贝后,原始对象和拷贝对象所有的元素地址没有相同的。

**浅拷贝:**将对象的引用复制给另一个对象,因此,我们在副本中进行更改,会影响原对象。【浅拷贝使用copy()】

  1. 对于不可变类型Number、string、Tuple。浅复制仅仅只地址指向,不会开辟空间。
  2. 对于可变类型List、 Dictionary、set。浅复制会开辟新的空间地址(仅仅是最顶层开辟了新空间,里面的元素地址还是一样的),进行浅拷贝。
  3. 浅拷贝后,改变原始对象中可变类型的元素的值,会同时
    影响拷贝对象;改变原始对象中为不可变类型的元素的值,只有原始类型受影响。

3.列表和元组不同

1.列表是动态数组,他们可变且可以设置长度(改变其内部元素的个数)
2.元组是静态的,是不可变的。内部数据一旦创建无法改变。
3.元组缓存于python运行时环境,这就意味着我们每次使用元组时无须访问内核去分配内存。

4.解释Python中的三元表达式

使用语法:

[on true] if [expression] else [on false]

如果[expression]为真,则[on true]部分会被执行,否则[on false]部分被执行。

5.Python中如何实现多线程

引入多线程的原因:并行处理可以大幅度提高整个系统的效率。

多线程特点:

  1. 这些任务的本质是异步的,需要由多个并发事务;
  2. 各个事务运行顺序可以是不确定、随机的、不可预测的。
    这样的编程任务可以分成多个执行流,每一个流都有一个要完成的目标。再根据不同的应用,这些子任务可能都要计算出一个中间结果。用于合并得到最后的结果。

进程:
是并发执行程序在执行过程分配和管理资源的基本单位(动态概念)。是程序的一次执行,每个进程都有自己的地址空间、内存、数据栈等。【进程由自己的内存空间,数据栈等,所以只能使用进程间通讯,不能直接共享信息】
进程组成:进程控制块(PCB)、相关程序段、数据结构集

单机系统进程通信的4种形式:
主从式,会话式,消息或邮箱机制,共享存储区方式
主从式典型的例子:终端控制进程和终端进程
会话式典型的例子:用户进程与磁盘管理之间的通信。

线程(轻量级进程):
是进程的一部分,是cpu调度的一个基本单位。所有的线程运行在同一个进程中,共享相同的运行环境(所属进程的资源)。
线程执行的特性:
3个基本状态:就绪、执行、阻塞

计算机线程的改变只代表CPU的执行过程的改变,而没有发生进程所拥有的资源变化。

Python线程和全局解释器锁

全局解释器
Python代码的执行由python虚拟机(解释器主循环)来控制。虽然Python解释器可以“运行”多个线程,但在任意时刻,只有一个线程在解释器中运行。
而Python虚拟机的访问由全局解释器(global interpreter lock, GIL)来控制。正是这个锁保证了同一时刻只有一个线程在运行。(lock)
( Python中实现多线程)多线程执行过程:

  1. 设置GIL
  2. 切换到一个线程去运行
  3. 运行(指定属灵的字节码的指令/线程主动让出控制)
  4. 把线程设置为睡眠状态
  5. 解锁GIL
  6. 再次重复以上步骤。

退出线程
调用退出线程方法:
1.thread.exit()
2.sys.exit() 或者抛出SystemExit异常

多线程的模块thread和threading 、Queue

  1. thread模块:允许程序员创建和管理线程,它提供了基本的线程和锁的支持。
  2. threading模块:允许程序员插件和管理线程,它提供公告级别,更强的线程管理功能。
  3. Queue模块:允许用户创建一个可用于多线程共享数据的队列数据结构。

避免使用thread进程模块原因:
1.threading 模块更全更先进
2.thread模块在主线程退出的时候,其他线程没有被 清楚就退出了。而threading模块(守护线程)可以保证所有重要的子线程退出后,进程才会结束。
3.thread模块同步语句少。

6.继承

一个类继承自另一个类,即子类继承父类。同时获取父类的属性和方法。
**好处:**继承使我们可以重用代码,并且方便维护代码。

7 Flask框架

8.如何在Python中管理内存

Python用一个私有的(heap)堆内存空间来放置所有的对象和数据结构,我们无法访问它。有解释器来管理它。 为Python对象的heap空间分配内存由Python内存管理模块进行的。其使用核心的API会提供一些访问该模块的方法供程序员使用。Python自带的垃圾回收系统会回收并释放没有被使用的内存,让他们能够被其他程序使用。

9.当退出Python时,是否释放了所有的内存分配。

答案是否定的。那些具有对象循环或者全局命名空间的引用的变量,在Python退出是往往不会被释放的。

10.猴子补丁

在运行时动态的修改类和模块。

11.解释*args 和 **kwargs

*args 和 **kwargs (也可以写成 * 和 **):他们允许你在给函数传不定数量的参数。
区别:
*arg : 在给不定参数传递参数时,未给参数命令。
**kwargs : 在不定传递参数时,定义了参数(即给参数进行了命名)。

12.编程中实现大小写字符转化函数

  1. upper():全部转化为大写字母。
  2. lower():全部转化为小写字母。

13.PEP8

PEP8时编程规范,内容是一些关于如何让程序具有可读性的建议。

14.PIcking和unpickling

(主要用于列表字典等复杂数据结构的存储)
picking:将python对象转换为二进制存放(存放),使用dump()函数转储。
unpicking:将二进制转换为对象的过程(读取),使用load()函数加载。

15.有哪些工具可以帮助debug或者静态分析

PyChecker是一个静态分析工具,它不仅能报告源代码中的错误,并且会报告错误类型和复杂度。
Pylint是检验模块是否达标到代码标准的另一额工具。

16.什么是装饰器?

Python装饰器是Python中特有变动,可以是修改函数变得更容易。(在不用更改原函数的代码前提下给函数增加新的功能即就是对原函数、对象的加强,相当于重新封装)

作用:

  1. 引入日志
  2. 函数执行时间统计
  3. 执行函数的初处理
  4. 执行函数后的清理功能
  5. 权限校验等场景
  6. 缓存

17.Python中值传递和引用传递的区别

python中对一个函数可以传递参数,但是如何分辨是值传递还是引用传递,不是程序员手动控制的,而是python根据你传入的数据对象,自动识别的。
如果你传入的参数对象是可变对象:列表,字典,这个时候就是引用传递,如果参数在函数体内被修改,那么源对象也会被修改。

如果你传入的参数对象是不可变的对象:数字,元组,字符串,这个时候就是值传递。那么源对象是不会改变的。
例1:

import sys
a =2
b = [1,2, 3]
def change(x, y):
	x = 3
	y[0] = 4
change(a , b)
print(a, b)

结果: 2  [4,2 ,3]

18.什么是Python的命名空间

定义
命名空间:记录变量的轨迹。
命名空间是一个字典,它的键就是变量名,它的值就是那些变量的值。
分类:
1.局部命名空间:函数的命名空间。他记录函数的变量,包括函数的参数和局部定义的变量。
2.全局命名空间:模块的命名空间。他记录函数的变量,包括函数类、
其它导入的模块、模块级的变量和常量。
3.内置命名空间:任何模块都可访问它,它存放着内置的函数和异常。
查找顺序
使用变量:
局部命名空间—>全局命名空间—>内置命名空间——>抛出异常(NameError).

嵌套函数的情况:
当前函数命名空间——>父函数的命名空间———>模块命名空间 —>内置命名空间。

生命周期

  1. 内置命名空间在Python解释器启动时被创建,会一直保留,不会被删除。
  2. 模块的全局命名空间在模块定义被读入时创建,通常模块明敏空间也会一直保存到解释器退出。
  3. 当函数被调用时创建一个局部的命名空间,当函数返回结果或者抛出异常时,被删除。每一个递归调用函数都有自己的命名空间。
    命名空间的访问
    1.局部命名空间用locals()BIF来访问。
    2.全局命名空间可以通过Globals()BIF来访问。

19.遍历器(iterator)

是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只有部署iterator接口,就可以完成遍历操作。

作用:

  1. 为各种数据结构提供一个统一的、简便的访问接口。
  2. 使数据结构能够按照某种次序排列。
  3. 创造一种新的遍历命令for …of 循环。

20.Xrange和range区别

Xrange用于返回一个xrange对象作(为一个生成器)。即他的数据生成一个取出一个。,无论这个对象有多大,都只会使用同样的空间。而range用于返回一个数组。

注意:
1.xrange和range这两个基本是使用在循环的时候。
2.当需要一个列表时,就必须使用range.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值