1.Python函数参数的传递
例1:a=1
def fun(a):
a=2
fun(a)
print a #1
例2:a=[]
def fun(a):
a.append(1)
fun(a)
print a #1
这里记住的类型是属于对象的,而对象分为可变和不可变的,可变的list,dict,不可变的是string,number,tuple。
一个引用传递给函数,函数自动复制一份引用,函数里边的引用和外边的没有关系。在第一个例子里函数把应用指向了一个不可变的对象,函数里面和外面的结果不一样。第二个例子函数把引用指向了可变对象,直接在内存里进行修改。
2.@classmethod 和 @staticmethod
Python里分为静态方法,实例方法和类方法。
def foo(x):
print "excuting foo(%s)"%(x)
class A(object):
def foo(self,x):
print "excuting foo(%s,%s)"%(self,x)
@classmethod
def class_foo(cls,x):
print "excuting class_foo(%s,%s)"%(cls,x)
@staticmethod
def static_foo(x):
print "excuting static_foo(%s)"%x
a=A()
实例a可以调用静态方法,类方法和实例方法 类A 可以调用静态方法和类方法,但是不可以调用实例方法
首先先要理解下self和cls,这个self和cls是对实例或者类的一个绑定,一般的函数foo(x)就可以随意调用,他和任何实例或者类无关,实例方法的调用离不开实例,每次的调用都要把实例自己传递给函数,a.foo(self,x)等于a.foo(a,x),a.foo(x)其实也是a.foo(a,x),类方法一样,只不过他传递的是类而不是实例,A.foo(x)。
3.类变量和实例变量
class Person():
name="aaa"
p1=person()
p2=person()
p1.name="bbb"
print p1.name #bbb
pring p2.name #aaa
print Person.name #aaa
p1.name,一开始调用了类变量,但是实例的作用域把类变量的引用改变了,变成了实例变量,所以,self.name不在指向类变量了。
可以看看下面的例子:
class Person ():
a=[]
p1=Person(0
p2=Person()
p1.name.append(1)
print p1.a #[1]
print p2.a#[1]
print Person.a#[1]
3.python 中单下划线和双下滑线的区别?
_foo(),是一种约定,是指变量私有化,
_foo()_是约束,用来区别其他用户自己的命名,以防止冲突。
4._new_ 和 _init_的区别?
_new_是一个静态方法,_init_是一个实例方法,
_new_方法会返回一个实例,_init_方法什么也不返回,
只有在_new_返回一个实例后,才会调用_init_方法
5.单例模式 (import版)
class My_singleton(objec):
def func(self):
pass
mysingleton = My_singleton()
#to use
from mysingleton.py import My_singleton;
my_singleton.foo()
6.写一个函数,输入一个字符串,返回倒序的结果
1.利用字符串自带的方法:def reverse_text(text='abcdef')
return [::-1]
2.把字符串变成列表,使用列表的reverse方法
def string_reverse(text='abcdef'):
new_text=list(text)
new_text.reverse()
return "".join(new_text)
print string_reverse;
3.新建一个列表,从列表的后面往前取
def string_reverse(text='abcdef'):
list=[]
for i in range(1,len(list)+1):
list.append(text[-i])
return ''.join(list)
4.按升序合并如下两个list, 并去除重复的元素
list1
=
[
2
,
3
,
8
,
4
,
9
,
5
,
6
]
list2
=
[
5
,
6
,
10
,
17
,
11
,
2
]
list3
=
list1
+
list2
print
set
(list3)
list
=
[
'a'
,
'b'
,
'c'
,
'd'
,
'e'
]
print
list
[
10
:]
新的默认列表在仅仅只在函数被定义的时候被创建一次,函数里没有被指定的列表时其实只是操作的同意个列表,