Python学习笔记(二)

来源:互联网 发布:打车软件的历史 编辑:程序博客网 时间:2024/05/22 11:21


9.5 property函数

class Rectangle:   ....:     def __init__(self):   ....:         self.width = 0   ....:         self.height = 0   ....:     def setSize(self,size):   ....:         self.width,self.height = size   ....:     def getSize(self):   ....:         return self.width,self.height   ....:     In [86]: r = Rectangle()In [87]: r.width = 5In [88]: r.heightOut[88]: 0In [89]: r.height = 10In [90]: r.getSize()Out[90]: (5, 10)


#!/usr/bin/python#-*-coding:utf-8-*-#__metaclass__ = type  或者类为object的子类class Rectangle(object):        def __init__(self):                self.width = 0                self.height = 0        def setSize(self,size):                self.width,self.height = size        def getSize(self):                return self.width,self.height        size = property(getSize,setSize)        #size = property(getSize)  改成这种方式后,不能进行赋值r = Rectangle()r.width = 10r.height = 5print r.sizer.size = 150,100print r.width

静态方法和类成员方法创建是分别被装入Staticmethod类型和Classmethod类型的对象中去。静态方法的定义没有self参数,并能够被类本身直接调用。类方法的定义需要名为cls的类似于self的参数,类成员方法可以直接用类的具体对象调用。但cls参数是自动绑定到类的。

参考:http://www.cnblogs.com/2gua/archive/2012/09/03/2668125.html

一种实现方法

In [117]: class MyClass:   .....:     val1 = 'value 1'   .....:     def __init__(self):   .....:         self.val2 = 'value 2'   .....:     def staticmd():   .....:         print '静态方法,无法访问val1,val2'   .....:     smd = staticmethod(staticmd)   .....:     def classmd(cls):   .....:         print 'cls function:' + str(cls) + 'val1:' + cls.val1 + ',无法访问val2'   .....:     cmd = classmethod(classmd)   .....:     In [118]: mc = MyClass()In [119]: mc.smdOut[119]: <function __main__.staticmd>In [120]: mc.smd()静态方法,无法访问val1,val2In [121]: mc.cmd()cls function:<class '__main__.MyClass'>val1:value 1,无法访问val2In [122]: MyClass.smd()静态方法,无法访问val1,val2In [123]: MyClass.cmd()cls function:<class '__main__.MyClass'>val1:value 1,无法访问val2
第二种实现方式:装饰器

In [125]: class MyClass:   .....:     val1 = 'value1'   .....:     def __init__(self):   .....:         self.val2 = 'value2'   .....:     @staticmethod   .....:     def staticmd():   .....:         print 'static method ,无法访问val val2'   .....:     @classmethod   .....:     def classmd(cls):   .....:         print 'class  method ,类:' + str(cls) + ',val: ' + cls.val1 + ', 无法访问val2'   .....:         In [126]: mc = MyClass()In [127]: mc.staticmd()static method ,无法访问val val2In [128]: mc.classmd()class  method ,类:<class '__main__.MyClass'>,val: value1, 无法访问val2In [129]: MyClass.staticmd()static method ,无法访问val val2In [130]: MyClass.classmd()class  method ,类:<class '__main__.MyClass'>,val: value1, 无法访问val2

9.6 迭代器

    迭代器的意思是重复做一些事情很多次——就像在循环中做的那样。__iter__方法返回一个迭代器,所谓的迭代器就是具有next方法的对象。在调用next时,迭代器返回下一个值。

#!usr/bin/python#-*-coding=utf-8-*-class Fibs:        def __init__(self):                self.a = 0                self.b = 1        def next(self):                self.a,self.b = self.b ,self.a + self.b                return self.a        def __iter__(self):                return selffibs = Fibs()for f in fibs:        if f > 1000:                print f                break
内建函数iter也可以从可迭代的对象中获得迭代器。

9.7 生成器

生成器是一种用普通的函数语法定义的迭代器。

