一、简介
1、定义
#函数是Python中最主要也是最重要的代码组织和复用手段。
二、使用
1、声明
#def关键字声明函数,return关键字返回值(无return关键字则返回None)
#例子
def add_three( x, y, z = 1.5 ):
if( z > 10):
return (x+y) * 10
else:
return (x+y) / 10
2、参数
#函数可以有位置参数(positional)和一些关键字参数(keyword),关键字参数必须位于
位置参数后。
#关键字参数通常用于函数中指定默认值或可选参数
#上述例子中,x和y是位置参数,而z则是关键字参数,可以以任何顺序指定关键字参数。
3、命名空间、作用域、局部函数
#命名空间(namespace):用于描述变量作用域
#作用域:按照作用的范围,分为全局(global)和局部(local)
#任何在函数中赋值的变量默认都是被分配到局部命名空间(local namespace)中的,局部命名空间在函数被调用时创建的,函数参数会立即填入该命名空间,函数执行完毕,局部命名空间就会被销毁。
a = None #在函数体外创建即是全局变量
#在函数体内进行赋值操作,需要先使用global关键字声明才行
global a
a = [1,2]
4、返回多个值
函数返回的多个值其中是一个对象,也就是元组,也可以返回字典,取决于需要。
三、函数也是对象
1、将函数定义为某种操作放入列表中
如需要对字符串进行一些处理:去除空白符、删除各种标点符号、正确的大写格式等。
import re
#正则表达式去除特殊符号
def remove_punc(value):
return re.sub('[!#?]', '', value)
clean_ops = [str.strip, remove_punc, str.title]
def clean_strings(strings, ops):
result = []
for value in strings:
for op in ops:
value = op(value)
result.append(value)
return result
2、将函数作为参数传入另一个函数
四、匿名(lambda)函数
1、定义
#仅由单条语句组成,该语句的结果就是返回值
equiv_anon = lambda x : x * 2 #定义
2、lambda函数可以作为参数传入一个函数
五、柯里化:部分参数应用
1、柯里化(currying)是指通过部分参数应用(partial argument application)从现有函数派生出
新函数的技术。
2、使用
add_five = lambda y : add_number(5, y) #第二个参数称为”柯里化的“(curried)
add_five = partial(add_number, 5) #内置functools模块的partial函数可以简化
六、生成器
1、简介
#通过迭代器协议(iterator protocol,是一种使对象可迭代的通用方式)能以一种一致的方
式对序列进行迭代。
#对字典等进行迭代时,Python解释器首先会尝试创建一个迭代器,迭代器是一种特殊对
象,它可以在诸如for循环之类的上下文中向Python解释器输送对象。
2、定义
#生成器(generator)是构造新的可迭代对象的一种简单方式。
#生成器以延迟的方式返回一个值序列
3、创建
#第一种方式
将函数中的return替换为yeild
#第二种方式
生成器表达式(generator expression),将列表推导式的方括号改为圆括号。
gen (x ** 2 for x in range(1000))
生成器表达式也可作为函数参数
七、itertools模块
1、简介
#标准库itertools模块中有一组生成器
2、常见itertools函数(待学)
#combinations(iterable, k)
#permutations(iterable, k)
#groupby(iterable, keyfunc)
#product(*iterables, repeat=1)
八、错误和异常处理
1、错误
# ValueError、TypeError
2、异常处理
# try / catch 可以处理一个异常
# 使用元组可以包含多个异常
# 无论是否有异常,使用finally可以使其中一段代码始终执行
# 使用else让只在try部分执行成功时执行该部分代码