Python学习笔记(二)


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 = 5
In [88]: r.height
Out[88]: 0
In [89]: r.height = 10
In [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 = 10
r.height = 5
print r.size
r.size = 150,100
print 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.smd
Out[119]: <function __main__.staticmd>

In [120]: mc.smd()
静态方法,无法访问val1,val2

In [121]: mc.cmd()
cls function:<class '__main__.MyClass'>val1:value 1,无法访问val2

In [122]: MyClass.smd()
静态方法,无法访问val1,val2

In [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 val2

In [128]: mc.classmd()
class  method ,类:<class '__main__.MyClass'>,val: value1, 无法访问val2

In [129]: MyClass.staticmd()
static method ,无法访问val val2

In [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 self


fibs = 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 element


for 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]: 0

In [12]: g.next()
Out[12]: 1

In [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 nested

for num in flatten(nested):
        print num
生成器方法

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

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

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

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

#!usr/bin/python
#-*-coding=utf-8-*-
#hello4.py

def 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 webbrowser

In [22]: webbrowser.open('http://www.baidu.com')
Out[22]: True

In [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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值