一、函数参数
函数的参数按位置顺序传递
#Example x = '全局变量' def example(a,b='2b',*c,**d): y = '实参' print('所有参数:', a, b, c, d, y) return print('已执行函数') example('1a','2B','3c',**{'4d':'1234'},one = 'first')
执行结果:
所有参数: 1a 2B ('3c',) {'4d': '1234', 'one': 'first'} 实参 已执行函数
形参变量:只在被调用时分配到内存单元,调用结束后释放,只在函数内部有效。如:a,b,c,d
实参:已确定的变量,在函数调用时必须先赋值。 如:变量x,y
默认参数:在写函数时指定该参数的默认值,但只能放在形参的最后。 如:b
关键参数:不按照顺序传递参数时,可在调用时指定参数名传递参数,但不可重复传递。
非固定参数(元组型):把多传递的参数变成元组的形式存放。 如:*c
非固定参数(字典型):把有对应键和值的参数以字典的形式存放。 如:**d
函数返回值:函数执行时遇到return语句会停止执行并返回return后的语句,没有则为None。
全局变量:函数外部定义的变量。如:x 在函数内部调用时可用global x在函数内部修改。
局部变量:函数内部定义的变量。如:y
作用域:global操作可在函数内部修改全局变量。
二、高阶函数
1、匿名函数
example = lambda x,y:x**y
example(2,4)
执行结果
2**4
结果为16
2、高阶函数
1.接受一个或多个函数作为输入
2.return返回另一个函数
3、递归
在一个函数内部调用自身
def calc(n): print(n) if int(n/2) == 0: return n return calc(int(n/2))
递归的特性:
1.必须有一个明确的结束条件
2.每次进入深一层的递归时,问题规模相比上一次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出。
4、函数进阶
1.名称空间
locals:函数内的名称空间,包括局部变量和形参
globals:全局变量函数定义所在模块的名称空间
builtins:内置模块的名称空间
2.作用域
全局范围:全局存活,全局有效
局部范围:临时存放,局部有效
查看作用域方法 globals()、locals()
5、闭包和装饰器
闭包:函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问他们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用,就会形成闭包。
def outer(fuc): name = 'abc' def inner(): print('打印外层函数的变量',name)
fuc() return inner f = outer() f()
闭包的意义:返回的函数对象不仅仅是一个函数对象,在该函数外还包裹了一层作用域,使得该函数无论在何处调用,优先使用自己外层包裹的作用域。
三、生成器&迭代器
1、列表生成式
b = [i + 1 for i in range(10)] print(b)
2、生成器
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
1.将列表生成式的[ ] 改为 ()
2.在函数中插入yield关键字
g = (x * x for x in range(10))
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done'
yield既可以中断并返回该值,也可以用send传递参数给该生成器。
def test1(): while True: name = yield print('我的名字叫%s'%(name)) for i in name: te = test1() te.__next__() # 生成器必须先运行后才可用send传入参数。 te.send(i) 我的名字叫a 我的名字叫b 我的名字叫c 我的名字叫d
生成器可以用for循环或__next__()调用生成下一个值。
3、迭代器
可以直接作用于for循环的对象成为可迭代对象:Iterable。可以用isinstan()判断一个对象是否是Iterable。
主要包括:集合数据类型如list、tuple、dict、set、str,生成器generator。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
生成器都是Iterator,但list、tuple、dict、set、str虽然是可迭代对象但并不是迭代器。但可以用iter()函数变成迭代器。