python基础知识(持续更新)

常见面试题https://www.zhangjunbk.com/article/23397
静态方法https://www.cnblogs.com/Meanwey/p/9788713.html

1、copy 和 deepcopy 的区别是什么?

python中的对象之间的赋值是按引用传送的。
(1)copy()浅拷贝,只拷贝父对象,不会拷贝对象的内部的子对象。

(2)deepcopy()深拷贝,拷贝父对象及其子对象。

#!/usr/bin/python
## -*-f= coding:utf-8 -*-
import copy
origin=[1,2,[3,4]]
cop1=origin #引用
cop2=copy.copy(origin)#浅拷贝
cop3=copy.deepcopy(origin)#深拷贝
origin[2][0]="hey!"
origin[0]="hey!"

print("原来的值:",origin)
print("引用值:",cop1)
print("浅拷贝:",cop2)
print("深拷贝:",cop3)
print("---------------")

print("初始对象地址",id(origin[0]))
print("引用的对象地址",id(cop1[0]))
print("浅拷贝对象地址",id(cop2[0]))
print("深拷贝对象地址",id(cop3[0]))
print("---------------")

print("初始对象地址",id(origin[2][0]))
print("引用的子对象地址",id(cop1[2][0]))
print("浅拷贝子对象地址",id(cop2[2][0]))
print("深拷贝子对象地址",id(cop3[2][0]))

结果为如下:

原来的值: ['hey!', 2, ['hey!', 4]]
引用值: ['hey!', 2, ['hey!', 4]]
浅拷贝: [1, 2, ['hey!', 4]]
深拷贝: [1, 2, [3, 4]]
---------------
初始对象地址 1497843333168
引用的对象地址 1497843333168
浅拷贝对象地址 1497801451824
深拷贝对象地址 1497801451824
---------------
初始对象地址 1497843333168
引用的子对象地址 1497843333168
浅拷贝子对象地址 1497843333168
深拷贝子对象地址 1497801451888

py没有赋值,只有引用。py没有变量,平时说的变量只是标签,即引用。

不可变对象包括int,float,long,str,tuple等
对于不可变类型的变量,如果要更改变量,则会创建一个新值,把变量绑定到新值上,而旧值如果没有被引用就等待垃圾回收。

2、代码中经常遇到的*args, **kwargs 含义及用法。

args表示任意位置参数,* kwargs表示任意个关键字参数
用法:def 函数名(位置参数,args,默认参数,**kwargs),记得arg在kwargs之前

#!/usr/bin/python
## -*-f= coding:utf-8 -*-
def Func(a,b,*args,**kwargs):
    print (a)
    print (b)
    print (args)
    print (kwargs)

Func(0,1,2,3,index1=11,index2=22)

输出的结果为:

0
1
(2, 3)
{
     'index1': 11, 'index2': 22}

注意(2,3)是因为不定的参数形式把剩下没有关键字的参数形成为一个tuple,另外后面2个是赋值关系,会变为字典。

3、Python 中会有函数或成员变量包含单下划线前缀和结尾,和双下划线前缀结尾,区别是什么?

单下划线:

(1)变量为保护变量(只有类对象和子类对象可以访问这些变量)
(2)函数为不能直接访问的类属性,要通过类提供的接口来访问

双下划线:

(1)变量为私有成员(只有类对象自己可以访问,子类对象不能访问该成员)
(2)py里的特殊方法专用的标志符,如__ init()__表示类的构造函数

4、w、a+、wb 文件写入模式的区别

模式 作用 若文件不存在 是否覆盖
w 只写 创建
a+ 可读可写 创建 否,追加写
wb 只写,以二进制写方式打开 创建
其他几个
r+ 可读可写 报错
w+ 可读可写 创建
a 只能写 创建 否,追加写

5、举例 sort 和 sorted 的区别

(1)sort是直接应用在list上排序

>>> lst1=[(8,'andy',20),(2,'liu',21),(5,'luo',22)]
>>> lst1.sort()
>>> lst1
[(8, 'andy', 20), (2, 'liu', 21), (5, 'luo', 22)]

(2)sorted可对所有可迭代的对象进行排序,如果对list操作则是产生一个新的列表。