#!usr/bin/python#-*-coding=utf-8-*-nested = [[1,2],[2,4],[5]]def flatten(nested):        for sublist in nested:                for element in sublist:                        yield elementfor num in flatten(nested):        print num
任何包含yield 的函数称为生成器。除了名字之外,它的行为和普通函数也有很大的差别。它不像return那样返回值,而是每次产生多个值。每次产生一个值函数就会被冻结;即函数停在那点等待被激活,函数被激活后从停止的那点开始执行。

生成器推导式和列表推导式工作方式类似,只不过返回的不是列表推导式而是生成器(并且不会立刻进行循环)

In [9]: [x*x for x in range(10)]Out[9]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]In [10]: g = (x*x for x in range(10))In [11]: g.next()Out[11]: 0In [12]: g.next()Out[12]: 1In [13]: g.next()Out[13]: 4

递归生成器:为了处理更多任意层的嵌套,可以用递归迭代器:

#!usr/bin/python#-*-coding=utf-8-*-nested = [[[1,2],[2,4],[5]],[3,[4]]]def flatten(nested):        try:        #不要迭代类似字符串的对象                try: nested + ''                except TypeError:pass                else: raise TypeError                for sublist in nested:                        for element in flatten(sublist):                                yield element        except TypeError:                yield nestedfor num in flatten(nested):        print num
生成器方法

    生成器的新属性是在运行后为生成器提供值的能力。表现为生成器和“外部世界”进行交流的渠道。

外部作用域访问生成器的send方法,就像访问next方法一样,只不过没有参数。

在内部则挂起生成器,yield现在作为表达式而不是语句使用,换句话说,当生成器重新运行的时候,yield方法返回一个值,也就是外部通过send方法发送的值。如果next方法被使用,那么yield方法返回none

10.1  模块导入并不意味着在导入时执行某些操作,主要是用来定义,比如变量、函数和类等。导入模块多次和一次效果一样。  

#!usr/bin/python#-*-coding=utf-8-*-#hello4.pydef hello():        print "Hello World!"def test():        hello()if __name__ == '__main__':        test()


在“主程序”中,变量__name__的值是‘__main__’。而在导入的模块中,这个值就被设定为模块的名字。因此,为了让模块的测试代码更加好用,可以将其放置在if语句中。如上面所示。

10.2 探究模块

    查看模块包含的内容可以使用dir函数,它会将对象的所有特性列出。

    __all__定义了模块的公有接口(public interface)。更准确的说,它告诉解释器:从模块导入所有的名字代表了什么含义。

    from copy import * ,只能使用__all__变量中的4个函数。要导入其他函数只能通过显式地实现。导入copy 然后使用copy.PyStringMap,或者使用from copy import PyStringMap.

help获取帮助:help(copy.copy)

文档:pring range.__doc__

使用源代码:print copy.__file__

 10.3 标准库

    sys模块能够让你访问与python解释器联系紧密的变量和函数。

    os提供了访问多个操作系统服务的功能。

    os.linesep 用于文本文件的字符串分隔符,unix中为一个还行符(\n),Mac OS中为单个回车符(\r),windows中为两者的组合(\r\n)

    打开网页的好方案 

In [21]: import webbrowserIn [22]: webbrowser.open('http://www.baidu.com')Out[22]: TrueIn [23]: 已在现有的浏览器会话中创建新的窗口。

    fileinput  模块能够快速的遍历文本中的所有行。

11.3.4 在需要对一个非常大的文件进行迭代操作时,readlines会占用太多的内存。这个时候可以使用while循环和readline方法进行替代。

    文件迭代器:文件迭代器意味着可以直接在for循环中使用他们,从而对他进行迭代。

    

#!usr/bin/python#-*-coding = utf-8-*-#f = open(r'./test.txt','r')for line in f:        print(line)f.close()

15.1 Tidy 

Tidy 是用来修复不规范且随意的HTML的工具,它能以相当智能的方法修复一般错误。Tidy不能修复HTML文件的所有问题,但是他能确保文件格式的正确(也就是所有元素都正确嵌套)。

XHTML和旧版HTML之间的最主要的区别是XHTML对于显式关闭所有元素要求更加严格。XHTML的另一个好处是它是XML的一种,所以可以对他使用XML的工具。


0 0
原创粉丝点击