python笔记08函数知识点总结
先声明一下
各位大佬,这是我的笔记。
如有错误,恳请指正。
另外,感谢您的观看,谢谢啦!
(1).函数的定义,参数
定义一个新的函数
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次幂,如果设置了参数就要按照你输入关键字参数的来运算。
(2).局部变量与全局变量
局部变量:在函数内定义的变量,作用域只有函数内部,在函外部不能调用它们
全局变量:在函数外定义的变量,有更大的作用域。
y = 4
def power(x):
a = 1
return x**y+a
print(power(2))
17
y是全局变量,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
2
(3).内嵌函数
python允许在函数内部创建函数
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
(4).闭包
闭包可以理解为对外封闭的一个代码块,他运作的时候不会影响到外部环境,这也是闭包的好处。
在编程的时候要尽量减少全局变量的使用。全局变量确实好用,但是太容易引发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行那样用。
(5).lambda,filter,map
这三个函数功能真的很厉害,而且都特别的好玩,好用
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
8
filter是过滤器
它的功能是对第二个可迭代对象进行第一个参数(函数)的运算,为真留下。
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]