以下总结源于慕课网的Python入门教程
基本数据类型
- 支持类型包括:整型,浮点数,布尔值(
True
和False
,支持运算and
,or
,not
),字符串,空值(None
) - Python是解析型语言,因此变量无需声明变量类型,一个变量也可以声明为多种类型的变量
- 字符串可以用
' '
," "
,''' '''
来定义。前两者无明显区别,可在嵌套时交替使用,如:"I'm Tom"
,'We call him "Tom"'
。最后一个用于声明多行字符串,比如:
'''Python is created by "Guido".
It is free and easy to learn.
Let's start learn Python in imooc!'''
- 字符串还有一个编码问题。因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A 的编码是65,小写字母 z 的编码是122。
如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。
类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。
因为Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码,普通的字符串'ABC'在Python内部都是ASCII编码的。
如果中文字符串在Python环境下遇到 UnicodeDecodeError,这是因为.py文件保存的格式有问题。可以在第一行添加注释
-*- coding: utf-8 -*-
目的是告诉Python解释器,用UTF-8编码读取源代码。然后用Notepad++ 另存为... 并选择UTF-8格式保存。
- Python的整数运算结果仍然是整数,浮点数运算结果仍然是浮点数,但是整数和浮点数混合运算的结果就变成浮点数了。因此在做除法时尤其需要注意精度的丢失问题。
List和Tuple类型
-
list
是一种可变的,有序的集合,可以随时添加和删除其中的元素。通过[]
将元素括起来即可构造list
对象。 -
list
支持通过索引访问,索引大于等于0时顺序访问,索引小于0时逆序访问。其中-1表示集合中最后一个元素。 - 追加用
append(item)
,插入insert(index,item)
。删除用pop(index)
。替换直接用新元素通过索引替换旧元素L[1] = 'Bob'
-
tuple
,翻译为元组,和list
非常相似,但是创建之后就不可变,和创建list
唯一不同之处是用( )
替代了[ ]
。因为用()定义单元素的tuple有歧义,所以 Python 规定,单元素 tuple 要多加一个逗号",
",这样就避免了歧义。 -
tuple
所谓的“不变”是说,tuple
的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list
,就不能改成指向其他对象,但指向的这个list
本身是可变的! -
list
,tuple
和字符串都支持切片操作:
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> L[0:3]
['Adam', 'Lisa', 'Bart']
L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3;
如果第一个索引是0,还可以省略;
只用一个 : ,表示从头到尾, 因此,L[:]实际上复制出了一个新list。
切片操作还可以指定第三个参数,第三个参数表示每N个取一个,下面的 L[::2] 会每两个元素取出一个来,也就是隔一个取一个。
>>> L[::2]
['Adam', 'Bart']
倒序切片也同理。
>>> 'ABCDEFG'[0:-1:2]
'ACE'
条件判断和循环
- if 语句用关键字
if
表示,后接表达式,然后用:
表示代码块开始。缩进请严格按照Python的习惯写法:4个空格,不要使用Tab,更不要混合Tab和空格,否则很容易造成因为缩进引起的语法错误。具有相同缩进的代码被视为代码块。
age = 20
if age >= 18:
print 'your age is', age
print 'adult'
print 'END'
- else语句使用关键字
else
表示,后面跟:
。else if使用elif
- for 循环使用
for x in list
语句,后跟:
。
for x in [ 1,2,3,4,5,6,7,8,9 ]:
for y in [ 0,1,2,3,4,5,6,7,8,9 ]:
if x
支持嵌套循环。
- while 语句用
while
。break
和continue
跟Java用法类似。
Dict和Set类型
-
dict
表示一个map
,用花括号{}
表示,然后按照key: value,
写出来即可。dict
是无序的。dict
的第一个特点是查找速度快,无论dict
有10个元素还是10万个元素,查找速度都一样。而list
的查找速度随着元素增加而逐渐下降。不过dict
的缺点是占用内存大,还会浪费很多内容,list
正好相反,占用内存小,但是查找速度慢。由于dict
是按key
查找,所以,在一个dict
中,key
不能重复。
d = {
'Adam': 95,
'Lisa': 85,
'Bart': 59,
'Paul': 75
}
-
len()
用于计算任意集合的大小。 - set用
set
表示,无序集合,且不能重复。创建set
的方式是调用set()
并传入一个list
,list
的元素将作为set
的元素。可以使用in
操作符判断元素是否在set
中,注意set
的元素是大小写敏感的.
s = set(['Adam', 'Lisa', 'Bart', 'Paul'])
>>> 'bart' in s
False
- set的更新:插入'add(item)',删除'remove(item)'
函数
- 定义一个函数要使用
def
语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return
语句返回。return None
可以简写为return
。
def square_of_sum(L):
sum = 0
for num in L:
sum += num * num
return sum
print square_of_sum([1, 2, 3, 4, 5])
- 允许有多个返回值。其原理其实是返回了一个
tuple
元组:
import math
def move(x, y, step, angle):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print x, y
- 支持定义默认参数,但由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面。
# OK:
def fn1(a, b=1, c=2):
pass
# Error:
def fn2(a=1, b):
pass
- 支持定义可变参数,可变参数的名字前面有个
*
号,我们可以传入0个、1个或多个参数给可变参数。Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量args
看成一个tuple
就好了。
def fn(*args):
print args
迭代
-
enumerate(list)
函数可以将list
转成tuple
,因此可以在迭代中同时获取到索引和值。
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> for index, name in enumerate(L):
... print index, '-', name
...
0 - Adam
1 - Lisa
2 - Bart
3 - Paul
上面其实是把L变成了类似如下的tuple:
[(0, 'Adam'), (1, 'Lisa'), (2, 'Bart'), (3, 'Paul')]
-
zip()
函数可以把两个list
变成一个list
:
>>> zip([10, 20, 30], ['A', 'B', 'C'])
[(10, 'A'), (20, 'B'), (30, 'C')]
-
dict
有两个方法:values()
和itervalues()
都可以获取dict
的左右value,在遍历时尤其有用。区别在于:
-
values()
方法实际上把一个dict
转换成了包含value
的list
。 -
itervalues()
方法不会转换,它会在迭代过程中依次从dict
中取出 value,所以itervalues()
方法比values()
方法节省了生成list
所需的内存。
-
dict
的items()
方法把dict
对象转换成了包含tuple
的list
,我们对这个list
进行迭代,可以同时获得key
和value
。同样的,iteritems()'可实现同样的效果,但是不像前者,后者不把
dict转换成
list,而是在迭代过程中不断给出
tuple,所以,
iteritems()` 不占用额外的内存。
列表生成式
-
range(n,m,step)
可以生成一个从n到m的list
,每隔step
递增。 - 列表生成式语法可抽象成如下格式:
[ 列表单个变量x的生成方式 for x in list/dict (+可选:嵌套循环 + 可选:if条件) ]
举例如下:
- 生成普通的平方列表:
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
- 生成复杂的表单。注:字符串可以通过 % 进行格式化,用指定的参数替代 %s。字符串的join()方法可以把一个 list 拼接成一个字符串。
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
def generate_tr(name, score):
if score<60:
return '%s %s ' % (name, score)
else:
return '%s %s ' % (name, score)
tds = [generate_tr(name, score) for name, score in d.iteritems()]
print ''
print 'Name Score '
print '\n'.join(tds)
print '
'
- 按条件过滤:
def toUppers(L):
return [s.upper() for s in L if isinstance(s, str)]
print toUppers(['Hello', 'world', 101])
- 复杂的嵌套循环。
print [x*100+y*10+x for x in range(1,10) for y in range(0,10) for z in range(1,10) if x==z]