第9关 函数
课程目标
- 了解函数的作用
- 熟练掌握函数的参数类型以及参数传递
- 掌握函数的返回值及return语句的运用
- 了解全局变量和局部变量,以及将局部变量转换为全局变量的方法
课程难点
- 函数中参数的传递顺序
- 函数的返回值及return语句的运用
课程重要内容重现
一、函数
函数是组织好的、可以重复使用的、用来实现单一功能的代码。写为:函数名(参数名),注:括号内可以为空,也可以为多个参数,多个参数间用逗号隔开即可。
- 参数
函数中需要使用的变量,数量视情况而定。
1)位置参数
位置参数是描述总体最常用的一种参数。参数的顺序和个数要和函数定义中一致。例如:
def menu(appetizer,course):
print('一份开胃菜:'+appetizer)
print('一份主食:'+course)
menu('话梅花生','牛肉拉面')
#'话梅花生'和'牛肉拉面'是对应参数appetizer和course的位置顺序传递的,所以被叫作【位置参数】
2)默认参数
默认参数必须放在位置参数之后。若调用函数时没有传递参数就为默认值,但如果调用时向默认参数传递了数据,则默认参数被新参数代替。
def menu(appetizer,course,dessert='绿豆沙'):
print('一份开胃菜:'+appetizer)
print('一份主食:'+course)
print('一份甜品:'+dessert)
menu('话梅花生','牛肉拉面')
#结果显示为:因为调用时只给了两个参数,第三个参数为默认值
#一份开胃菜:话梅花生
#一份主食:牛肉拉面
#一份甜品:绿豆沙
menu('话梅花生','牛肉拉面','银耳羹')
#结果显示为:因为调用时给了三个参数,第三个参数被更新
#一份开胃菜:话梅花生
#一份主食:牛肉拉面
#一份甜品:银耳羹
3)不定长参数
一个星号*加上参数名。当传入此处的参数数量不确定时使用,数据类型为元组(元组(tuple):写法是把数据放在小括号()中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修改,但元组中的元素不可更改。列表一样,元组是可迭代对象,这意味着我们可以用for循环来遍历它)。
- 当默认参数在不定长参数后时,若想更改默认参数,需要注明dessert='银耳羹',例如:
def menu(appetizer,course,*barbeque,dessert='绿豆沙'):
print('一份开胃菜:'+appetizer)
print('一份主菜:'+course)
print('一份甜品:'+dessert)
for i in barbeque:
print('一份烤串:'+i)
menu('话梅花生','牛肉拉面','烤鸡翅','烤茄子','烤玉米',dessert='银耳羹')
#结果显示为:
#一分开胃菜:话梅花生
#一份主菜:牛肉拉面
#一份甜品:银耳羹
#一份烤串:烤鸡翅
#一份烤串:烤茄子
#一份烤串:烤玉米
- 当默认参数在不定长参数之前,则默认按顺序传递参数(默认参数会改变),剩下的参数均传递给不定长参数。
def menu(appetizer,course,dessert='绿豆沙',*barbeque):
print('一份开胃菜:'+appetizer)
print('一份主菜:'+course)
print('一份甜品:'+dessert)
for i in barbeque:
print('一份烤串:'+i)
menu('话梅花生','牛肉拉面','银耳羹','烤鸡翅','烤茄子','烤玉米')
#结果显示为:
#一分开胃菜:话梅花生
#一份主菜:牛肉拉面
#一份甜品:银耳羹
#一份烤串:烤鸡翅
#一份烤串:烤茄子
#一份烤串:烤玉米
- 定义函数
语法:
def 函数名(参数1,参数2,...参数n):
函数体
return 语句
函数内部一旦遇到return语句,就会停止执行并返回结果。没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值(return None可以简写为return。)
- 调用函数
1)语法:函数名(参数)
参数从0个到多个都可以实现。但当参数个数为0时,括号也不能省略。
2)math(10)的意思是将整数10赋值给参数x并运行该函数。函数执行完毕后最终返回了y的值即110,然后将这个结果赋值给变量a,再用print()将变量a打印出来。
def math(x):
y = x ** 2 + x
return y
a = math(10)
print(a)
3)也可以只用一行代码print(math(10))来表示同样的意思。
二、return语句
- return是返回值,当输入参数给函数,函数就会返回一个值,事实上每个函数都会有返回值。
- 如果不是立即要对函数返回值做操作,可以用return语句保留返回值。
需要多次调用函数时,可以定义一个主函数main(),调用非主函数的返回值。下面例子中的传参:main()函数中的李若彤→dream_face(位置参数)→face()函数的参数name,最终返回name + '的脸蛋'即李若彤的脸蛋。
def face(name):
return name + '的脸蛋'
def body(name):
return name + '的身材'
def main(dream_face,dream_body):
return '我的梦中情人:' + face(dream_face) + ' + ' + body(dream_body)
print(main('李若彤','林志玲'))
- 若需要返回多个值,在return后用逗号隔开即可,此时返回的是一个元组。元组与列表其实都是数据的“序列”,元组取某个位置的值的操作,与列表是一模一样的,即元组名[i]。
def lover(name1,name2):
face = name1 + '的脸蛋'
body = name2 + '的身材'
return face,body
a=lover('李若彤','林志玲')
#此时return的值为元组 ('李若彤的脸蛋', '林志玲的身材'),并赋值给变量 a 。
print('我的梦中情人:'+a[0]+' + '+a[1])
- 没有return语句的函数会默认返回None值。
- 一旦函数内部遇到return语句,就会停止执行并返回结果。
三、变量的作用域
- 局部变量
在函数内定义的变量,仅能在函数内部使用(局部作用域)
- 全局变量
所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域)
- 局部变量和全局变量不要取相同的名字,以免混淆。
- global语句:可以将局部变量转换为全局变量,一般写在函数体的第一行。
def egg():
global quantity
#global语句将变量quantity声明为全局变量
quantity = 108
egg()
print(quantity)
四、函数的嵌套
sum = rent + cost() 的结果就是sum = rent + variable_cost(cost()函数的返回值)。最后调用函数时,也只需调用sum_cost()即可。
rent = 3000
def cost():
utilities = int(input('请输入本月的水电费用'))
food_cost = int(input('请输入本月的食材费用'))
variable_cost = utilities + food_cost
print('本月的变动成本是' + str(variable_cost))
return variable_cost
def sum_cost():
sum = rent + cost()#调用函数
print('本月的总成本是' + str(sum))
sum_cost()
五、其他
- list()函数
可以将数据转换为列表。
- extend()函数
- append() ,方法用于在列表末尾添加新的对象,只能添加一个值(多个值作为一个整体也行)。
- extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)如果extend的是字符串,则字符串会被拆分成字符数组,如果extend的是字典,则字典的key会被加入到ist中。
list1=[1,2]
list2=[2,4,5]
list3=[]
list2.append(list1)
print(list2)
#结果显示为:
#[2,4,5,[1,2]] list1的元素作为一个列表整体被加入list2
list3.extend(list1)
print(list3)
#结果显示
#[1,2] list1的元素独立加入list3中
- (拓展一下下,感兴趣可以查一查哦~)*reversed()函数
reversed()函数可以将数据反转,从后往前迭代。
reversed()之后,第二次for循环、list()、tuple()以及join()得到的结果都为空,原因就是b不是反转列表本身,而是一个列表反向迭代器,所以直接输出函数返回值会是类似于乱码,且reversed()之后,只在第一次遍历时返回值。
#参数是列表1:
a=[1,2,3,4,5]
b=reversed(a)
print(a)
#结果显示为:
#[1, 2, 3, 4, 5]
print(b)
#结果显示为:
#<listreverseiterator object at 0x06A9E930>
for i in b:#第一次遍历
print(i)
#结果显示为:
#5 4 3 2 1
for i in b:#第二次遍历为空
print(i)
#结果显示为:啥也没有
#参数是列表2:
a=[1,2,3,4,5]
b=reversed(a)
print(list(b))#第一次转换为列表
#结果显示为:
#[5,4,3,2,1]
print(list(b))#第二次
#结果显示为:
#[]
#参数是元组
t=(4,5,6)
tt=reversed(t)
print(t)
#结果显示为:
#(4, 5, 6)
print(tt)
#结果显示为:
#<reversed object at 0x06A07E50>
print(tuple(tt))
#第一次转换为元组
#结果显示为
#(6, 5, 4)
print(tuple(tt))
#第二次为空
#结果显示为
#()
#参数是字符串
s='cba'
ss=reversed(s)
print(s)
#结果显示为
#'cba'
print(ss)
#结果显示为
#<reversed object at 0x06A07E70>
print(list(ss))#第一次转换为列表
#结果显示为
#['a', 'b', 'c']
print(list(ss))#第二次为空
#结果显示为
#[]