python2和python3的区别
一、print区别
python2中print是一个打印语句,将python后面内容视为元组对象,直接打印出来
python3中print作为函数存在,print函数可以接受多个位置的参数书
二、编码区别
python2中默认编码方式为ASCLL编码,但ASCLL编码无法对中文等字符进行有效编码,因此python2中经常出现编码错
python3中默认使用utf-8格式编码,可以识别文字等符号
三、True和False
python2中True和False为全局变量,可以随意赋值
python3中True和False为两个关键字,指向两个固定的对象,不可赋值
四、nonlocal关键字
python2中不能在嵌套字中将一个变量声明为非全局变量
python3中加入了nonlocal关键字,可以在嵌套函数中给变量前面添加关键字nonlocal,就可以在嵌套函数之外使用嵌套函数中的变量
列表和元组区别
列表:
1. 可以添加列表内容 append
2. 可以统计某个列表段在整个列表中出现的次数count
3. 可以插入字符串,并把整个字符串的每个字母拆分当成一个列表追加到列表中extedn
4. 可以查询某个列表段在整个列表的位置 index
5. 可以指定位置插入一个列表段insert
6. 可以删除列表中最后一个列表段pop
7. 可以删除指定列表中的某个列表段
8. 可以正向反向排序 reverse
9. 可以按字母或数组排序 sort
10定义列表使用[]
元组
1. 可以统计某个元组段在整个元组出现的次数count
2. 可以查询某个元组段在整个元组中的元组号 index
3. 定义元组使用()
列表可以随意改变,元组的元素不可以改变
深拷贝和浅拷贝区别
深拷贝:除了对象本身被复制外,对象多包含的所有成员变量都会被复制,包括类型的成员对象(在计算机中开辟了一块新的内存地址用于存放复制的对象)
浅拷贝:只复制对象其中包含的值类型的成员变量,而引用类型的成员对象没有被复制(只是复制,原地址对象改变,被浅复制的也会改变)
可变类型和不可变类型
不可变类型:在第一次复制的时候,会开辟一块空间,用于储存变量赋予的值,存放这个值的内存空间就是内存中的一个地址,而这个变量存储的并不是被赋值的值,而是存放吧这个值的内存地址,不可变就是指这个数据在内存中的值,所以当我们改变这个变量的赋值时,只是在内存中重新开辟了一块空间,将新的数据存放到新的内存地址里,而原来那个变量就不再引原数据的的内存地址,而是转换为引用新数据的内存地址了。
可变类型:第一次声明了一个可变数据类型的时候,同时开辟一个空间,并将所赋值的数据方在内存中,然后将这个变量指向数据所在的内存地址中,不同的是, 可变数据类型可以对内存中的数据直接进行修改, 并且不会导致变量引用地址的变化, 但是这种修改仅限于Python中的内置方法, 比如list.append(), list.remove(), dict.pop(), dict.clear()等, 如果要是进行重新赋值的操作的话, 一样会改变变量的地址指向。而且当变量重新指向了新的内存之后,之前的内存也就被自动回收了。
python中is和==区别
is:比较两个对象的id值是否相等,也就是比较两个对象是否为同一个实例对象,是否指向相同一个内存地址
= =:比较两个对象的内容是否相等,默认会调用对象的__eq__()方法
python常用的内置函数
函数 | 功能 |
---|---|
abs() | 返回绝对值 |
chr() | 返回整数所有字符 |
divmod(x,y) | 返回除以y的商及余数组成的元组 |
float | 转换位浮点数 |
hex | 转换为十六进制 |
int | 转化为整数 |
len | 返回参数元素个数 |
max | 返回参数中最大值 |
min | 返回参数中最小值 |
oct | 转化为八进制 |
ord | 返回字符Unicode编码 |
pow(x,y) | 返回x的y次方 |
round | 返回四舍六入值 |
sorted | 由小到大排序 |
str | 转换为字符串 |
sum | 计算列表中元素的总和 |
type | 返回对象的数据类型 |
python常用的模块
- os模块:路径
- re模块:正则表达式
- sys模块:标准输入输出
- math模块:数字公式
- json模块:字符串与其他数据类型转换
- pickle模块:序列化
- random模块:生成随机数
- time模块:时间模块
- request模块:http请求库
递归
一个函数在内部调用自己本身,这个函数就是递归函数
递归特征:
- 递归函数必须有一个明确的结束条件
- 每进入更深一层的递归时,问题规模相对于上一次递归减少
- 相邻两次重复之间有紧密联系,前一次为后一次做准备
- 递归效率不高,递归层次过多会导致栈溢出
递归函数的优点:定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
递归函数的缺点:使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
#查看最大递归层数
def recursion(n):
print(n)
n += 1
recursion(n)
recursion(1)