第二章 第7节 经营KFC

初识函数

1.1 函数的作用

“人生苦短,我用Python”,正因为Python语法简单,才会越来越被编程界欢迎。换言之,我们编程,更应该避免重复性代码。

前面学习的循环是减少代码重复的一种手段,那么接下来要学习的函数也是减少重复性代码的另一种手段。它的定义是:

通俗来讲,函数就如同一个包裹,每个包裹都有一个功能,无论你在哪儿,只要你需要包裹,就把它拿过去用;你需要什么样功能的包裹,就用什么样的包裹;你需要使用多少次包裹,就使用多少次。

1.2 函数的组成

在Python中,我们遇到很多函数, 有负责输入数据的函数,有负责数据处理的函数,有负责数据输出的函数。

以上就是我们见过的Python的函数,这些函数是Python自带的函数,我们不需要管这些函数怎么来的,就负责用就好了,这些函数也叫内置函数。

你会发现,上面这些函数,都有括号(), 里面存放我们需要传给函数的数据,在Python江湖中,这种数据称为【函数的参数】。【参数】指的是函数要接受、处理的数据,其实就是一个变量。

length1 = len('肯德基的老爷爷')
print(length1)
length2 = len(['KFC','麦当劳','汉堡王'])
print(length2)

你会发现,括号内放的参数不一样,结果也会不一样。

我们也可以根据自己的需要,定义自己想要的函数。

1.3定义和调用函数

函数三部分,第一部分输入,在y = 6*x+9函数中,因为x变,y才改变,x就是输入到函数的数据,就是这个函数的参数;第二部分,执行过程,执行过程就是计算y的结果,即6*x+9的结果;还有第三部分,输出结果,计算完这个结果后要把这个结果告诉别人。

拆分解读:第一行:def的全称是define, 译为定义;fun是函数名字,自己起的;(x)这里是函数的参数,参数名字也是自己起;不要忘了最后的冒号:

江湖秘籍:涉及到的符号都是英文的哦。

第二行:def下一行缩进的内容叫做函数体,这是函数要实现的功能。即根据x的值,计算6*x+9,将结果赋值给y。

第三行:return 语句是返回的意思,可以指定函数执行完毕后最终会得到什么样的结果,否则计算机是无法判断出函数最终要输出什么结果的。

#函数名:1.名字能体现函数的功能,一般用小写英文字母和数字、英文下划线组合使用
         #2.不能与Python内置函数重名
def function(x):
#函数参数: 1.根据函数功能,括号内可以有多个参数,也可以没有参数
            #2.参数的命名规则与函数名命名规则一样
            #3.括号是英文括号,后面是英文冒号
    y = 6*x + 9
    #函数体:函数执行过程,完成函数功能,要缩进哦
    return y
    #return返回值:需要返回什么数据,就写什么数据,如果不需要,可以不写
def math(x):
    y =  30 + 11*x
    return y

解读分析:math(10)就是调用函数,math为定义函数的名字(定义与调用时名字一致);传递参数,10对应函数参数x, 在调用函数时,将10传递给x; 在函数体中,y = 30 +11*10, 得出y的结果为140; 那么,res就用来接收y的值,即res=140。所以,打印出来的结果就是140。

food = input("请问您想吃什么?请输入:")
def cook(x):
    str = '您好,欢迎来到KFC餐厅,您的点餐为' + x
    return str
res = cook(food)
print(res)

函数的进阶使用

2.1函数类型

def helloKFC():
    print('虽然我们生而不同')
    print('但馋起来是一样的')
    print('每个鸡翅都值得被啃个干净')
    print('我们已经很饿了,你们呢?')
    print('十翅一桶39元')
    print('重磅回归,就在今天')
helloKFC()

观察上面的代码,这里定义了一个helloKFC()函数,但是括号里没有参数。

这是因为,我们的广告也不需要接收用户内容,只需要原样打印广告即可,所以不需要传递参数。

江湖秘籍:即使没有参数,在定义函数、调用函数的时候也不能省略括号。

函数的执行过程,可以有返回值,也可以没有返回值。

def menu(hamburger, drink, snacks):
    print('汉堡选择:' + hamburger)
    print('饮料选择:' + drink)
    print('小食选择:' + snacks + '\n')

menu('香辣鸡腿堡','可乐','薯条')
menu('老北京鸡肉卷','雪碧','鸡翅')
menu('培根烤鸡腿堡','橙汁','蛋挞')

注意:无论有多少个参数,调用函数时传递参数的顺序要与定义函数时设置参数的顺序一致。 这就是位置参数。

江湖秘籍:默认参数在位置参数之后。

def menu(hamburger, drink, snacks='蛋挞'):
    print('汉堡选择:' + hamburger)
    print('饮料选择:' + drink)
    print('小食选择:' + snacks + '\n')

menu('香辣鸡腿堡','可乐')
menu('老北京鸡肉卷','雪碧')
menu('培根烤鸡腿堡','橙汁')

在这里,我们设置了默认参数snacks=’蛋挞’,在调用函数的时候,蛋挞也会默认添加到菜单中。

