1.5 函数
文章目录
1.5.1 函数的作用和定义
1.函数的作用
函数是为了提高编码的利用率,能多次重复使用,提高效率
2.函数的定义和调用
函数的定义
def 函数名():
函数内容
谨记,函数内容靠缩进来限定范围,必须严格缩进
函数调用
函数名()
3.函数的执行流程
1.调用函数,寻址函数定义,找到接口,如为找到则报错。
2.执行函数,有的函数会需要传参,有的函数会返回数据。
3.执行完毕,回到调用函数的位置。
4.debug的单步调试使用
1.5.2 函数的参数和返回值
通过传递数据给函数内部,让数据参与函数内的运算,增加函数的通用性。
带参数的函数定义格式
def 函数名(形参1,形参2,形参3,形参···):
函数内容
return (函数想返回的内容)
调用参数函数的格式
函数名(实餐1,实餐2,实餐3···)
实例
def test_add(num1, num2):
add_result = num1 + num2
print(add_result)
a = 20
b = 80
test_add(a, b)
1.函数形参的作用域
形参的作用域只应用于函数体内,变量起作用的范围只在函数体内。
2.函数的返回值
有时候会希望函数调用后,会返回一个数据告诉调用者一个结果,亦或者是调用函数就是为了取得一个数据来做后续处理,就会需要返回值。
之前我们用的print() input()内置函数,都是自带返回值的,如果我们自己编写函数,需要用到return。
def test_add(num1, num2):
add_result = num1 + num2
return add_result
a = 20
b = 80
c = test_add(a, b)
print("a和b相加等于%d" % c)
函数内部如果没有return语句,默认返回None。return如果不设置任何返回值,默认也是返回None
return中断函数,程序一旦执行return,后面的语句不会执行。
3.传参的类型
1)位置参数
按照行参的位置,从左到右一一对应
2)关键字参数
通过形参=值的形式直接传参,不需要对应位置,但是注意 ,混用的时候关键字参数必须在位置参数右边
# 函数调用时,通过形参=值方式为函数形参传值
# 不用按照位置为函数形参传值,这种方式叫关键字参数
# 函数定义
def foo(name, age, sex):
print(f"我叫{name},我今年{age}岁, 我的性别是{sex}")
# 函数调用
# foo("小明", 23, '男')
# 关键字参数
# 关键字=值
# 形参=值
foo(age=23,name="小芳",sex='女')
# 位置参数 + 关键字参数
foo("小明", sex='男', age=20)
# 注意1: 关键字参数必须在位置参数的右边
# foo(sex='男', "小郭", age=20)
# 注意2: 形参不能重复赋值
# SyntaxError: keyword argument repeated
# foo(name="小郭", name="小李", sex='男', age=22)
4.默认参数
形参设置默认值则为缺省参数,也叫默认参数,调用函数时候如果没有传入默认参数对应的实参,则用默认值
,默认参数必须在普通参数后面
# 默认参数必须在普通参数的后边
def foo(a, b=20, c=30):
print(a, b, c)
# 函数调用
foo(1) # a=1, b=20, c=30
foo(1, 2) # a=1, b=2, c=30
foo(1, 2, 3) # a=1, b=2, c=3
5.不定长参数(重点)
函数可以定义不定长参数,用于接收任意数量的位置实参。
5.1 元组型不定长参数
形参变量名前面加一个 ,这个参数则为元组型不定长参数,形参变量名一般叫args
,也可以叫其他名字,函数体使用不定长参数的时候直接使用变量名即可,无需加**
**。
不定长参数的本质是将传递的参数组包装成元组。
def fun_args(*args):
print(args, type(args))
fun_args()
fun_args(2, "d", 4)
输出
() <class 'tuple'>
(2, 'd', 4) <class 'tuple'>
5.2 字典型不定长参数
不定长参数还有一种形式,可以接收任意数量的关键字实餐。
定义参数需要在形参前面加**
,则为字典型不定长参数,同样函数体使用变量的时候不需要加星号,形参变量名默认叫kwargs
,这种不定长参数会把关键字参数包装成字典。
def fun_kwargs(name,**profile):
print(name, profile, type(profile))
fun_kwargs(name="Tom", age=19, sex="female")
输出
Tom {'age': 19, 'sex': 'female'} <class 'dict'>
可以由此得出
1.已经存在的形参,不会被包装到字典当中
2.字典型的不定长参数,必须放在形参列表最后面。(比默认参数还后面)
1.5.3 函数的类型
函数有参数也有返回值,可以二二组合成四种类型,一般写函数我们从需求来选择写什么类型的函数。
1.无参数,无返回值
一般只是用来显示内容的函数,无需参数,也无需返回值
2.无参数,有返回值
3.有参数,无返回值
import random
def fun01(person_h):
computer = random.randint(1, 3)
if person_h == 1 and computer == 2:
print("You Win")
elif person_h == 2 and computer == 3:
print("You Win")
elif person_h == 2 and computer == 1:
print("You Win")
elif person_h == computer:
print("Wow,Draw!")
else:
print("What a pity, U lose")
your_h = input("请出示你的猜拳(1=拳头 2=剪刀 3= 布):")
fun01(int(your_h))
4.有参数,有返回值
1.5.4 函数的嵌套调用
def fun001():
print("调用函数001")
print("调用函数001结束")
def fun002():
print("调用函数002")
fun001()
print("调用函数002结束")
fun002()
调用函数002
调用函数001
调用函数001结束
调用函数002结束
案例
def lines_print(num, char):
print(char*num)
def n_lines_print(n, num, char):
i = 0
while i < n:
lines_print(num, char)
i += 1
n_lines_print(2, 8, 'Hololive')
1.5.5 全局变量和局部变量
在函数里的声明的变量为局部变量,不可在函数外调用,在函数外面的是全局变量,所有地方都能调用,局部变量是临时调用的变量,存储临时需要存储的数据。如以下例子。
num = 0
def fun_var():
num = 250
print("在函数里的局部变量", num)
fun_var()
print("在函数外的全局变量", num)
输出
在函数里的局部变量 250
在函数外的全局变量 0
虽然会提醒局部变量名字和全局的一样,但是并不会改变全局变量num的值。因为在函数内如果不声明全局变量,直接赋值是创建了一个新的局部变量,而并不是外面的全局变量。
如果要修改外面的全局变量,则需要优先声明全局变量,使用和调用不需要声明。
num = 0
def fun_var():
global num
num = num +100
print("在函数里的局部变量", num)
fun_var()
print("在函数外的全局变量", num)
输出
在函数里的局部变量 100
在函数外的全局变量 100
拓展:闭包
闭包是介于局部变量与全局变量的一种变量
def fun_01():
k = 1
def fun_02():
i = 0
while i < 5:
i = i + k
return i
return fun_02()
print(fun_01())
此时变量k就是闭包,变量k可以被里函数调用,但是不可以被外面调用