第一章相对简单,没有涉及Django深入的知识,所以笔者阅读完后,简单做了概述,从第二章开始深入Django
1. 注释
定义:在程序代码中对程序代码进行解释说明的文字。
作用:注释不是程序,不能被执行,只是对程序代码进行解释说明,让别人可以看懂程序代码的作用,能够大大增强程序的可读性。
注释分为两类:
- 单行注释:
# 注释内容
- 既可以位于行首,也可以位于某行的任意位置,
#
之后的内容为注释 - 单行注释的
#
号还可以作为指定编码格式:# -*- coding:utf-8 -*-
- 多行注释:
"""
注释内容
"""
2. 变量
例子:
>>> a = 'bar'
>>> a
'bar'
>>> a = 1
>>>a
1
该例子中,变量a首先被映射到一个字符串对象'bar'
上,接着再映射到另一个整数对象1
上。
注意:若没有变量指向'bar'
,则'bar‘
会被回收。
引用计数: 变量value
先指向一个字符串a
,再指向一个数值b
,若没有变量指向a
了,则a
会被回收。
3. 运算符
Python运算符分为:算术运算符、赋值运算符、比较运算符、布尔运算符。
算术运算符:
注意:混合运算时,优先级顺序为: **
高于 *
; /
或 %
或 //
高于 +
和 -
,为了避免歧义,建议使用 ()
来处理运算符优先级。
并且,不同类型的数字在进行混合运算时,整数将会转换成浮点数进行运算。
赋值运算符
(1)单个变量赋值
>>> num = 5
>>> num
5
(2)多个变量赋值
>>> num1, num2, f1 = 100, 200, 'hello'
>>> num1
100
>>> num2
200
>>> f1
'hello'
复合赋值运算符
比较运算符
比较运算符有 >
、<
、=
、>=
、<=
、!=
逻辑运算符
and
、or
、in
、not in
,返回True
或False
。
Python没有结尾的分号;
,没有货币符号$
,在条件语句中也不需要小括号()
。
二进制位操作(针对整数)
与&
、或|
、异或^
、取反~
、左右位移<<
和>>
|
4. Python标准类型
所有的Python对象都有内在的布尔值:
- 空字符串、None、0、False是False,其他都为True;
- 空容器为False;
- 若容器中存在数据(即使是False或0),该容器也为True。
字符串:
>>> value = 'abc'
>>> value
'abc'
>>> value = 10
>>> value
10
对象的布尔值
>>> bool(1)
True
>>> bool(0)
False
>>> bool('123')
True
>>> bool('')
False
>>> bool([])
False
>>> bool([0])
True
>>> bool('123')
True
>>> bool({None, 0})
True
>>> bool(None)
False
>>> bool(True)
True
>>> bool(False)
False
数字
Python有两个主要的数值类型:int(整数)和float(浮点数)。
浮点数就是和其他语言一样的 双精度的浮点实数。
有个比较有奇怪的事是:
>>> 1.1
1.1000000000000001
Python在表示有理数的时候不是非常精确。因此还有另一个浮点数类型Decimal(这不是一个内置类型,必须通过decimal模块访问),它的值范围比较小,但是更精确。
Python内置数字类型
Python内置数字类型
类型 | 描述 | 举例 |
---|---|---|
int | 带符号整数(没有大小限制) | -1,0,0✖️E8C6,0377,42 |
float | 双精度浮点数 | 1.25,4.3e+2,-5,-9.3e,0.375 |
complex | 复数(实部+虚部) | 2+2j,3-j,-10.3e+5-60j |
内置数字工厂函数
每种数字类型都有一个工厂函数让用户能在各种数字类型之间相互切换。
int()
函数将浮点数或字符串型的整数转换成整数,小数点直接舍去,不存在四舍五入的情况。
float()
函数把整形或原为浮点型或整形的字符串转换成浮点型
round(number,ndigits=None)
函数将浮点数精确到指定的某一位.round(3.1415,3)
即3.1415保留3位有效数字,即3.12。
abs(x,/)
函数取一个数的绝对值。abs(3.14)值为3.14,abs(-3.14)值也为3.14。
divmod(x,y,/)
函数返回一个元组,包含两个数:x除以y的商和余数。divmod(13,4)
返回(3,1)。
>>> int(1.36)
1
>>> int(1.99)
1
>>> int('1223')
1223
>>> float(12)
12.0
>>> float('12')
12.0
>>> float('1.2')
1.2
>>> round(3.1415,3)
3.142
>>> abs(3.14)
3.14
>>> abs(-3.14)
3.14
>>> divmod(13,3)
(4, 1)
5. 数据类型转换
6. 函数
1. 声明和调用函数
声明函数的方法是用 def 关键字,然后是函数名以及小括号里的参数列表(如果无参函数的话只要用一对括号即可)
>>> def foo(x)
... print x
>>> foo(123)
123
2. (函数调用里的)关键字参数
关键字参数可以让函数更加清晰,更加容易使用,同时,也消除了记忆固定参数顺序的需要。
关键字参数通过 “键 = 值” 这样的形式加以指定:
>>> check_web_server(port=80, path='/', host='www.python.org')
关键字参数只能用于 “函数调用”。
3. (函数签名里的)默认参数
Python函数的另一个特定是可以为参数提供默认值,这样它们的参数就不是必需要传的了。
>>> def check_web_server(host, port=80, path='/'):
默认参数用于 “函数声明”,不能用可变类型(列表、字典)当默认参数。
所有必须提供的参数一定要出现在任何可选参数之前,不能混在一起或颠倒顺序。
4. 函数是 first-class的对象
5. 匿名函数和lambda
匿名函数创建的方法是使用 lambda关键字,它由一个表达式组成,这个表达式代表了函数的 “返回值”。
这样的函数没有名字,因此成为匿名函数。它通常只是一行表达式,一般都是用完就扔。
表达式:一个值,结果一定是一个Python对象,例如42,1+2,int(‘123’),range(10)等;
语句:一段代码,结果不是对象,例如if或print语句,for和while循环等,它们执行一个动作,而不是返回或生成一个值。
lambda语法:lambda args:表达式
在执行的时候,lambda返回一个可以立即使用的函数对象,或者你可以选择将它保存为一个变量,或是保存为一个回调函数以便稍后执行。
lambda的一个常见用法就是为 sorted这样的函数工具提供一个函数对象,它在众多参数里有一个key参数,这样key必须是一个函数,可以用在列表里的每个都排序的元素上以生成一个值来作为排序的依据。
例如有一个代表人物的复杂对象列表,我们希望按照他们的姓氏属性来排序的话,则可以这样:
sorted(list_of_people, key=lambda person: person.last_name)
这是正确的,原因是由于key期望的是一个函数对象,而lambda返回的正好是一个匿名函数。
以下是等价的写法:
def get_last_name(person):
return person.last_name
sorted(list_of_person, key=get_last_name)
或这样:
get_last_name = lambda person: person.last_name
sorted(list_of_person, key=get_last_name)
三个语句最大的不同之处在于可读性和重用性。第一个例子更简洁同时目的相当明确,通常是解决这类问题最好的手法;第二个例子是一个普通的函数,比较恰当;第三个例子不太现实。
6. (函数调用里的)参数容器
7. (函数签名里的)变长参数
*args:元组
**kwargs:字典
8. 装饰器
Python的装饰器是一种能改变或是 “装饰” 函数行为的机制,它能让函数执行一些和原本设计不同,或是在原有基础上额外的操作。装饰器是也可以说是对函数的一个包装,这些额外的任务包括写日志、计时、过滤等。
简单的语法:
@deco
def foo():
pass
翻译过来为:
foo = deco(foo)
9. 正则表达式
Django使用正则表达式的字符串匹配机制来定义网站的URL