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等则是可以修改的对象。(这就是这个问题的重点)

  第一个案例当一个引用传递给函数的时候,函数自动复制一份引用而已,其他的活没做,只是传递了引用而已,

  多了一个引用,这个函数里的引用和外边的引用没有半毛关系了.所以第一个例子里函数把引用指向了一个不可变对象,

  当函数返回的时候,外面的引用没半毛感觉.而第二个例子就不一样了,函数内的引用指向的是可变对象,对它的操作外面的也会修改.

posted @ 2017-09-23 21:54  西湖歌舞几时休  阅读(129)  评论(0编辑  收藏  举报