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()
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的工具。
- python学习笔记(二)
- Python学习笔记(二)
- Python学习笔记(二)
- python学习笔记(二)
- Python学习笔记(二)
- python学习笔记(二)
- python学习笔记(二)
- Python学习笔记(二)
- python学习笔记(二)
- python学习笔记(二)
- Python学习笔记(二)
- python学习笔记:(二)
- Python学习笔记(二)
- Python学习笔记(二)
- Python学习笔记(二)
- python学习笔记(二)
- python学习笔记(二)
- Python学习笔记(二)
- jsp路径使用
- 【黑马程序员】C语言学习笔记之第一个C程序及编译运行(一)
- python基础
- Qt4.8.4运行程序显示中文
- Android 命令 - fastboot
- Python学习笔记(二)
- 扩展WPF工具包™Community Edition(待研究)
- servlet跳转
- long转成datetime类型
- Linux学习记录--文件权限相关汇总
- 黑马程序员 C#学习笔记④ 入门经典里的扑克牌游戏客户程序
- CareerCup Car races
- Hadoop学习之Hadoop集群的定制配置(二)
- Java面向对象——交通灯管理系统