函数: python
函数是组织好的,可重复使用的,实现单一功能的代码段app
函数有输入(参数)和输出(返回值)ide
Python中,函数是一等对象(first class)函数
一.函数的定义与调用优化
基本语法spa
def fn(): pass
带函数的参数orm
def add(x, y): return x + y
有赋值就建立新的变量对象
x = 1y = 2def swap(x, y): x, y = y, x swap(x, y) x >1 y >2
经过list修改变量[由于并无修改变量,因此将会返回append追加内容]
递归
lst = [1, 2, 3]def append(item):lst.append(item) append(4) lst [1, 2, 3, 4]
二.位置参数和关键字参数:作用域
经过位置传递参数的叫位置参数
位置参数和关键字参数
def add(x, y): print() add(1, 2) //位置参数 add(x=1, y=2) //关键字参数 * 位置参数和关键字参数能够混合使用,可是关键字参数要在位置参数后面.不然会报错SyntaxError python add(1,y=2)
三.可变参数
非默认非可变参数, 可变位置参数,可变关键字参数
默认参数不要和可变参数放到一块儿
def print_info(x, y, *args, **kwargs): //自动组装成一个字典 print(x) print(y) for x in args: print(x) for k, v in kwargs.items(): print('{0} {1}'.format(k, v)) print_info(1, 2, 3, 4, 5, 6, name='roach',age=16) x => 1 y => 2 可变参数为(3, 4, 5, 6) 可变关键字参数为: name roach age 16
可变位置参数
def sum(lst): ret = 0 for x in lst: ret += x return ret sum([1, 2, 3, 4, 5]) //这里须要传入一个list # 变成 可变参数 def sum(*args): //自动组装成一个元组 ret = 0 for x in args: ret += x return ret sum(1, 2, 3, 4, 5)
可变关键字参数:
def print_info(**kwargs): //自动组装成一个字典 for k, v in kwargs.items(): print('{0} {1}'.format(k, v)) print_info(name='roach',age=16) > name roach > age 16
可变位置参数和可变关键字参数混合:
可变参数函数在定义的时候,就决定了参数是位置参数仍是关键字参数
def print_info(*args, **kwargs): //自动组装成一个字典 for x in args: print(x) for k, v in kwargs.items(): print('{0} {1}'.format(k, v)) print_info(name='roach',age=16) > name roach > age 16
四.参数解包 [重要]
a = [1, 2, 3] b = {'a':1, 'b':2, 'c':3} def fn(a, b, c): pass fn(*a)(1) fn(**b)(1) fn(*[1, 2], **{'c':3})(3)
1.能够用 * 解包列表或者元组做为位置参数
2.能够用**解包字典为关键字参数
3.也能够混合使用,思考:fn([1, 2],*{'c':3, 'a':4})会怎么样?
例子1 - 列表[参数解包]:
lst = [1, 2] def add(x, y): print(x) print(y) add(*lst) //参数解包
例子2 - 字典[参数解包]:
d = {'x':1, 'y':2} def add(x=1, y=3): //key 要和非可变形参一一对应 print(x) print(y) add(**d)
五.默认参数:
默认参数的坑: 列表
当形参是可变类型的时候就会发生这种状况:
def fn(lst = []): lst.append(1) print(list)
解决办法
def fn(lst = None): if lst is None: lst = [] lst.append(1) print(list)
六.函数返回值:
能够经过type来查看函数的返回值;
函数默认return None;
def add(): pass type(add())
七.递归函数:
函数体内条用自身的函数
递归函数须要有合适的退出条件
迭代均可以转换成递归
递归不必定能够转化为迭代
python递归最大深度为1000,且不支持尾递归优化
python中应尽可能避免使用递归
八.做用域与全局变量:
做用域: 变量生效的范围
局部变量:在函数体内定义的变量, 局部变量做用域为函数体
输出当前的全局变量和局部变量:
print(globals())
print(locals())
九.函数的调用过程:
def add(x, y): def inc(x): def main(): x = 1 y = 2 ret = add(x, y) ret =inc(ret) print(ret)
十.生成器:
def iterator(x): i = 0 while i < 5: yield i i += 1 def main(): for i in iterator(5): print(i) main()
1.先执行main函数.
2.执行到iterator 将main函数压栈;执行iterator函数.
3.执行到yield,将 i = 0 放入main的命令空间,同时把iterator压栈,暂停,调出main函数;
4.而后就重复1-3步骤,直到while条件不知足,逐步退出函数;
def iterator(): lst = [1, 2, 3, 4, 5] yield from lst for x in iterator(): print(x)
经过生成器求积数:
def fn(x): ret = 1 for i in range(1, x +1): ret *=i yield ret for x in fn(5): print(x) 1 2 6 24 120 it = fn(5) it.next() //生成器能够生成可迭代对象; //遍历到最后一个完后会返回,StopIteration;