一、函数的参数
函数的参数就是函数名后英文括号里包含的内容
# 0 个参数
def make_juice():
print('将猕猴桃去皮')
print('将猕猴桃切块')
print('将切碎的猕猴桃放进榨汁机')
print('将果汁倒进杯子中')
print('制作完成!')
# 1 个参数
def make_juice(fruit):
# 把 fruit 写进函数体中
print('将' + fruit + '去皮')
print('将' + fruit + '切块')
print('将切碎的' + fruit + '放进榨汁机')
print('将果汁倒进杯子中')
print('制作完成!')
参数也可以是多个。如果有多个参数,每个参数用英文逗号隔开
print('妮妮', '小新', '正男')
二、参数的类型
- 位置参数
- 关键字参数
def record(name, age, height, weight):
print('欢迎小朋友们!')
print('姓名:', name)
print('年龄:', age)
print('身高:', height, 'cm')
print('体重:', weight, 'kg')
# 下面开始调用定义的函数,传入关键信息。
record('野原新之助', 5, 110, 22)
record('风间彻', 5, 112, 21)
# 输出:
# 欢迎小朋友们!
# 姓名: 野原新之助
# 年龄: 5
# 身高: 110 cm
# 体重: 22 kg
# 欢迎小朋友们!
# 姓名: 风间彻
# 年龄: 5
# 身高: 112 cm
# 体重: 21 kg
调用函数时,就用到了 位置参数,按位置,依次传入了 name
、age
、height
、weight
四个参数纪录小新和风间的信息。
一次记录小新的信息,name
的值为 '野原新之助'
,age
的值为 5
,height
的值为 110
,weight
的值为 22
。
第二次记录风间的信息,name
为 '风间彻'
,age
为 5
,height
为 112
,weight
为 21
三、关键字参数
在调用函数时按照 参数名 = 值
的格式传入了参数,这种参数就叫作 关键字参数
def record(name, age, height, weight):
print('欢迎小朋友们!')
print('姓名:', name)
print('年龄:', age)
print('身高:', height, 'cm')
print('体重:', weight, 'kg')
record(age=5, weight=21, name='佐藤正男', height=109)
# 输出:
# 欢迎小朋友们!
# 姓名: 佐藤正男
# 年龄: 5
# 身高: 109 cm
# 体重: 21 kg
注意:位置参数可以和关键字参数一起使用,但要保证所有位置参数都在关键字参数前,Python 在解析参数时,是优先考虑 位置参数 的
def record(name, age, height, weight):
print('欢迎小朋友们!')
print('姓名:', name)
print('年龄:', age)
print('身高:', height, 'cm')
print('体重:', weight, 'kg')
record('佐藤正男', 5, height=109, 21)
# 报错:SyntaxError: positional argument follows keyword argument (语法错误:位置参数被放到关键字参数后面了)
下面代码才是可行的
def record(name, age, height, weight):
print('欢迎小朋友们!')
print('姓名:', name)
print('年龄:', age)
print('身高:', height, 'cm')
print('体重:', weight, 'kg')
# 位置参数放到所有关键字参数前面
record('佐藤正男', age=5, height=109, weight=21)
四、默认参数
我们可以在定义函数时,设置年龄默认为 5
def record(name, height, weight, age=5):
print('欢迎小朋友们!')
print('姓名:', name)
print('年龄:', age)
print('身高:', height, 'cm')
print('体重:', weight, 'kg')
# 调用函数时,遇到 5 岁的小朋友,可以不输入年龄
record('阿呆', 115, 25)
# 输出:
# 欢迎小朋友们!
# 姓名: 阿呆
# 年龄 5
# 身高 115 cm
# 体重 25 kg
# 输入妮妮的信息时,要在最后填上她的年龄
record('樱田妮妮', 105, 18, 4)
# 输出:
# 欢迎小朋友们!
# 姓名: 樱田妮妮
# 年龄: 4
# 身高: 105 cm
# 体重: 18 kg
我们在定义 age
的默认值时,将 age
移到了参数的最后的位置。这是因为,默认参数的要求是一定要放在非默认参数的后面,否则程序会出现错误
def record(name, age=5, height, weight):
print('欢迎小朋友们!')
print('姓名:', name)
print('年龄:', age)
print('身高:', height, 'cm')
print('体重:', weight, 'kg')
# 报错:SyntaxError: non-default argument follows default argument(语法错误:非默认参数被放到默认参数后面了。)
六、函数的多个返回值
和函数的参数一样,函数也支持 0 到多个返回值。
多个返回值也和多参数一样,放在关键词 return
后面并列,然后用英文逗号隔开。
def new_kids(kid1, kid2, kid3, kid4):
# 多个值在 return 后并列,用英文逗号间隔开
return kid1, kid2, kid3, kid4
print(new_kids('野原新之助', '风间彻', '佐藤正男', '樱田妮妮'))
# 输出:('野原新之助', '风间彻', '佐藤正男', '樱田妮妮')
文括号包裹,里面用英文逗号分隔开的是元组——Python 中的一种基本数据类型
七、函数的变量作用域
在 Python 中变量分为两种: 全局变量 和 局部变量。
全局变量 在当前写的代码中一直起作用。全局变量 有效的范围,叫作 全局作用域。
局部变量 只在一定范围内有效,在范围外就无效了
如公交卡:
加入幼儿园信息
school = '双叶幼儿园'
def record(name, weight, height, age=5):
# 函数内部加入班级信息
class_name = '向日葵班'
print(school + class_name + '欢迎小朋友们!')
print('姓名:', name)
print('年龄:', age)
print('身高:', height, 'cm')
print('体重:', weight, 'kg')
record('野原新之助', 22, 110)
# 输出:
# 双叶幼儿园向日葵班欢迎小朋友们!
# 姓名: 野原新之助
# 年龄: 5
# 身高: 110 cm
# 体重: 22 kg
# 到此为止,吉永老师很满意,然后她要介绍自己了。
print('我是' + school + class_name + '的吉永绿老师,大家多多指教!')
NameError: name 'class_name' is not defined(命名错误:class_name 名称没有被定义)
更改:
(1)变成全局变量
school = '双叶幼儿园' # 全局变量
class_name = '向日葵班' # 全局变量
def record(name, weight, height, age=5):
print(school + class_name + '欢迎小朋友们!')
print('姓名:', name)
print('年龄:', age)
print('身高:', height, 'cm')
print('体重:', weight, 'kg')
# school 和 class_name 可以正常访问
print('我是' + school + class_name + '的吉永绿老师,大家多多指教!')
# 输出:我是双叶幼儿园向日葵班的吉永绿老师,大家多多指教!
(2)只需要在函数内部局部变量前加上 global
关键字,把局部变量强制变成全局变量
school = '双叶幼儿园'
def record(name, weight, height, age=5):
global class_name # 表示 class_name 强制变成全局变量
class_name = '向日葵班'
print(school + class_name + '欢迎小朋友们!')
print('姓名:', name)
print('年龄:', age)
print('身高:', height, 'cm')
print('体重:', weight, 'kg')
record('野原新之助', 22, 110)
print('我是' + school + class_name + '的吉永绿老师,大家多多指教!')
# 输出:我是双叶幼儿园向日葵班的吉永绿老师,大家多多指教!
如果局部变量和全局变量名称相同,那函数内部会优先访问局部变量,外部只会访问全局变量
总结:
函数的 参数 个数支持从 0 到多个,传入多个参数的方式分为 位置参数 和 关键字参数,请记住:位置参数要放在所有关键字参数之前。除此之外,我们还学习了 默认参数,在定义参数时默认参数一定要放在位置参数后。
函数中用 return
可以有多个返回值,需要注意的是,每个返回值要用 英文逗号 隔开。
最后我们重点学习了 函数的变量作用域,需要注意的是,如果局部变量与全局变量名称相同,函数内会优先访问局部变量。
那么,在什么情况下要在函数内加 global
,老师帮你总结一下:
- 在函数外想要使用函数内的变量(全局作用域使用局部变量)。如果不加
global
,则无法在函数外访问函数内的变量。 - 在函数内修改函数外的变量(局部作用域修改全局变量)。如果不加
global
,只是在函数内定义了和全局变量同名的变量,两者井水不犯河水。