range,守护线程,引用,__name__
1、range 和 xrange 的区别?
很大的数字序列的时候,用xrange会比range性能优很多
range 是python3中的。 range(10) 返回是一个列表 range(0,10,2 )
xrange是python2 中的。 xrange(10)返回是一个生成器
2、守护线程是什么?
如果你设置一个线程为守护线程,,就表示你在说这个线程是不重要的,在进程退出 的时候,不用等待这个线程退出。
如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程的daemon属性。即,
在线程开始(thread.start())之前,调用setDeamon()函数,设定线程的daemon标志。
(thread.setDaemon(True))就表示 这个线程“不重要”。
如果你想等待子线程完成再退出,那就什么都不用做。或者显示地调用thread.setDaemon(False),设置daemon的值为false。
新的子线程会继承父线程的daemon标志。整个Python会在所有的非守护线程退出后才会结束,
即进程中没有非守护线程存在的时 候才结束。
import time
import threading
def fun():
print "start fun"
time.sleep(2)
print "end fun"
print "main thread"
t1= threading.Thread(target=fun,args=())
#t1.setDaemon(True)
t1.start()
time.sleep(1)
print "main thread end"
main thread
start fun
main thread end
end fun
说明,程序在等待子线程结束,才退出了。
import time
import threading
def fun():
print "start fun"
time.sleep(2)
print "end fun"
print "main thread"
t1 = threading.Thread(target=fun,args=())
t1.setDaemon(True)
t1.start()
time.sleep(1)
print "main thread end"
main thread
start fun
main thread end
程序在主线程结束后,直接退出了。 导致子线程没有运行完
3、__name__使用方法? if __name__ == "__main__":
1. 如果模块是被导入,__name__的值为模块名字
2. 如果模块是被直接执行,__name__的值为’ __main__
模块是对象,并且所有的模块都有一个内置属性 __name__,在cmd 中直接运行.py文件,则 __name__的值是'__main__';
而在import 一个.py文件 后,__name__的值就不 是'__main__' 了
4、引用的传递
a = 1
def fun(a):
a = 2
fun(a)
print a # 1
a = []
def fun(a):
a.append(1)
fun(a)
print a # [1]
所有的变量都可以理解是内存中一个对象的“引用”
通过id来看引用a的内存地址可以比较理解,但实际不是
a = 1
def fun(a): 这里的形参a如果是b.就好理解了
print "func_in",id(a) # func_in 41322472
a = 2
print "re-point",id(a), id(2) # re-point 41322448 41322448
print "func_out",id(a), id(1) # func_out 41322472 41322472
fun(a)
print a # 1
a = []
def fun(a):
print "func_in",id(a) # func_in 53629256
a.append(1)
print "func_out",id(a) # func_out 53629256
fun(a)
print a # [1]
类型是属于对象的,而不是变量。而对象有两种,“可更改”(mutable)与“不可更改”(immutable)对象。
在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。(这就是这个问题的重点)
第一个案例当一个引用传递给函数的时候,函数自动复制一份引用而已,其他的活没做,只是传递了引用而已,
多了一个引用,这个函数里的引用和外边的引用没有半毛关系了.所以第一个例子里函数把引用指向了一个不可变对象,
当函数返回的时候,外面的引用没半毛感觉.而第二个例子就不一样了,函数内的引用指向的是可变对象,对它的操作外面的也会修改.