先声明一下 各位大佬,这是我的笔记。 如有错误,恳请指正。 另外,感谢您的观看,谢谢啦!
定义一个新的函数
def text(): print('我是一个函数') text() 我是一个函数我们以前用的函数是都是有参数的,自己定义的函数也是可以有的
def text(x): print(f'{x}是一个函数') text('我') 我是一个函数要注意我们把被定义的函数的参数叫做‘形参’即‘x’,传入被定义的函数的参数叫’实参‘即‘‘我’’
如果函数需要多个参数,那就多定义几个好了
def text(x,y): print(f'{x}是一个{y}') text('我','帅哥') 我是一个帅哥然而一两个参数还好,有时候好几个参数,我们还有去背它的输入顺序吗?
当然有更好的办法了,就是关键字参数
def text(x,y): print(f'{x}是一个{y}') text('帅哥','我') def text(x,y): print(f'{x}是一个{y}') text(y='帅哥',x='我') 帅哥是一个我 我是一个帅哥我们看第二个,是不是很好用啊。
大家有没有想过会出现不知道究竟要几个参数的时候,(比如print()就是你输入几个实参都可以)
这时候就要用到收集函数了
def text(*x,y): for i in range(len(x)): print(f'{x[i]}是一个{y}') text('你','我','他',y='帅哥') 你是一个帅哥 我是一个帅哥 他是一个帅哥其实函数是把不确定是多少个的参数变成了一个元组
def text(*x,y): print(f'{x}') text('你','我','他',y='帅哥') ('你', '我', '他')还有定义参数是可以定义默认值的
def power(x,y=4): return x**y print(2) print(2,y=3) 16 8如果不使用关键字参数,就默认返回实参的4次幂,如果设置了参数就要按照你输入关键字参数的来运算。
局部变量:在函数内定义的变量,作用域只有函数内部,在函外部不能调用它们
全局变量:在函数外定义的变量,有更大的作用域。
y = 4 def power(x): a = 1 return x**y+a print(power(2)) 17y是全局变量,a是局部变量,在函数内部可以调用(查看)全局变量但是不可以修改全局变 量的值,一旦修改,python会出于’保护机制‘,创建一个与你修改的全局变量,名字一模一样的局部变量,而你修改的不是全局变量的值。
y = 4 def power(x): a = 1 y = 2 return x**y+a print(power(2)) print(y) 5 4当然,你非要在函数内修改局部变量,可以用 global声明。
y = 4 def power(x): a = 1 global y y = 2 return x**y+a print(power(2)) print(y) 5 2python允许在函数内部创建函数
def power(x): y = 4 a = 1 def power2(x): return x**y+a return power2(x) print(power(2))上面就是一个内嵌函数。
内嵌函数的参数的作用域只有自己内嵌函数本身那么大,内嵌函数内也是只能调用不能修改其外部函数的变量
当然,和全局变量一样,如果非要改可以用nonlocal声明
而,内嵌函数的作用域也只是在其外部函数内,在全局是无法访问的
def power(x): y = 4 a = 1 def power2(x): return x**y+a return power2(x) print(power2(2)) print(power2(2)) NameError: name 'power2' is not defined闭包可以理解为对外封闭的一个代码块,他运作的时候不会影响到外部环境,这也是闭包的好处。
在编程的时候要尽量减少全局变量的使用。全局变量确实好用,但是太容易引发bug了
下面举个闭包的例子
def pf(x): li1 = [x] def pf2(s): li1[0] = li1[0]+s return li1[0] return pf2 f1 = pf(2) print(f1(2)) 4这里要注意,第六行返回的是一个功能,所以可以像7,8行那样用。
这三个函数功能真的很厉害,而且都特别的好玩,好用
lambda是函数式编程,它的格式如下
lambda 参数(多个参数就用逗号隔开) : 要return的值
def power(x,y): return x**y g = lambda x,y:x**y这两句代码的功能是一样的
print(power(2,3)) print(g(2,3)) 8 8filter是过滤器
它的功能是对第二个可迭代对象进行第一个参数(函数)的运算,为真留下。
print(list(filter(lambda x:x%2 ,range(10)))) [1, 3, 5, 7, 9]map可以用映射来解释对第二个参数进行第一个函数参数的运算,第二个参数是接收参数即能传入多个参数
print(list(map(lambda x,y: x+y ,range(11),range(11,0,-1)))) [11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11]