函数
1. 初识函数
1.1 函数的作用
函数是组织好的、可以重复使用的、用来实现单一功能的代码
1.2 定义
定义函数的语法书写:def 函数名(参数名)(注:括号内可以为空,也可以为多个参数,多个参数间用逗号隔开即可)
def 函数名(参数1,参数2,...参数n):
函数体
return 语句
函数内部一旦遇到return语句,就会停止执行并返回结果。没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值(return None可以简写为return。)
1.3 调用函数
def math(x):
y = x ** 2 + x
return y
a = math(10)
print(a)
#-> 110
不带参数的函数调用:直接函数名+括号可调用(运行)函数。 带参数的函数,调用时需要在括号中传入参数
2. 函数重要概念
2.1 默认参数
默认参数必须放在位置参数之后。若调用函数时没有传递参数就为默认值,但如果调用时向默认参数传递了数据,则默认参数被新参数代替。
def menu(appetizer,course,dessert='绿豆沙'):
print('一份开胃菜:'+appetizer)
print('一份主食:'+course)
print('一份甜品:'+dessert)
menu('话梅花生','牛肉拉面')
#-> 结果显示为:因为调用时只给了两个参数,第三个参数为默认值
#-> 一份开胃菜:话梅花生
#-> 一份主食:牛肉拉面
#-> 一份甜品:绿豆沙
menu('话梅花生','牛肉拉面','银耳羹')
#-> 结果显示为:因为调用时给了三个参数,第三个参数被更新
#-> 一份开胃菜:话梅花生
#-> 一份主食:牛肉拉面
#-> 一份甜品:银耳羹
2.2 不定长参数
一个星号*加上参数名。当传入此处的参数数量不确定时使用,数据类型为元组(元组(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('话梅花生','牛肉拉面','银耳羹','烤鸡翅','烤茄子','烤玉米')
#结果显示为:
#一分开胃菜:话梅花生
#一份主菜:牛肉拉面
#一份甜品:银耳羹
#一份烤串:烤鸡翅
#一份烤串:烤茄子
#一份烤串:烤玉米
2.3 return 语句
一个返回值
def A():
name = '七七'
return name
print(A())
#-> 七七
注意:执行了 return 语句后,return 下面的语句不执行(这里依旧只打印出七七)
多个返回值
import random
appetizer = ['话梅花生','拍黄瓜','凉拌三丝']
def coupon(money):
if money < 5:
a = random.choice(appetizer)
return a
elif 5 < money < 10:
b = random.choice (appetizer)
return b, '溏心蛋'
result = coupon(6)
print(result[0])
print(result[1])
a,b = coupon(7)
print(a)
print(b)
#-> 拍黄瓜
#-> 溏心蛋
#-> 拍黄瓜
#-> 溏心蛋
2.4 变量作用域
2.4.1 局部变量
在函数内定义的变量,仅能在函数内部使用(局部作用域)
def A():
name='七七'
print(name)
上面的语句会报错,因为 name 是函数内的变量(即局部变量)。
2.4.2 全局变量
所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域)
teacher = '七七'
def A():
name='卡西'
print(teacher)
print(teacher)
A()
#-> 七七
#-> 七七
上面的语句运行后会打印两次 “七七”,因为变量 teacher 是全局变量,执行函数的时候可以正常打印出 teacher。
2.4.3 global 语句
可以将局部变量转换为全局变量,一般写在函数体的第一行
def A():
global name
name='七七'
A()
print(name)
#-> 七七
以上语句将我们的局部变量 name 转换为全局变量,让我们在外部也能正常打印 name。
(注意:一定要执行了函数 A ,才会执行 global 语句,才能将局部变量转换为全局变量)
局部变量和全局变量尽量不要取相同的名字,以免混淆
2.4.4 函数嵌套
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()
3. 知识拓展
3.1 list() 函数
可以将数据转换为列表
a='七七'
a=list(a)
print(a)
# 结果为:['七', '七']
3.2 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))#第二次为空
#结果显示为
#[]