函数

初识函数
1.1 函数的作用
“人生苦短,我用Python”,正因为Python语法简单,才会越来越被编程界欢迎。换言之,我们编程,更应该避免重复性代码。
前面学习的循环是减少代码重复的一种手段,那么接下来要学习的函数也是减少重复性代码的另一种手段。它的定义是:
在这里插入图片描述
什么意思呢?我们之前写的代码只能执行一次,但是函数中的代码可以使用多次。
通俗来讲,函数就如同一个包裹,每个包裹都有一个功能,无论你在哪儿,只要你需要包裹,就把它拿过去用;你需要什么样功能的包裹,就用什么样的包裹;你需要使用多少次包裹,就使用多少次。
这就是函数,在之后的旅程中,你会越来越体会到函数的妙用。讲了这么多了,先看一下函数长什么样子?
1.2函数的组成
先不着急看Python的函数,先来个数学函数,那些年,我们错过的函数。
数学函数y = 6x +9 , x是自变量,6x+9是执行过程,y是因变量,自变量x决定了因变量y的值。
那么,你可以将y = 6*x +9看作成3部分。
在这里插入图片描述
在Python中,我们遇到很多函数, 有负责输入数据的函数,有负责数据处理的函数,有负责数据输出的函数。
在这里插入图片描述
以上就是我们见过的Python的函数,这些函数是Python自带的函数,我们不需要管这些函数怎么来的,就负责用就好了,这些函数也叫内置函数。
你会发现,上面这些函数,都有括号(), 里面存放我们需要传给函数的数据,在Python江湖中,这种数据称为【函数的参数】。【参数】指的是函数要接受、处理的数据,其实就是一个变量。

1
#直接运行代码
2
length1 = len('肯德基的老爷爷')
3
print(length1)
4
length2 = len(['KFC','麦当劳','汉堡王'])
5
print(length2)

你会发现,括号内放的参数不一样,结果也会不一样。
括号里面的字符串、列表都是len()函数的参数。
在这里插入图片描述
好了,我们看过了函数的样子。但是问题来了,这些函数很好,如果用不到他们怎么办。就像我们KFC餐厅里,顾客不想吃汉堡怎么办?我们可以给他们做卤肉饭啊。
同样,我们也可以根据自己的需要,定义自己想要的函数。
下面小K带大家进入本节课重点:定义和调用函数。
1.3定义和调用函数
编写函数第一步,我们先来看一下如何定义一个函数,它的基本语法是什么。
编写函数第一步,我们先来看一下如何定义一个函数,它的基本语法是什么。
在这里插入图片描述
我们以上面y = 6x+9为例,定义一个函数。
函数三部分,第一部分输入,在y = 6
x+9函数中,因为x变,y才改变,x就是输入到函数的数据,就是这个函数的参数;第二部分,执行过程,执行过程就是计算y的结果,即6x+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返回值:需要返回什么数据,就写什么数据,如果不需要,可以不写

完成函数y=30+11*x

def function(x):
    y=30+11*x 
    return y
def math(x):
    y =  30 + 11*x
    return y

你会发现,终端内没有任何内容。
没有内容就对了,现在只是定义了函数,还没有使用函数。
定义函数,就是将函数内部功能封装好,然后等待调用。就如同包裹一样,你现在只是装好了包裹,但是还没有使用。
怎么使用函数呢?在Python江湖中,我们使用函数叫做“调用函数”,很简单就是输入函数名与参数所对应的数据。
运行一下下面代码,观察终端里的效果。

def math(x):
    y =  30 + 11*x
    return y

res = math(10)
print(res)

在这里插入图片描述

