一.函数
1.调用函数
调用函数需要知道函数的名称和参数。如果传入的参数类型和个数不匹配,就会报TypeError错误。
如调用绝对值函数:abs(-12)
2.编写函数
定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号,然后在缩进块中编写函数体,函数的返回值用return语句返回。如果没有return语句,函数执行完毕也会返回结果,只是返回结果为None。return None可以简写为return。
def square_of_sum(L):
return sum(x*x for x in L)
print square_of_sum([1, 2, 3, 4, 5])
print square_of_sum([-5, 0, 5, 15, 25])
3.返回多个值的函数
如有如下的一个move方法,返回了两个值。
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
可以看到打印出了两个值,但实际上Python的函数返回多值其实就是返回一个tuple。
4.递归函数
使用递归函数需要注意防止栈溢出。
如经典的汉诺塔问题,我们可以将其想象成三部分:
(1)将A上除了最大的那个圆盘外的其他圆盘挪到B上;
(2)将A上最大的圆盘挪到C上;
(3)将B上的所有圆盘挪到C上。
代码实现如下:
def move(n, a, b, c):
if (n == 1):
print a, '-->', c
return
# 将a上除最大圆盘外的所有圆盘挪到c上
move(n - 1, a, c, b)
# 将a上最大的圆盘挪到c上
move(1, a, b, c)
# 将b上的圆盘全部挪到c上
move(n - 1, b, a, c)
move(4, 'a', 'b', 'c')
5.定义默认参数的函数
函数默认参数的作用是为了简化调用。
定义函数时可以有默认的参数,默认参数不传,则使用默认值,传默认参数则使用额外传入的参数覆盖默认参数值。
由于函数的参数按照从左到右的顺序匹配,所以默认参数只能定义在必须参数的后面。
def greet(str1='world'):
print 'Hello,' + str1 + '.'
greet()
greet('Bart')
6.定义可变参数的函数
如果想让一个函数接受任意个参数,就可以定义一个可变参数。可变参数的名字前面有一个*号,可以传入0个、1个、多个参数给可变参数。python会把传入的一组参数组装成一个tuple传递给可变参数。
def average(*args):
if len(args)==0:
return 0.0
else:
return (sum(args)*1.0)/len(args)
print average()
print average(1, 2)
print average(1, 2, 2, 3, 4)
二.切片
1.对list进行切片
取一个list的部分元素,python提供了切片(slice)操作符。
L = ['Adam', 'Lisa', 'Bart', 'Paul']
# 取前三个元素
print L[0:3]
# 如果第一个索引是0,可以省略
print L[0:3]
# 只用一个: 表示从头到尾
print L[:]
# 切片操作还可以指定第三个参数,表示每N个参数取1个
print L[1:3:2]
2.倒序切片
Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片。
L = range(1, 101)
# 最后10个数
print L[-10:]
# 最后10个5的倍数
print L[-46::5]
3.对字符串切片
字符串也可以用切片操作,操作结果仍为字符串。
如:print 'ABCDEFG'[:3]
def firstCharUpper(s):
# 将字符串的首字母利用切片操作变为大写
return s[:1].upper()+s[1:len(s)]
print firstCharUpper('hello')
print firstCharUpper('sunday')
print firstCharUpper('september')
三.迭代
1.迭代()
通过for循环遍历集合,这种遍历我们称为迭代。
迭代是通过for...in来完成的。python的for循环可以作用在任何可迭代对象上。
(1)集合是指包含一组元素的数据结构,我们已经介绍的包括:
- 有序集合:list,tuple,str和unicode;
- 无序集合:set
- 无序集合并且具有 key-value 对:dict
# 使用for循环迭代数列 1-100,并打印出7的倍数
for i in range(1, 100):
if i % 7 == 0:
print i
2.索引迭代
python中迭代永远是取出元素本身,而非元素的索引。、
想在for循环中拿到索引,要使用enumerate()函数,使用enumerate()函数,我们可以在for循环中同时绑定索引index和元素name。函数把每个元素变成了一个tuple。
# 使用range()和zip()函数打印出名次-名字
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for index, name in zip(range(1,len(L)+1),L):
print index, '-', name
3.迭代dict的value
dict对象有一个values()方法,这个方法吧dict转换成一个包含所有value的list,这样我们迭代的就是dict的每一个value。
dict对象还有一个itervalues()方法。
values()方法实际上把一个dict转换成了包含value的list,但是itervalues()不会转换,它会在迭代过程中依次取出value,所以itervalues()方法比value()方法节省了生成list需要的内存。
d = {'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74}
sum = 0.0
for v in d.values():
sum += v
print sum * 1.0 / len(d)
4.迭代dict的key和value
dict有一个items()方法,把dict对象转化成了包含tuple的list,对这个list进行迭代,可以同时获得key和value。
items() 也有一个对应的 iteritems(),iteritems() 不把dict转换成list,而是在迭代过程中不断给出 tuple,所以, iteritems() 不占用额外的内存。
d = {'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74}
sum = 0.0
for k, v in d.items():
sum = sum + v
print k + ':' + str(v)
print 'average', ':', sum * 1.0 / len(d)
四.列表生成式
1.生成列表
列表生成式则可以用一行语句代替循环生成list。
print [x * (x + 1) for x in range(1, 100, 2)]
2.复杂表达式
使用for循环的迭代不仅可以迭代普通的list,还可以迭代dict。
d = {'Adam': 95, 'Lisa': 85, 'Bart': 59}
def generate_tr(name, score):
if score < 60:
return '<tr><td>%s</td><td style="color:red">%s</td></tr>' % (name, score)
return '<tr><td>%s</td><td>%s</td></tr>' % (name, score)
tds = [generate_tr(name, ) for name, score in d.iteritems()]
print '<table border="1">'
print '<tr><th>Name</th><th>Score</th><tr>'
print '\n'.join(tds)
print '</table>'
3.条件过滤
列表生成式的for循环后面还可以加上if判断。
# -*- coding: UTF-8 -*-
# 将list中所有字符元素变成大写后返回,非字符串元素将被忽略
# isinstance(x, str) 判断变量 x 是否是字符串;
def toUppers(L):
return [x.upper() for x in L if isinstance(x,str)]
print toUppers(['Hello', 'world', 101])
4.多层表达式
for循环可以嵌套,可以使用多层for循环来生成列表。
L = []
for a in range(1, 10):
for b in range(10):
for c in range(10):
if a == c:
L.append(100 * a + 10 * b + c)
print L