我们小组的Python学习由王程鹏和刘峻琳负责,学习了Python语言从基础特性到高级特性的方方面面。总的来说,我们认识到Python是一种非常强大的语言,它具有大量的牛逼特性,包括支持函数式编程、支持面向对象,除此之外还有一些其它语言不具有的特性,例如切片等,其背后都有高级数据结构的支撑。接下来,我们将总结从教程中学到的Python的一些用法。其中前半部分为王程鹏所写,后半部分由刘峻琳撰写。那么,让我们赶快开始吧。
变量和数据类型
Python是一种动态语言,即变量类型可以随时修改,和Javascript类似,但与C和JAVA不同。例如定义变量:
a = 123
之后可以再给a赋任意类型的值:
a = "This is a string!"
list和tuple
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。在实际使用的过程中把它当做数组使用即可。值得注意的是list有append方法向list末尾添加元素。
classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字。
classmates = ('Michael', 'Bob', 'Tracy')
条件判断与循环
比如做条件判断,注意if语句行末尾的冒号
if age >= 18:
print 'your age is', age
print 'adult'
或者加入else语句
if age >= 18:
print 'your age is', age
print 'adult'
else:
print 'your age is', age
print 'teenager'
循环这里涉及到可迭代对象,对所有可迭代对象均可以调用for循环语句便利其中的所有元素。比如dict为可迭代对象,下面的代码就是对一个dict做迭代(遍历)
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> for key in d:
... print key
a
c
b
dict和set
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。比如查找同学成绩,代码如下:
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。要创建一个set,需要提供一个list作为输入集合,重复元素会被自动过滤:
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
set([1, 2, 3])
可用&和|做集合的交和并运算。
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
set([2, 3])
>>> s1 | s2
set([1, 2, 3, 4])
切片
取list或者tuple的某一段元素时会用到切片操作,常用用法如下所示:
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
第0个开始到第3个之前
>>> L[0:3]
['Michael', 'Sarah', 'Tracy']
>>> L = range(100)
所有数,每
5
个取一次
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
甚至什么都不写,只写[:]
就可以原样复制一个list。
列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
如果要生成1到100所有完全平方数的列表。
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
一行代码即可解决问题
生成器
和列表生成式不同的是,把最外面的
[]
改为()即为生成器,它也是可迭代的。
>>> g = (x * x for x in range(10))
>>> for n in g:
... print n
最终输出的即为1到100共10个完全平方数。
函数
Python的函数中很多不同于常见语言的特性,但我们还是从基础说起。在Python中定义函数需要用到关键字def,例如:
def add(a, b):
return a + b
可以用pass关键字定义一个空函数:
def nop();
pass
Python中的函数可以返回多个值,其本就是返回一个tuple。比如:游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的新的坐标:
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
调用系统函数时,Python会自动进行参数匹配检查,而调用自定义函数时,没有自动参数检查,因此最好在函数体内进行人工的参数检查。
Python的强大之处在于它支持多种格式的函数参数,包括默认参数、可变参数、自定义参数。其中默认参数和C类似,我们只说明可变参数和关键字参数。
可变参数,即利用list和tuple实现以不同的参数个数调用同一个函数,可变参数的前面要加上*号:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n
return sum
有如下调用结果:
>>>calc(1,2,3)
6
>>>calc(1,2,3,4)
10
关键字参数也允许传入数量不定的参数,但会将这些参数组装成一个tuple。
函数的参数可以由普通、默认、可变、关键字参数四种参数组成,但必须遵从这个顺序。
面向对象
如前文所述,Python具有和C++一样的面向对象的特性,这让我们可以利用类来实现对数据和方法的封装:
class Student(object):
pass
定义了一个空类。如果定义的类没有特定的父类,就指定从object继承。
bart = Student()
定义了一个对象的实例。可以自由地给对象赋予属性:
bart.name = 'Liu Junlin'
也可以在定义类时规定必要属性:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
类的成员函数第一个参数永远都是self,但调用时不需要传递。
定义必需属性时加上两个下划线,则代表是私有成员,从外部无法访问:
class Student(object):
def __init__(self, name):
self.__name = name
Python类的继承性和多态性与C++类似,在此不赘述。
错误处理
和众多高级语言一样,Python也有类似try-catch这样的错误处理机制,例如:
try:
print 'try...'
r = 10 / int('a')
print 'result:', r
except ValueError, e:
print 'ValueError:', e
except ZeroDivisionError, e:
print 'ZeroDivisionError:', e
else:
print 'no error!'
finally:
print 'finally...'
print 'END'
其中try为可能会抛出错误的代码段,和其它语言类似。except为捕捉错误的代码段,和catch类似。抛出的错误可能有多种类型,所以可能需要多个except语句。else为可选项,处理没有错误的情况。finally也是可选代码段,当执行完一个except或else代码段之后执行。