码迷,mamicode.com
首页 > 编程语言 > 详细

python必知必会

时间:2015-06-06 16:19:56      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

列了下python中常见内容,适合初学者。
 
一、名空间
按照LEGB方式寻找名字
首先会在local中寻找
L:local, 函数内部名空间
除非使用global、nolocal关键字特别声明,在def或者lambda的函数的形参和内部变量都存储在locals中
 
终端样例:
>>> answer = tell me
>>> def foo():
...     answer = 42
...     print answer
...
>>> foo()
42
>>> print answer
tell me
>>>

 

 
此时在foo中answer就是local名称
 
终端样例:
>>>f = lambda x:x+y
>>>f(1)
>>>2
 
可以通过locals()查看函数内名空间。
 
然后轮到E了
E:enclosing function,外部嵌套函数的名字空间
终端样例:
>>> def f1():
...     answer = tell me
...     def f2():
...         print answer
...     f2()
...
>>> f1()
tell me
>>> 
 
接着是G
G:globals,函数定义所在模块的名字空间。
关于golbal关键字
终端样例:
>>> answer = tell me
>>> def foo():
...     global answer
...     answer = 42
...     print answer
... 
>>> print answer
tell me
>>> foo()
42
>>> print answer
42
可使用globals(),查看global名空间
 
最后是B 
B:built-in,内置模块的名字空间
在自己代码中不要取类似dict, list的名字
  
二、『万物皆对象』 
2.1 对象是什么
 
一个对象可以被变量引用。
可以放在list,tuple,dict中。
可以当作参数传递。
可以被返回。
可以拥有属性。
#定义一个函数
>>> def foo():
... print bar
...
#foo2引用foo
>>> foo2 = foo
#查看引用计数
>>> import sys
#传参也有1次引用所以是3
>>> sys.getrefcount(foo)
3
#输出bar
>>> foo2()
bar
一句话总结
所谓万物皆对象:一切都可以赋值给变量或作为参数传递给函数
 
2.2 对象的核心:从实现上来讲,每个对象一定会拥有两个内容
2.2.1 引用计数:内存管理相关,实现基于引用计数的垃圾收集机制
sys.getrefcount()
 
2.2.2 类型指针:类型信息,指定对象的类型对象
type()
 
 
三、浅谈基本类型及其操作(主要说dict)
str 长度是不可变的[1],每一个"+"操作都会创建一个新的字符串并复制旧内容
 
update更新键值如果没有则添加
>>> di={}
>>> di.update({1:‘a‘})
>>> print di
{1: ‘a‘}
>>> di.update({1:‘b‘})
>>> print di
{1: ‘b‘}
>>> 
 
get获取值,没有返回None
>>> print di.get(1)
b
>>> print di.get(4)
None
 
四、其他 
啰嗦
dict是无序的,因为dict由hash实现。
dict的item()方法(method)返回list对象,而iteritems()方法返回dictionary-itemiterator对象
 
关于__name__
当.py文件作为模块导入时,它的__name__值为自身模块名,当它作为主程序执行时,它的__name__值为“__main__”。
 
举例
#test_example.py
TEST_NUM = 2
TEST_STR = " test_str "
if __name__ == __main__:
    print __name__
    print TEST_STR
 
作为模块
>>> import test_example as t
>>> t.TEST_NUM
2
>>> t.__name__
test_example
>>> type(t)
<type module>
>>> dir(t)
[TEST_NUM, TEST_STR, __builtins__, __doc__, __file__, __name__, __package__]

 

 
作为主程序
$ python test_example.py
__main__
test_str 
__init__.py
__init__文件使得python将目录视为一个module.
假设当前在mydir目录下,
如果dir_a目录下没有__init__.py
./mydir/dir_a/mod_a.py
那么在mydir中,
>>> import dir_a
会引发ImportError的异常
 
decorator
向decorator传参,传的总是函数对象, decorator最好也返回函数对象(所以在my_dec中定义了wrapper)。
def my_dec(func):
     def wrapper():
          print before decorator
          func()
          print after decorator
     return wrapper
 
def hello():
     print hello

 

当hello函数定义成如下形式时,
@my_dec
def hello():
     print hello
 
相当于
def hello():
     print hello
hello = my_dec(hello)
当我们这么写
hello()
实际上就是在调用wrapper,在my_dec中添加print id(wrapper),以及在调用hello后添加print id(hello)便知。
 
因此传参也很好理解了,只需要在wrapper中添加参数便可
 
def my_dec(func):
     def wrapper(*arg, **kwargs):
          print arg, kwargs
          print before decorator
          func(*arg,**kwargs)
          print after decorator
     return wrapper

@my_dec
def hello(*arg, **kwargs):
     print in hello
     print arg, kwargs
     print in hello

if __name__ == __main__:
     hello(the answer is , 42) 
 
function tools
在wrapper前一行加
@wraps(func)
 
yield
可用于实现一个粗糙的协程
def coroutine():
     while True:
          y = yield
          print y
 
c=coroutine()
c.send(None)
c.send(1)
c.send(2)
c.send(None)
c是一个generator对象, 有send,next和throw等方法。
 
给来自c的朋友:循环访问数组下标
li=["a","s","d","f"]
for idx, ele in enumerate(li):
     print idx, ele
 
有用
查看类名
class Foo:
    def __init__(self):
        self.a = 1
f=Foo()
f.__class__.__name__
type(f)
 
========
多加几句
 
查看函数调用栈
import traceback
traceback.extract_stack()
 
简洁
import gettext as _
 
========
再加一点儿料
 
自省,告诉我有哪些属性和方法吧
>>> di={}
>>> dir(di)        #居家旅行必备的dir  
 
>>> class Foo:
...     """
...        hello from Foo
...     """
...     def __init__(self):
...         self.a = 1
...         self.b = 2
...     def reset(self):
...         self.c = 0
... 
>>> f=Foo()
>>> Foo.__dict__
{reset: <function reset at 0x8e8d1b4>, __module__: __main__, __doc__: \n       hello from Foo\n    , __init__: <function __init__ at 0x8e8d294>}
>>> f.__dict__          #拿到object的属性
{a: 1, b: 2}
>>> f.reset()
>>> f.__dict__          #属性还能动态增加!似乎很神奇。
{a: 1, c: 0, b: 2}
>>> 

 

======
v0.1 2015.06.06
 
========
link
 

python必知必会

标签:

原文地址:http://www.cnblogs.com/ifkite/p/4556676.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!