函数

242 阅读6分钟

函数

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))#第二次为空
#结果显示为
#[]