def menu(hamburger, drink, snacks='蛋挞'):
    print('汉堡选择:' + hamburger)
    print('饮料选择:' + drink)
    print('小食选择:' + snacks + '\n')

menu('香辣鸡腿堡','可乐')
menu('老北京鸡肉卷','雪碧')
menu('培根烤鸡腿堡','橙汁','薯条')

在调用函数时,参数一一传递;在第三次调用函数menu(‘培根烤鸡腿堡’,’橙汁’,’薯条’)时,‘薯条‘会替换默认的参数’蛋挞‘,将snacks设置为’薯条‘。

def menu(*food):
    return food

order1 =  menu('香辣鸡腿堡','可乐')
order2 =  menu('卤肉饭','老北京鸡肉卷','雪碧','可乐')
order3 =  menu('烤串','火锅','培根烤鸡腿堡','橙汁','薯条','甜筒')
print(order1)
print(order2)
print(order3)
print(type(order1))
print(type(order2))
print(type(order3))

代码解读:这里使用一个星号*加上参数名就接收到了所有参数,无论参数写几个,都能接收到。而返回值就是参数名

Tuple叫做元组,元组的写法是将所有内容放在小括号中,使用逗号隔开,和列表用法类似。但是又与列表不同,列表中的元素可以更改,而元组中的元素不可以更改。

和列表相同的是:元组也是可以遍历的对象。使用for循环遍历一下。

def menu(*food):
    for i in food:
        print('点餐内容:'+i)

menu('香辣鸡腿堡','可乐')
menu('卤肉饭','老北京鸡肉卷','雪碧','可乐')
menu('烤串','火锅','培根烤鸡腿堡','橙汁','薯条','甜筒')

2.2返回多个值

import random 
foodten = ['蛋挞','鸡翅','薯条']
def order(money):
    if money > 99:
        a = random.choice(foodten)
        return a,'冰激淋'
    elif 69 < money < 99:
        b = random.choice (foodten)
        return b
    else:
        return '不好意思,您的消费达不到优惠活动'
print(order(50))
print(order(70))
print(order(130))

多函数协作

当多函数协作运行时,就涉及到函数中一个非常重要的内容—变量作用域。

3.1变量作用域

trump = '所有餐厅都要卖【兰州拉面】'
def KFC():
    harland = '所有KFC餐厅卖烤串'
    print('KFC餐厅:%s'%trump)
    print('KFC餐厅:%s'%harland)
def McDonald():
    print('麦当劳餐厅:%s'%trump)
    print('麦当劳餐厅:%s'%harland)
KFC()
McDonald()

运行KFC()函数没有任何问题;运行McDonald()函数就报错了; 给我们弹出一个bug, 在print(‘麦当劳餐厅:%s’%harland)这句代码中,抛出【NameError: name ‘harland’ is not defined】的错误。

全局作用域:在所有函数之外赋值的变量,可以在程序任意位置使用(全局作用域),这就是全局变量;比如第一行的trump = ‘所有餐厅都要卖【兰州拉面】’;它在KFC()与McDonald()两个函数中都起作用。

局部作用域:在某个函数内部赋值的变量,只能在当前函数内使用(局部作用域),出了这个函数,它就不起作用了,这就是局部变量;比如harland = ‘所有KFC餐厅卖烤串’;它只在KFC()函数中起作用,在McDonald()就不起作用了。

trump = '所有餐厅都要卖【兰州拉面】'
def KFC():
    global harland 
    harland = '所有KFC餐厅卖烤串'
    print('KFC餐厅:%s'%trump)
    print('KFC餐厅:%s'%harland)
def McDonald():
    print('麦当劳餐厅:%s'%trump)
    print('麦当劳餐厅:%s'%harland)
KFC()
McDonald()

在harland = ‘所有KFC餐厅卖烤串’使用global对变量进行修饰,global表示全局意思,它就告诉计算机,这个变量变成了全局变量,它在任何地方都起作用。

3.2函数嵌套

其实,我们都见过函数嵌套,比如:print(len(‘我爱你’))、print(type(10))

这就是print()函数嵌套了len()函数,print()函数嵌套了type()函数;这样,代码会先运行print()括号内的函数,再将这个函数结果放到print()函数中执行,打印出来。

def hello():
    print('欢迎光临KFC')
    print('很高兴为您服务')
def order():
    print('这里是下单中心')
    hello()
    print('请您点餐')
    print('以上菜单的菜品都有')
order()

在这里,我定义了两个函数,函数hello()与函数order(),在函数order()中调用了函数hello(),这样函数hello()中的代码会在函数order()中运行。

课后练习

1. 今年业绩不错,KFC餐厅要给员工发奖金,定义一个函数,当输入员工姓名与年限时,打印该员工今年拿多少奖金。

奖金规则制定如下: 工作年限<1年的,发1000元奖金; 工作年限≥1年但<3年的,发3000元奖金 工作年限≥3年的,发10000元奖金 比如输入姓名 ‘老王’,年限‘3’;就会打印出“老王你好,今年你拿10000元奖金”。


0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注