>>> list1=[(8,'andy',20),(2,'liu',21),(5,'luo',22)]
>>> sorted(list1)
[(2, 'liu', 21), (5, 'luo', 22), (8, 'andy', 20)]
>>> list1
[(8, 'andy', 20), (2, 'liu', 21), (5, 'luo', 22)]

6、用python实现快速排序算法

https://www.jb51.net/article/158963.htm 这里有2种方法

#!/usr/bin/python
## -*-f= coding:utf-8 -*-
def QuickSort(lst1,i,j):#i左,j为右
    if i >= j:
        return lst1
    pivot = lst1[i]
    low = i
    high = j

    # 划分枢轴
    while i < j:
        while i < j and lst1[j] >= pivot:
            j -= 1
        lst1[i]=lst1[j]
        while i < j and lst1[i] <=pivot:
            i += 1
        lst1[j]=lst1[i]
    lst1[j] = pivot
    
    QuickSort(lst1,low,i-1)
    QuickSort(lst1,i+1,high)
    return lst1

if __name__=="__main__":
    lst1=[30,24,5,58,18,36,12,42,39]
    print("排序前的序列为:")
    for i in lst1:
        print(i,end =" ")
    print("\n排序后的序列为:")
    for i in QuickSort(lst1,0,len(lst1)-1):
        print(i,end=" ")

注意函数名为驼峰命令,单词开头大写;
注意命名规范:对于局部变量情况,list列表前缀为lst,tuple前缀为t,字典的前缀为d,其他按照开头第一个小写字母,如整型i、浮点型f、字符串s、布尔型b。
输出结果为

排序前的序列为:
30 24 5 58 18 36 12 42 39 
排序后的序列为:
5 12 18 24 30 36 39 42 58 

7、isinstance 作用以及应用场景?

格式为isinstance(p,类型),即判断p是否为对应类型。

#!/usr/bin/python
## -*-f= coding:utf-8 -*-
p='123'
print(isinstance(p,str))#判断p是否为字符串类型

8、什么是断言?应用场景?

断言由assert方法实现,只有成功了程序才继续执行,否则报错。
格式为【assert 表达式,返回数据】,当表达式为false时触发异常,返回数据。

#!/usr/bin/python
## -*-f= coding:utf-8 -*-
try:
    n=input("请输入一个数字:")
    assert n.isdigit(),"只能输入数字"
    print("你输入的是:",n)
except Exception as ex:
    print("发现错误:",ex)

结果为:

请输入一个数字:4你输入的是: 4>>> 请输入一个数字:d发现错误: 只能输入数字

9、Python 中的异常处理,写一个简单的应用场景

#!/usr/bin/python
## -*-f= coding:utf-8 -*-
try:    
	a=open("testfile","r+")    
	a.write("该为测试异常的文件")
except IOErrror:    
	print("Error:没有找到文件或读取文件失败")
else:
    print("内容写入文件成功")    
    a.close()

如果一开始没有testfile文件则会输出:Error:没有找到文件或读取文件失败。

异常处理https://www.runoob.com/python/python-exceptions.html

10、Python 中递归的最大次数,那如何突破呢?

默认最大次数为1000次,但可以用sys突破:

#!/usr/bin/python
## -*-f= coding:utf-8 -*-
import sys
sys.setrecursionlimit(1500)
def Recursion(n):    
	if(n<=0):        
		return    
	print(n)    
	Recursion(n-1)
if __name__ =="__main__":
    Recursion(1000000)

11.py2和py3的区别

print从语句变为函数,原 print 1,2+3改为print(1,2+3)
range(0,4)结果是列表[0,1,2,3]改为list(range(0,4))
字符串以8bit字符串存储改为字符串以16bit unicode字符串存储
py2中的utf-8和gbk转换才要2次

12.gbk和utf-8编码

GBK编码方式的编码是以中国国情而创造的,在国际上的兼容性不好,这也是为什么大多数的网页是使用UTF-8编码而不是GBK。
py3中默认编码是unicode,而py2中默认编码是ASCII

GBK转码:https://www.cnblogs.com/QZrun220/p/13295041.html

13.

你可能感兴趣的:(python&爬虫)