函数
目录
一、函数定义
二、函数编写说明文档
三、函数的返回值
四、函数参数
1、位置参数与关键字参数
2、默认参数
3、可变长参数
4、可变关键字参数
五、作用域
1、全局变量
2、局部变量
3、global关键字
4、内嵌函数与 nonlocal关键字
5、闭包
6、递归
7、lambda匿名函数
一、函数定义
In [17]:
def info_1(a,b,c):
print(a)
print(b)
print(c)
In [20]:
info_1(1,2,3) # 赋值调用,这样就可以重复调用
1
2
3
二、函数编写说明文档
def test(a,b): # test的函数解释就是‘用来实现两个数的求和’
'''
用来实现两个数的求和
'''
print(a+b)
三、函数的返回值
def abs_1(x): # return返回一个值,下面的程序就不会执行
if x >=0:
return(x)
else:
return(-x)
In [32]:
abs_1(-444)
Out[32]:
444
四、函数参数
1、位置参数与关键字参数
# 位置参数
In [53]:
def test(a,b,c):
print(a)
print(b)
print(c)
In [54]:
test(1,2,3) # 1,2,3分别对应a,b,c
1
2
3
# 关键字参数
In [57]:
test(a=2,b=1,c=3)
2
1
3
关键字参数必须放在位置参数后⾯
使⽤名称指定的参数,有助于澄清各个参数的作⽤。这样,函数调⽤不再像下⾯这样怪异⽽神秘。
使⽤关键字参数使每个参数的作⽤清晰明了。另外,参数的顺序错了也没关系。
另外,关键字参数最⼤的优点还在于可以指定默认值。
2、默认参数
def test(a,b,c=1):
print(a)
print(b)
print(c)
In [64]:
test(b=1,a=2) # c=1是默认参数
2
1
1
必选参数在前,默认参数在后,否则会报错。
默认参数降低了函数调⽤的难度,⽽⼀旦需要更复杂的调⽤时,⼜可以传递更多的参数来实现。⽆
论是简单调⽤还是复杂调⽤,函数只需要定义⼀个。
3、可变长参数
in[76]:
def sum_2(*x_list): # 在参数前面加个*
n=0
for i in x_list:
n+=i
return n
In [77]:
sum_2(3,4,5,1,2,3,4,5,1,2,3)
Out[77]:
33
4、可变关键字参数
⼀个星号不会收集关键字参数,要收集关键字参数,可使⽤两个星号。
⼀个星号就是打包成元组传⼊进来,两个星号就是打包成字典传⼊进来。
In[79]:
def test(**x): # 在参数前加两个*
return x
In [80]:
test(a=1,b=2,c=3,d=4)
Out[80]:
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
五、作用域
1、全局变量和局部变量
# 全局作用域
a=1
# 局部作用域 n= 0即为局部变量
def test_1(*args):
n=0
for i in args:
n+=i*i
return n
在函数外边定义的变量叫做全局变量
全局变量能够在所有的函数中进⾏访问
如果在函数中修改全局变量,那么就需要使⽤global进⾏声明,否则出错
如果全局变量的名字和局部变量的名字相同,那么使⽤的是局部变量的,⼩技巧:强⻰不压地头蛇
2、global关键字
# global关键字,全局变量不可变时使用
a=100
def test5():
global a # 调用全局变量
a+=1
print(a)
test5()
3、内嵌函数与 nonlocal关键字
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
100
100
4、闭包
In [111]:
def funcX(x):
def funcY(y):
return x *y
return funcY
In [112]:
funcX(1)(2)
Out[112]:
2
5、递归
在程序上,递归实质上是函数调⽤⾃身的⾏为。
# 递归
def caljie(n):
if n>1:
result = n* caljie(n-1)
else:
result=1
return result
In [131]:
caljie(3)
Out[131]:
6
6、lambda匿名函数
①基本语法
⽤lambda关键词能创建⼩型匿名函数,这种函数得名于省略了⽤def声明函数的标准步骤。
lambda函数的语法只包含⼀个语句。
In [148]:
f = lambda x:x*2 if x>5 else x/2 # else不能省略 可用else none
f(3)
Out[148]:
1.5
②使用场景
函数作为参数进⾏传递
Lambda函数能接收任何数量的参数,但只能返回⼀个表达式的值
匿名函数不能直接调⽤print,因为lambda需要⼀个表达式
把函数功能屏蔽
import time
time.sleep(10) # 让程序休眠10秒
print('------zZZ-------')
③作为高级函数的参数
a、map
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [152]:
list(map(lambda x:x*2+10, a))
Out[152]:
[12, 14, 16, 18, 20, 22, 24, 26, 28, 30]
b、filter
In[153]:
def f(x):
if x % 2==0: # 函数⽤于过滤序列
return x
list(filter(f,a))
Out[153]:
[2, 4, 6, 8, 10]
c、sorted
In[159]:
sorted(a, key=lambda x: abs(5 - x)) #对所有可迭代的对象进⾏排序操作。
Out[159]:
[5, 6, 4, 4, 3, 3, 2, 8, 2, 1, 1, 10, 22, 55, 77]