第五章 函数
参数
一、位置参数
调用函数时根据函数定义的参数位置来传递参数。def print_hello(name, sex): sex_dict = {1: u'先生', 2: u'女士'} print 'hello %s %s, welcome to python world!' %(name, sex_dict.get(sex, u'先生'))# 两个参数的顺序必须一一对应,且少一个参数都不可以print_hello('tanggu', 1) #调用
二、关键字参数
用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。def print_hello(name, sex): sex_dict = {1: u'先生', 2: u'女士'} print 'hello %s %s, welcome to python world!' %(name, sex_dict.get(sex, u'先生'))print_hello('tanggu', sex=1)print_hello(1, name='tanggu')
三、可变参数
定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也可以)。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。def func(*args): ....func()func(a)func(a, b, c)
我们传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。
def func(**kargs): ....func(a=1)func(a=1, b=2, c=3)
kargs是一个字典(dict),收集所有关键字参数
函数
一、运算
len(a) #求长度min(a) #求最小值max(a) #求最大值sorted(a) #排序reversed(a) #逆序sum(a) #求和abs(a) #求绝对值
二、进制转换
bin(a) #转换为二进制oct(a) # 转换为八进制hex(a) # 转换为十六进制
三、ASCLL转换
ord(a) #返回对应的ASCLL值chr(a) #用一个范围在(0~255)整数作参数,返回对应的字符
四、高级函数
1、enumerate() 枚举
enumerate(sequence, [start=0])#实例seq = ['one', 'two', 'three']for i, element in enumerate(seq): print i, element
2、zip() 配对
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。zip([iterable, ...])#实例>>> a = [1,2,3]>>> b = [4,5,6]>>> c = [4,5,6,7,8]>>> zipped = zip(a,b) # 打包为元组的列表[(1, 4), (2, 5), (3, 6)]>>> zip(a,c) # 元素个数与最短的列表一致[(1, 4), (2, 5), (3, 6)]>>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式[(1, 2, 3), (4, 5, 6)]
3、map() 映射
map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。map(function, iterable, ...)#实例>>>def square(x) : # 计算平方数... return x ** 2>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方[1, 4, 9, 16, 25]>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数[1, 4, 9, 16, 25]# 提供了两个列表,对相同位置的列表数据进行相加>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])[3, 7, 11, 15, 19]
4、filter() 过滤
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。filter(function, iterable)#实例def is_odd(n): return n % 2 == 1 newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])print(newlist) #过滤出列表中的所有奇数
5、eval()
eval() 函数用来执行一个字符串表达式,并返回表达式的值。>>> x = 7>>> eval( '3 * x' )21
6、reduce() #累积
>>>def add(x, y) : # 两数相加... return x + y>>> reduce(add, [1,2,3,4,5]) # 计算列表和:1+2+3+4+515>>> reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函数15
五、迭代器与生成器
1、迭代器
迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。 字符串,列表或元组对象都可用于创建迭代器:import sys # 引入 sys 模块list=[1,2,3,4]it = iter(list) # 创建迭代器对象for x in it: print (x, end=" ") while True: try: print (next(it)) except StopIteration: sys.exit()
2、生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。 调用一个生成器函数,返回的是一个迭代器对象。import sys def fibonacci(n): # 生成器函数 - 斐波那契 a, b, counter = 0, 1, 0 while True: if (counter > n): return yield a a, b = b, a + b counter += 1f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 while True: try: print (next(f), end=" ") except StopIteration: sys.exit()