您的位置:首页 > 编程语言 > Python开发

Django1.5:(一)相关的Python语法1

2013-07-30 13:37 204 查看
      写在前面的话:学习从现在开始!这是我的笔记和备忘。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'

a59d
字符串格式化:有两种,字符串格式化操作符(%)和字符串格式化方法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的流程控制、异常处理、函数、文件、正则表达式等参见后续笔记。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: