《Python核心编程》读书笔记最近使用python开发了彩票数据相关的项目,把《python核心编程》也仔细看了下.把相关的知识点也记了下:主要有如下:1.python的知识简图:2.如何运行python在Unix或者Linux环境下,一般默认安装了python.直接执行:$pythonXXX.py3.程序输出print4.注释(1)单行注释单行注释以#开头,例如:print6#输出6(2)多行注释(Python的注释只有针对于单行的注释(用#),这是一种变通的方法)多行注释用三引号'''将注释括起来,例如:'''多行注释多行注释'''(3)中文注释在文件头上写入:#coding=gbk或:#coding=utf-85.代码块及缩进对齐(1)代码块通过缩进对齐表达代码逻辑,而不是使用大括号(2)代码缩进符号有两种,制表符与空格,tab在不同的编辑器下的处理是不通的,有些是4个空格,有些是8个空格,有些可能是2个,而对空格的处理应该都是一样的,一般显示4个空格符比较好代码缩进格式错误IndentationError:unexpectedindent6.运算符主要运算符:+-*///%**(1)特别地,//是浮点除法,这个值得C++程序员注意。(2)不等于有两种表示:或者=!(3)逻辑运算符使用andornot三个关键字(4)双星号(**)为乘方操作符,例如3**2,意思为3^2(5)冒号将代码块的头和体分开。(for/while/if/else,以及函数定义).6.变量和赋值(1)在Python中可以进行多元赋值,例如,x,y,z=1,2,'ab'(2)python大小写敏感,变量名以字母数字和下划线开头。(3)python是动态语言,变量不需要声明,变量的类型和值在赋值的那一刻被初始化。(4)赋值通过等号操作符来实现。(5)特别地,python不支持--和++7.数字python支持5种基本数字类型。int,long,bool,float,complex。特别地,这里的long仅受限于用户计算机的虚拟内存大小。还有一种,10进制浮点型decimal,因为二进制表示该类型时会因为无法精确表示其小数点后面的数值而造成误差。可以通过引入decimal模块使用该类型。8.字符串字符串被定义为在单引号对或者双引号对中的内容。而三引号则可以包含自然字符串(不解释特殊字符)字符串索引从0开始,-1则表示最后一个字符。字符串可以使用[]进行切片操作。str=’0123456789′printstr[0:3]#截取第一位到第三位的字符printstr[:]#截取字符串的全部字符printstr[6:]#截取第七个字符到结尾printstr[:-3]#截取从头开始到倒数第三个字符之前printstr[2]#截取第三个字符printstr[-1]#截取倒数第一个字符printstr[::-1]#创造一个与原字符串顺序相反的字符串printstr[-3:-1]#截取倒数第三位与倒数第一位之前的字符printstr[-3:]#截取倒数第三位到结尾printstr[:-5:-3]#逆序截取,具体啥意思没搞明白?字符串查找与定位:str.find(“0”)字符串切分str1=“a,b,c,d”listStr=str1.split(“,”)9.列表和元组列表使用[]定义,而元组使用()定义。列表可以修改而元组不能修改。简单来说,元组就是只读的列表。他们都可以通过切片[:]来得到子集列表类型内建函数list.append(obj)向列表中添加一个对象objlist.count(obj)返回一个对象obj在列表中出现的次数list.extend(seq)把序列seq的内容添加到列表中list.index(obj,i=0,j=len(list))返回list[k]==obj的k值,并且k的范围在i=kj;否则引发ValueError异常.list.insert(index,obj)在索引量为index的位置插入对象obj.list.pop(index=-1)删除并返回指定位置的对象,默认是最后一个对象list.remove(obj)从列表中删除对象objlist.reverse()原地翻转列表list.sort(func=None,key=None,reverse=False)以指定的方式排序列表中的成员,如果func和key参数指定,则按照指定的方式比较各个元素,如果reverse标志被置为True,则列表以反序排列.元组是不可变的,要改变元组,就必须创建一个新的元组对象。在三个标准不可变类型里面--数字,字符串和元组字符串--元组是受到影响最大的,一个数据类型是不可变的,简单来讲,就意味着一旦一个对象被定义了,它的值就不能再被更新,除非重新创建一个新的对象.对数字和字符串的影响不是很大,因为它们是标量类型,当它们代表的值改变时,这种结果是有意义的,是按照你所想要的方式进行访问的,而对于元组,事情就不是这样了。不可变并不是坏事,比如我们把数据传给一个不了解的API时,可以确保我们的数据不会被修改。同样地,如果我们操作从一个函数返回的元组,可以通过内建list()函数把它转换成一个列表.10.字典python的字典使用{}定义。键值都可以使用任意对象。方法名字操作dict.clear()删除字典中所有元素dict.copy()返回字典(浅复制)的一个副本dict.fromkeys(seq,val=None)创建并返回一个新字典,以seq中的元素做该字典的键val做该字典中所有键对应的初始值(如果不提供此值,则默认为None)dict.get(key,default=None)对字典dict中的键key,返回它对应的值value,如果字典中不存在此键则返回default的值(注意,参数default的默认值为None)dict.has_key(key)如果键(key)在字典中存在,返回True,否则返回False.在Python2.2版本引入in和notin后,此方法几乎已废弃不用了,但仍提供一个可工作的接口。dict.items()返回一个包含字典中(键,值)对元组的列表dict.keys()返回一个包含字典中键的列表dict.iter()方法iteritems(),iterkeys(),itervalues()与它们对应的非迭代方法一样不同的是它们返回一个迭代子,而不是一个列表。dict.pop(key[,default])和方法get()相似,如果字典中key键存在,删除并返回dict[key]如果key键不存在,且没有给出default的值,引发KeyError异常。dict.setdefault(key,default=None)和方法set()相似,如果字典中不存在key键,由dict[key]=default为它赋值。dict.update(dict2)将字典dict2的键-值对添加到字典dictdict.values()返回一个包含字典中所有值的列表由于keys更多是参数而不是索引,所以dict是无序的。在Python2.4版本以前,你只能调用字典的keys()方法获得键的列表,然后调用列表的sort()方法得到一个有序可遍历的列表。现在特别为迭代子设计了一个名为sorted()的内建函数,它返回一个有序的迭代子。所有不可变的类型都是可哈希的,因此它们都可以做为字典的键。一个要说明的是问题是数字:值相等的数字表示相同的键。换句话来说,整型数字1和浮点数1.0的哈希值是相同的,即它们是相同的键。同时,也有一些可变对象(很少)是可哈希的,它们可以做字典的键,但很少见。举一个例子,一个实现了__hash__()特殊方法的类。因为__hash__()方法返回一个整数,所以仍然是用不可变的值(做字典的键)。11.python的浅拷贝与深拷贝序列类型对象的浅拷贝是默认类型拷贝,并可以以下几种方式实施:(1)完全切片操作[:],(2)利用工厂函数,比如list(),dict()等,(3)使用copy模块的copy函数.要得到一个完全拷贝或者说深拷贝--创建一个新的容器对象,包含原有对象元素(引用)全新拷贝的引用--需要copy.deepcopy()函数.有几点关于拷贝操作的警告。第一,非容器类型(比如数字,字符串和其他原子类型的对象,像代码,类型和xrange对象等)没有深拷贝一说,浅拷贝是用完全切片操作来完成的.第二,如果元组变量只包含原子类型对象,对它的深拷贝将不会进行.12.IF语句ifexpression:if_suiteelifexpression2:elif_suiteelse:else_suite13.while循环whileexpression:while_suite14.for循环和range()python的for更像是其他语言的foreach,它从后面的迭代元素参数中每次迭代其中的一个元素、而为了使它更像传统的for我们可以使用rang()来生产一个数字列表。甚至,你可以使用enumerate()函数同时迭代列表中的索引和元素。下面是个栗子:foo='abc'fori,chinenumerate(foo):printch,'(%d)'%i15.迭代器与iter()函数python与stl的迭代器比较相似。迭代器有这样的好处:1.提供可扩展的迭代器接口。2.对列表迭代带来了性能上的增强。3.在字典迭代中性能提升。4.提供更好的兼容性。5.增强代码的简洁性。如何迭代根本上说,迭代器就是有一个next()方法的对象,带迭代结束时,应抛出一个StopIteration异常来告诉外部调用者迭代完成。使用迭代器应该注意到,不能向后移动,不能回到开头,也不能复制迭代器,而且,迭代过程中改变被迭代对象会使迭代器失效(可对照stl相关内容理解)对一个对象使用iter()函数就可以得到该对象的迭代器。它的语法如下:iter(obj)iter(func,sentinel)如果你传递一个参数给iter(),它会检查你传递的是不是一个序列,如果是,那么很简单:根据索引从0一直迭代到序列结束.另一个创建迭代器的方法是使用类,我们将在第13章详细介绍,一个实现了__iter__()和next()方法的类可以作为迭代器使用.如果是传递两个参数给iter(),它会重复地调用func,直到迭代器的下个值等于senti16.列表解释通过列表解释,你可以在一行里面使用一个for循环将所有值放到一个列表中:test=[x*2forxinrang(4)]test2=[x**2forxinrang(8)ifnotx%2]#test=[0,2,4,6]test2=[0,4,16,36]17.类类的定义与函数定义类似,()中的是继承的父类。__init__()是类中一个特殊方法,它是类实例化第一个执行的方法,但也就仅此而已。self变量是代表类实例自身引用的变量。在python里面没有private关键字,完全是依赖于它的名字的。如果一个函数、类方法或属性以两个下划线开始,它是私有的。其他所有都是公有的。没有protected这个概念的。这一点要注意跟JAVA区别开来。专有的方法:前后都是以两个下划线的比如__init__,__call__就是专有方法在python中有一类以两条下划线开始并且以两条下划线结束的类方法,称之为专有方法。__init__构造函数,生成对象时调用__del__析构函数,释放对象时调用__add__加运算__mul__乘运算__cmp__比较运算__repr__打印、转换__setitem__按照索引赋值__getitem__按照索引获取值__len__获得长度__call__函数调用获取对象的信息对象的属性self.__name__对象的名称__class__这是哪种类型的对象[抽象类的实现]__doc__对象知道些什么__dict__对象能做些什么__bases__对象的类继承自谁__module__它在哪一个模块中自省函数id()返