1、Python有哪些特点和优点?
作为一门编程入门语言,Python主要有以下特点和优点:
可解释
具有动态特性
面向对象
简明简单
开源
具有强大的社区支持
2、深拷贝和浅拷贝之间的区别是什么?
深拷贝就是将一个对象拷贝到另一个对象中,这意味着如果你对一个对象的拷贝做出改变时,不会影响原对象。
在Python中,我们使用函数deepcopy( ) 执行深拷贝,导入模块copy,如下所示:
>> > import copy
>> > b= copy. deepcopy( a)
而浅拷贝则是将一个对象的引用拷贝到另一个对象上,所以如果我们在拷贝中改动,会影响到原对象。
我们使用函数function( ) 执行浅拷贝,使用如下所示:
>> > b= copy. copy( a)
import copy
a = [ 1 , 2 , 3 , 4 , 5 , [ 'a' , 'b' ] ]
b = a
c = copy. copy( a)
d = copy. deepcopy( a)
print ( "a=" , a, "id(a)=" , id ( a) , "id(a[5])=" , id ( a[ 5 ] ) )
print ( "b=" , b, "id(b)=" , id ( b) , "id(b[5])=" , id ( b[ 5 ] ) )
print ( "c=" , c, "id(c)=" , id ( c) , "id(c[5])=" , id ( c[ 5 ] ) )
print ( "d=" , d, "id(d)=" , id ( d) , "id(d[5])=" , id ( d[ 5 ] ) )
print ( "" , "*" * 70 , "" , sep = "\n" )
a. append( 6 )
a[ 5 ] . append( 'c' )
print ( "a=" , a, "id(a)=" , id ( a) , "id(a[5])=" , id ( a[ 5 ] ) )
print ( "b=" , b, "id(b)=" , id ( b) , "id(b[5])=" , id ( b[ 5 ] ) )
print ( "c=" , c, "id(c)=" , id ( c) , "id(c[5])=" , id ( c[ 5 ] ) )
print ( "d=" , d, "id(d)=" , id ( d) , "id(d[5])=" , id ( d[ 5 ] ) )
a= [ 1 , 2 , 3 , 4 , 5 , [ 'a' , 'b' ] ] id ( a) = 134126984 id ( a[ 5 ] ) = 122654408
b= [ 1 , 2 , 3 , 4 , 5 , [ 'a' , 'b' ] ] id ( b) = 134126984 id ( b[ 5 ] ) = 122654408
c= [ 1 , 2 , 3 , 4 , 5 , [ 'a' , 'b' ] ] id ( c) = 134126792 id ( c[ 5 ] ) = 122654408
d= [ 1 , 2 , 3 , 4 , 5 , [ 'a' , 'b' ] ] id ( d) = 133056712 id ( d[ 5 ] ) = 124332808
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
a= [ 1 , 2 , 3 , 4 , 5 , [ 'a' , 'b' , 'c' ] , 6 ] id ( a) = 134126984 id ( a[ 5 ] ) = 122654408
b= [ 1 , 2 , 3 , 4 , 5 , [ 'a' , 'b' , 'c' ] , 6 ] id ( b) = 134126984 id ( b[ 5 ] ) = 122654408
c= [ 1 , 2 , 3 , 4 , 5 , [ 'a' , 'b' , 'c' ] ] id ( c) = 134126792 id ( c[ 5 ] ) = 122654408
d= [ 1 , 2 , 3 , 4 , 5 , [ 'a' , 'b' ] ] id ( d) = 133056712 id ( d[ 5 ] ) = 124332808
3、列表和元组之间的区别是?
二者的主要区别是列表是可变的,而元组是不可变的。举个例子,如下所示:
>> > mylist= [ 1 , 3 , 3 ]
>> > mylist[ 1 ] = 2
>> > mytuple= ( 1 , 3 , 3 )
>> > mytuple[ 1 ] = 2
>
Traceback ( most recent call last) :
File "<pyshell#97>" , line 1 , in < module>
mytuple[ 1 ] = 2
会出现以下报错:
TypeError: ‘tuple ’ object does not support item assignment
4、在Python中如何实现多线程?
一个线程就是一个轻量级进程,多线程能让我们一次执行多个线程。
我们都知道,Python是多线程语言,其内置有多线程工具包。
Python中的GIL(全局解释器锁)确保一次执行单个线程。
一个线程保存GIL并在将其传递给下个线程之前执行一些操作,这会让我们产生并行运行的错觉。
但实际上,只是线程在CPU上轮流运行,当然,所有的传递会增加程序执行的内存压力。
5、解释一下Python中的继承
当一个类继承自另一个类,它就被称为一个子类/ 派生类,继承自父类/ 基类/ 超类。
它会继承/ 获取所有类成员(属性和方法)。
继承能让我们重新使用代码,也能更容易的创建和维护应用。
Python支持如下种类的继承:
单继承:一个类继承自单个基类
多继承:一个类继承自多个基类
多级继承:一个类继承自单个基类,后者则继承自另一个基类
分层继承:多个类继承自单个基类
混合继承:两种或多种类型继承的混合
6、什么是猴子补丁?
在运行期间动态修改一个类或模块。
>> > class A :
def func ( self) :
print ( "Hi" )
>> > def monkey ( self) :
print "Hi, monkey"
>> > m. A. func = monkey
>> > a = m. A( )
>> > a. func( )
运行结果为:
Hi, Monkey
7、请解释使用 *args 和 **kwargs 的含义
在python中,* args和** kwargs通常使用在函数定义里。
* args 和 ** kwargs 都允许你给函数传不定数量的参数,
即使在定义函数的时候不知道调用者会传递几个参数。
ps: * args和** kwargs只是一个大家都遵守的习惯,名字可以任意写的 。
1 . * args例子
* args能够接收不定量的非关键字参数,会把位置参数转化为tuple (非键值对的参数组),
例子如下面代码所示:
def func ( * args) :
for i in args:
print ( i)
func( 1 , 2 , 3 , 4 )
运行结果:
1
2
3
4
2 . ** kwargs 例子
** kwargs允许你传递不定量个关键字参数。
如果你需要在函数中定义不定量个命名参数,那么你就要使用** kwargs了,
它会把关键字参数转化为dict (键值对参数组),例子如下面代码所示:
def func ( ** kwargs) :
for i in kwargs:
print ( i, kwargs[ i] )
func( a= 1 , b= 2 , c= 3 , d= 4 )
运行结果:
a 1
b 2
c 3
d 4
def foo ( * args, ** kwargs) :
for i in args:
print ( i, args, type ( args) )
print ( "*" * 55 )
for j in kwargs:
print ( j, kwargs[ j] , kwargs, type ( kwargs) )
foo( 1 , 2 , 3 , a= 1 , b= 2 , c= 3 , d= 4 )
1 ( 1 , 2 , 3 ) < class 'tuple' >
2 ( 1 , 2 , 3 ) < class 'tuple' >
3 ( 1 , 2 , 3 ) < class 'tuple' >
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
a 1 { 'a' : 1 , 'b' : 2 , 'c' : 3 , 'd' : 4 } < class 'dict' >
b 2 { 'a' : 1 , 'b' : 2 , 'c' : 3 , 'd' : 4 } < class 'dict' >
c 3 { 'a' : 1 , 'b' : 2 , 'c' : 3 , 'd' : 4 } < class 'dict' >
d 4 { 'a' : 1 , 'b' : 2 , 'c' : 3 , 'd' : 4 } < class 'dict' >
8、python中new和init的区别是什么?
__new__是一个静态方法, 而__init__是一个实例方法
__new__方法会返回一个创建的实例, 而__init__什么都不返回
只有在__new__返回一个cls的实例时后面的__init__才能被调用
当创建一个新实例时调用__new__, 初始化一个实例时用__init__
9、解释一下Python中的三元运算
不像C+ + ,我们在Python中没有?: ,但我们有这个:
[ on true] if [ expression] else [ on false]
如果表达式为True ,就执行[ on true] 中的语句。否则,就执行[ on false] 中的语句。
下面是使用它的方法:
>> > a, b= 2 , 3
>> > min = a if a< b else b
>> > min
运行结果:
2
>> > print ( "Hi" ) if a< b else print ( "Bye" )
运行结果:
Hi
10、在Python中是如何管理内存的?
Python有一个私有堆空间来保存所有的对象和数据结构。
作为开发者,我们无法访问它,是解释器在管理它。
但是有了核心API后,我们可以访问一些工具。Python内存管理器控制内存分配。
另外,内置垃圾回收器会回收使用所有的未使用内存,所以使其适用于堆空间。
11、参考链接
点击查看原文地址链接