上一篇博客简单介绍了 Python 基本的概念和操作方法。但是,和其他编程语言一样,是缺少不了函数的。有了函数,代码才会被多次复用,程序才会简洁和易读。
同样,也是为了开发的简洁,Python 还为提供了 Slice切片等高级特性。切片可让我们更方便的操作列表数据结构,也使得代码更易开发和阅读。
Python 函数和数学中函数的概念是一致的,都是对逻辑的一种抽象表示。在 Python 中,我们通过def来定义一个函数方法。
Python 的一些函数方法使用,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
import sys import os
reload(sys) sys.setdefaultencoding('utf8')
def funTypeCheck(x):
if not isinstance(x, int): raise TypeError('类型不一致')
if x == 10: print 'x is my number' else: print 'x is not my number'
def moreReturns(x, y): if x > y: y = 101 else: x = 101 return x, y
def defaultParams(x, n=2, extra=0): multiply = 1 while n > 0: n -= 1 multiply = multiply * x return multiply + extra
def variableParams(*numbers): sum1 = 0 for num in numbers: sum1 += num return sum1
def variableDictParams(name, **kw): print '----', name, '----' print kw
def factFunction(s, n):
if n < 1: return s return factFunction(s * n, n - 1)
if __name__ == '__main__': funTypeCheck(10)
x, y = moreReturns(10, 20) print x, y
multiply = defaultParams(5) print multiply multiply = defaultParams(5, 5, 3) print multiply multiply = defaultParams(5, extra=2) print multiply
sum1 = variableParams(1, 2, 5) print sum1
variableDictParams('ketao1989', web='ketao1989.github.com')
print factFunction(1,100) print('-------------') funTypeCheck('error')
|
Notes:isinstance
方法判断是否是指定类型。
moreReturns(x, y)
函数,返回多个结果。其本质上,就是返回一个tuple.
defaultParams(x, n=2, extra=0)
函数,设置默认的参数值。在调用的时候,我们可以替换任意一个默认的参数,比如extra,可以:defaultParams(5, extra=2)
variableParams(*numbers)
函数,设置可变个值。
variableDictParams(name, **kv)
函数,设置可变你的参数。其实,其类似Map来根据调用方确定参数。
切片
切片,很简单。就是我们日常对列表进行sub操作的时候,一般需要for
循环操作,而 Python 提供了一个更简单的方法来处理这些问题,就是切片。其,表示形式为:[i:j:k]
,其中,i表示列表的开始位置索引,j表示列表的结束位置索引(不包含该文章),k表示循环步长。
1 2 3 4 5 6 7 8 9
| ll = [1,4,6,8]
print ll[1:3:1]
print (1,2,3,4,5,6,)[0::2]
|
迭代
Python 的迭代,相对于 C 语言的迭代语法,有了很大的进步。使用 for ... in
方式来遍历一个集合或者 Map 数据,方便快捷。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ll = [1, 4, 6, 8, 11, 24, 23, 56] for x in ll: print x for i, value in enumerate(ll): print i, value
lt = [(1, 2), (5, 6), (7, 8)] for x, y in lt: print x, y
dd = {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}
for key in dd: print key for value in dd.itervalues(): print value for key, value in dd.iteritems(): print key, value
|
列表生成器
迭代对于列表的优化还不够,Python 还提供了更牛逼的特性:让我们一行代码生成一个列表。
比如,生成一个 1 到 10 数字的平方数,组成一个列表,使用列表生成器,可以如下:
1 2 3 4 5 6 7 8
| lg = [x * x for x in xrange(1, 10)] print lg
lo = [x * x for x in xrange(1, 11) if x % 2 == 0] print lo
|
Notes :由于列表生成器,是一次生成所有的列表元素,对于很大的列表,如果一次生成完成,然后全部放在内存里,肯定是不好的,因此,Python 还提供了 生成器
。
生成器,可以根据生成规则,在使用的时候,才会构造元素。构造简单的生成器,和列表生成器一样,只需要把[ ]
替换成( )
即可。例如:
1 2 3 4 5
|
lg = [x * x for x in xrange(1, 10)] print lg
|
Tips:如果需要打印,可以使用for,单个使用.next()方法依次调用,直到出现异常。
对于复杂一点的生成器,则需要使用 yield
关键字来完成。比如,在我们的一些函数中,某一个变量连续产生的数组,可以使用yield x
来完成生成器设置。
例如,构造一个通俗的生成器,如下:
1 2 3 4 5 6 7 8 9 10 11
| def generateFun(): for x in xrange(1, 10): yield x * x
gf = generateFun() print gf
for x in gf: print x
|