函数就是一段具有特定功能的代码块
调用函数-通过一条简单的命令执行一系列复杂的操作
函数名是函数的标识符
函数的优点:整理和优化代码、提高代码的复用率、避免代重复代码、是代码保持简洁
函数的定义:
定义一个函数say_hi每次调用的时候都会输出一个hello
def say_hi():
print("hello")
#调用say_hi()函数
say_hi()
#结果
hello
函数中还可以调用函数,并且不需要在乎函数的顺序,因为函数定义时,函数内的内容并不会执行,只有在调用的时候函数才会执行。
def say_hi():
good_morning()
print("hello")
def good_morning():
print("Good Morging")
say_hi()
#结果
Good Morging
hello
参数——在调用函数时,给函数提供数据
定义一个有参函数line(),可以指定打印多少*
def line(width):
print("*"*width)
#有参函数的line()的调用
line(5)
line(10)
#结果
*****
**********
函数中可以有多个参数
def line(width,char):
print(char*width)
line(5,"*")
line(10,"-")
#结果
*****
----------
函数的返回值,就是调用函数后获取到的结果
定义一个函数,获取两个值中的最大值
def max_num(x,y):
v=x
if x<y:
v=y
#上面三行还有另一种写法 <表达式1> if <条件> else <表达式2>
# v=x if x>y else y
return v
print("hahaha")
#函数调用
i=max_num(3,4)
print(i)
#从结果可以知道 return后面的值可以返回给函数外面
#return 可以提前结束整个函数,也就是函数中return后面的程序不在执行
#结果
4
return也可以返回多个值
def fun(a,b):
return a+b,a-b
#因为函数返回两个值,故需要用两个变量接收
i,j=fun(10,11)
print(i,j)
#结果
21 -1
变量的作用域是指在程序的哪些地方可以使用变量
#在函数外定义的变量叫做全局(global)变量
i=5
def f():
#在函数内定义的变量叫做局部(local)变量
#局部变量,只能在函数内部使用
j=5
def f2():
#全局变量在函数中也能用
#全局变量,在函数内不能直接被修改
#函数内定义的变量可以和函数外的变量重名,但这是两个不同的变量
i=0
f2()
print(i)
#结果
5
#如果想要在函数内改变全局变量的值可以用global关键字
i=5
def f2():
#全局变量在函数中也能用
#全局变量,在函数内不能直接被修改
global i
i=0
f2()
print(i)
#结果
0
函数参数扩展
def f(name,age=0):
print(f"name={name},age={age}")
#调用带有默认值的函数,可以正常给参数按顺序赋值调用
f("小明",18)
#也可以不给默认函数传值,会直接用我们设置的默认值赋值
f("小红")
#结果
name=小明,age=18
name=小红,age=0
#默认值智能从后往前设置
#例如def f(a,b=0,c)这种情况就是不正确的
def f(a,b=0,c=0):
print(a,b,c)
f(1,2,3)
f(1,2)
f(1)
#结果
1 2 3
1 2 0
1 0 0
#还可以按照参数的名称给其赋值,这时改变参数的顺序也是可以的
def f(a,b,c):
print(a,b,c)
f(a=1,c=2,b=3)
#结果
1 3 2
可变参数就是可以传递任意数量的参数值
#*args是可变参数,主要在不确定要传多少参数的时候使用
def get_sum(*args):
print(args)
s=get_sum(1,3,6)
#结果,输出的是一个元组
(1,3,6)
#因为元素以元组的形式保存,所以在求和时,需要用for循环
def get_sum(*args):
sum=0
for i in args:
sum+=i
return sum
s=get_sum(1,3,6,2,8)
print(s)
#结果
20
#可变参数和普通参数同时使用时,必须放在普通参数的后面
#并且按照顺序依次给普通参赋值,剩下的元素就以可变参数的形式保存在元组中
def get_sum(a,b,*args):
print(a)
print(b)
print(args)
s=get_sum(1,'hello',6,2,8)
#结果
1
hello
(6, 2, 8)
#调用函数时,可变参数之前只能使用顺序赋值,不能使用关键字赋值
#调用函数时,可变参数之后,只能使用关键词赋值,不能使用顺序赋值
def get_sum(b,*args,c,d):
print(b)
print(args)
print(c)
print(d)
s=get_sum(1,'hello',6,2,c=8,d='D')
#结果
1
('hello', 6, 2)
8
D
可变关键词参数
#可变关键词参数是以字典的形式返回
def f(**kwargs):
print(kwargs)
f(a=1,b=2,c=3)
#结果
{'a': 1, 'b': 2, 'c': 3}
#**kwargs 只能出现在参数列表中的最后位置
def f(a,b,**kwargs):
for k,v in kwargs.items():
print(f"{k}:{v}")
print(f'a={a}')
print(f'b={b}')
f('aa','bb',x=1,y=2,z=3)
#结果
x:1
y:2
z:3
a=aa
b=bb
高阶函数
#函数的嵌套使用
def f():
def fn():
print('fn')
fn()
f()
#结果
fn
#将函数作为返回值
def f():
def fn():
print('fn')
return fn
a=f()
a()
#结果
fn
匿名函数
#匿名函数主要是使用lambda
def f(x):
return x*2
a = lambda x: x*2
print(a(5))
print(f(5))
#结果
10
10