写在前面的话:学习从现在开始!这是我的笔记和备忘。Read more, Practice much more!
Django技术就是Python技术,Django规则就是Python规则。为了更好地用Django框架开发web应用,首先要熟悉一下Python,特别是与Django密切相关的思想和语法部分。这里不是Python的详细手册(可参见《Python学习手册》《深入Python》等)。学习一门语言的最好方法是使用它,无论是人类语言、机器语言还是自然语言。
1. Python基础
Django从1.5开始支持Python 3( Python第三方库支持3.x的信号?),这里以Python 3.3示例,也介绍其与Python 2.x的区别。
Python是一门面向对象的应用程序开发语言(OOP),它同时兼具系统语言的强大(如C/C++和Java)和脚本语言的灵活迅速(如Ruby)。
注释:Python的注释用 # 表示,从 # 后的第一个字符到行尾视作注释项。注释符有两个作用,一是解释包裹的代码,二是组织代码运行。
#It's a long comment a = 2 中国 = 'China' #Python 3采用Unicode编码,但建议只在注释和字符串字面量中使用Unicode字符
变量&赋值:Python是“动态类型”语言,不需要在使用前声明类型,可以把变量想象成指向一个匿名对象的名字(引用),这个对象才真正保存实际的值(值)。Note:在用'='连接两个对象时需要问问自己,这是表示的一个引用还是值?对于不可变对象(如数字和字符串),赋值实际创建了一个副本;对于可变对象(列表和字典)copy的往往只是一个新的引用,改变其中一个也会改变另一个。
>>> a = (1,2,[3,4]) >>> b = a >>> a == b #值相等吗 True >>> b is a #同一块内存吗,比较身份或同一个对象 True >>> a[2][1] = 40 >>> b (1, 2, [3, 40])
如果想要“深复制”一个独立的相同对象(即创建后递归复制),可以用标准库中copy.deepcopy()函数来完成。对于列表,还可以用切片(slice)方法,如b = a[:]。
从这里我们也就知道,“动态类型”说的什么,变量只是指向对象的引用。所以对象都有引用计数,给一个对象分配新名称或放进一个容器都会增加计数。
运算符:算术运算符以及相应赋值运算符、比较运算符、布尔运算法(and, or)和not。不支持++和--(谢天谢地!)
2. 内置的数据类型
大概有12种标准的数据类型,一种分类方式:None、数字、序列、映射和集合;另一种为不可变和可变类型。最重要最强大的显然是列表和字典,我打算最先介绍。注意:对象才有类型,变量没有类型。
>>> a = [1,2] >>> b = list() >>> type(a) == type(b) True >>> isinstance(a,list) True
2.1 列表(list)
序列包括str、list、tuple、range (python 2中为xrange)类型,即索引为非负整数的有序对象集合,支持迭代。字符串和元组不可变,列表支持插入、替换和删除等操作。
常规操作:适用于所有序列——【切片】s[i], s[i:j], s[i:j:stride], 【函数】len(s), min(s), max(s), sum(s [,start]), all(s), any(s)
可变序列操作:主要是赋值(=)和删除(del),如del s[i:j:stride]
列表方法:详细地使用方法可以用help()函数来显示
list(s) | s.append(x) | s.extend(t) | s.count(x) | s.index(x) | s.insert(i,x) | s.pop([i]) | s.remove(x) | s.reverse() | s.sort([key] |
转换 | 加元素 | 加列表 | 计数 | 索引值 | 插入 | 通过索引移除 | 显式移除 | 倒序 | 也可倒序排 |
Note:列表方法sort, append, insert等全部都是直接对对象修改,并且没有返回值!而下面将看到对于不可变类型,其方法则返回一个修改后的对象。不过python提供了如sorted(), reversed()函数可以返回一个新列表。
列表解析(list comprehension):这个词有多种翻译,也可能是列表推导式等。它非常强大,其构造一个由逻辑代码生成的对象的列表,也就是说对于列表中每个对象执行一遍逻辑,循环操作后返回一个新列表。
>>> odd = [x+1 for x in range(12) if x %2 ==0] #过滤列表时使用列表解析 >>> odd [1, 3, 5, 7, 9, 11]
列表解析的工作方式是一下子处理完整个数据结构,在某些时候可能没有必要,或者占用过多的内存。另一种相互补充的结构为生成器(generator),可以认为它是惰性的列表解析,只需要把'[]'换成'()'包裹就可以了:
>>> odd = (x+1 for x in range(12000) if x %2 ==0) >>> odd <generator object <genexpr> at 0x03021710> >>> next(odd) 1 >>> next(odd) #迭代生成 3
2.2 字典(dict)
Python中唯一的映射类型,用key来索引value,一对一映射,字典管理着对象的属性。
方法和操作有len(m), m[k], m[k]=x, del m[k], k in m, m.clear, m.copy(), m.fromkeys(s [,value]), m.get(k [,v]), m.has_key(k)【在python 3中已经废弃,直接用成员运算符in】, m.items(), m.keys(), m.pop(k), m.popitem(), m.setdefault(k [,v]), m.update(b), m.values()。
其中,get方法是指返回m[k],找不到则返回v;setdefault方法则在找不到时返回v,并将m[k]设为v。items返回一个键值对序列,keys返回所有键,values返回所有值。
在Python 3中,集合(set)和字典也开始支持类似于列表解析的操作了。语法{ kexpr:vexpr for k,v in s if condition }
字典中的键值对不能满足Django中所以情形,如HttpRequest对象中保存GET和POST参数中QueryObject对象,出现一对多的状况。
2.3 字符串
用单引号或者双引号包裹,请把它想象成一个字符数组。字符串不能修改,任何合法的修改操作只不过是创建了一个新的字符串,返回了一个修改过得copy。字符串的方法可能有40个左右,非常丰富,包括搜索,切分,替换,转码,格式化等等。这里介绍一些Django中常用的,或者比较有意思的。
>>> s = 'focus on Django' >>> words = s.split() #s.splitlines,rstrip,lstrip >>> words ['focus', 'on', 'Django'] >>> ' *'.join(words) #连接成字符串 'focus *on *Django' >>> s.upper() #注意s并没有变,还有lower,title,swapcase,capitalize等类似方法 'FOCUS ON DJANGO' >>> s.startswith('focus')#还有endswith True
连接两个字符串可以使用很多种方式,如'a' + 'b',''join('a', 'b'),甚至'%s%s' %('a','b'),不建议使用+的方式,效率不高。
自然字符串:通过r来告诉解释器不要转换字符串中的特殊字符,特别是以反斜杠\标识的转义字符。这在正则表达式和文件名中经常会用到,例如:
file = r'C:\project\django\newcode\text.txt'
字符串格式化:有两种,字符串格式化操作符(%)和字符串格式化方法s.format(*args,**kwargs)
这是很有用的,譬如说你可以把需要外界传入的内容空出来,等到需要的时候再替换。
字符串格式化%有点像C中的sprintf函数,如:
>>> '%s is the %d word' % (s[:6], 1) 'focus is the 1 word'
语法是 string % tuple (or map) ,string中有若干个转换说明符,由%和修饰符组成。修饰符可以通过下列5中可选部分顺序出现:
1)当转换内容用字典来表示,指明括号中的一个键名,例如'%(name)s %(age)d' %(dict),如果不存在,就会引发KeyError异常;
2)- 左对齐标志,默认为右对齐;+ 包含数字符号;0 零填充;
3)指定最小宽度的数字,例如'%+010d %E' %(41, 13.2) 结果是'+000000041 1.32E+01'
4)一个小数点,按照精度分割字段宽度;
5)一个数字,最大字符串个数或小数位数或整数位数。
通配符*用于在任意宽度的字段中替换数字,在其他场合也会经常用到。例如 '%*.*f' % (4, 2, 15.9444)结果是'15.92'。
高级方法:s.format(*args,**kwargs)是收集位置参数和关键字参数的任意集合。
>>> r = '{0} {1} {2}'.format('focus',100,'times') >>> r 'focus 100 times' >>> r = 'Hell {0}, my ID is {id}'.format('everyone',id = 'leonfocus') >>> r 'Hell everyone, my ID is leonfocus'
format方法的格式说明符用(:)加上说明符,可以指定宽度,小数位,对齐方式等,一般格式是[fill[alignn][sign][0][width][.precision][type],align用<、>、^之一表示,fill用于填充空白。
三引号字符串:你可以在其中使用任何特殊字符,譬如用于XML代码段。如果在其中使用格式转化说明符,可以稍后再用%填充。
2.4 其他类型
数字类型,Python 3取消了Long,其实也就是长一点的int。注意classic division '/'和floor division '//'。同样可以用数字类型转换,类似于C。
元组,不可变的列表,其作用或许在前面的演示中已经看到了,它可以防止篡改。在创建一个元素的元组时,需要用a = (1,),注意那个逗号。
集合,无序集,没有键的字典。set是可变的集合,frozenset是不可变的集合。此处不详细介绍,可以参见各种Python书籍或者官方手册。
None类型,表示null对象,如果一个函数没有显式地返回值,则返回该对象。其通常作为默认值,没有任何属性,bool中为False。
关于Python的流程控制、异常处理、函数、文件、正则表达式等参见后续笔记。