解读分析:math(10)就是调用函数,math为定义函数的名字(定义与调用时名字一致);传递参数,10对应函数参数x, 在调用函数时,将10传递给x; 在函数体中,y = 30 +11*10, 得出y的结果为140; 那么,res就用来接收y的值,即res=140。所以,打印出来的结果就是140。
OK,现在掌握调用函数了吧。
现在你看到就是函数最基本的形式,目的就是让大家先有个认知。
接下来,我们做个练习巩固一下。
请听题:定义一个函数,用户传入“XXX”,就打印出“您好,欢迎来到KFC餐厅,您的点餐为XXX”。这个XXX, 可以传入汉堡、薯条,任何内容。
提示:使用input,接收用户输入内容,然后调用函数,完成功能。

food = input("请点餐:")
def cook(x):
    str="您好,欢迎来到KFC餐厅,您的点餐为"+x
    return str

res = cook(food)
print(res)

函数的进阶使用

上面我们调用函数,设置、传递参数是编写函数的重点。在Python江湖中,函数中无论设置、传递多少个参数都可以,哪怕不设置、传递参数也行。
先来了解一下函数类型。

2.1函数类型
我们KFC餐厅,需要做一个欢迎广告语,每位顾客来的时候都要进行播放。那看一下,如何在Python中使用函数实现这个广告语。

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

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

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

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

在这个例子中,也不需要return语句,因为里面的内容直接打印在屏幕上即可, 不要返回值的。

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

好了,接下来,我们看看函数可以设置多少个参数。

我们KFC餐厅在刚开业的时候,因为其他原因,只能为每位顾客提供汉堡、饮料、小食三种食品。如果写成函数,这个函数就有3个参数。

我使用hamburger、drink、snacks作为汉堡、饮料、小食的参数

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))

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

我们将返回的内容打印出来,又打印了一下返回值的类型:< class ‘tuple’ >

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

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

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

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

使用for循环,将元组中的内容遍历出来。一一显示。

我们研究一下常用的print()函数,翻看了一下Python宝典,其中是这样介绍print()函数的。

print(*objects, sep = ' ', end = '\n', file = sys.stdout, flush = False)

我们可以看到,print()函数中第一个参数objects带了*号,是不定长参数——这也就是print()函数可以传递任意数量的参数。

现在,你掌握了函数参数的不同形态,以后视具体需要,来设置函数参数。

2.2返回多个值

函数,不仅可以支持多个参数,还可以支持多个返回值。接下来我们就讲讲如何使用return语句返回多个返回值。

回到我们的KFC餐厅,我们要优惠活动,到店顾客,只要买单我们就有美食相送。 具体规则:用户消费满69元,我们随机赠送10元食品一份;用户消费满99元,我们随机赠送10元食品一份外加一个冰激淋。

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条return语句,每条语句返回的内容都不一样,返回的数量也不一样。这就是返回多个值的用法。

return a,'冰激淋'
return b
return '不好意思,您的消费达不到优惠活动'

多函数协作

在开始时候,我们说过,函数封装了独立功能,一个程序往往由多个函数来配合实现。

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

什么是变量作用域?说白了,就是地盘问题;比如说,KFC是由哈兰·山德士老爷爷创立的,所有KFC餐厅都会听他的,他说下个月所有KFC要供应烤串,这肯定没问题;但是他如果去要求麦当劳餐厅,估计就没人理他了;但是如果特朗普说,所有的KFC与麦当劳餐厅都要卖“兰州拉面“,KFC与麦当劳肯定得卖,谁让他是美国总统呢。

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

看代码感觉很美,运行代码就会发现报错喽。

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

这就是变量的作用问题:作用域分为全局作用域和局部作用域。

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

局部作用域:在某个函数内部赋值的变量,只能在当前函数内使用(局部作用域),出了这个函数,它就不起作用了,这就是局部变量;比如harland = ‘所有KFC餐厅卖烤串’;它只在KFC()函数中起作用,在McDonald()就不起作用了。
在这里插入图片描述
可是,如果,我非让KFC的哈兰·山德士老爷爷说话在麦当劳管用怎么办?也就是非要让harland = ‘所有KFC餐厅卖烤串’,在麦当劳中起作用怎么办?

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

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()

好了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()中运行。

这就是函数的嵌套,在一个函数中调用其他函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值