第十三课人生苦短我用Python语法简单才会越来越被编程界欢迎.docx
《第十三课人生苦短我用Python语法简单才会越来越被编程界欢迎.docx》由会员分享,可在线阅读,更多相关《第十三课人生苦短我用Python语法简单才会越来越被编程界欢迎.docx(13页珍藏版)》请在冰点文库上搜索。
第十三课人生苦短我用Python语法简单才会越来越被编程界欢迎
第十三课人生苦短我用Python语法简单才会越来越被编程界欢迎
初始函数
1.1函数的作用
;1.2函数的组成
1.3定义和调用函数
函数的进阶使用
2.1函数类型
2.2返回多个值
多函数协作
3.1变量作用域
3.2函数嵌
/\e这两节课的主要内容是带大家探究“熟悉的陌生人”——函数。
之所以这么说,是因为我们之前已经接触过Python函数,但是对它没有系统地了解过。
这节课,我们一起经营KFC,在我们KFC门店里通过运用函数解决我们的问题。
首先在学习具体知识前,我向大家简要的介绍下函数的作用,知道函数是做什么用的?
1函数的作用
人生苦短,我用Python”,正因为Python语法简单,才会越来越被编程界欢迎。
换言之,我们编程,更应该避免重复性代码。
前面学习的循环是减少代码重复的一种手段,那么接下来要学习的函数也是减少重复性代码的另一种手段。
它的定义是:
什么意思呢?
我们之前写的代码只能执行一次,但是函数中的代码可以使用多次。
通俗来讲,函数就如同一个包裹,每个包裹都有一个功能,无论你在哪儿,只要你需要包裹,就把它拿过去用;你需要什么样功能的包裹,就用什么样的包裹;你需要使用多少次包裹,就使用多少次。
这就是函数,在之后的旅程中,你会越来越体会到函数的妙用。
讲了这么多了,先看一下函数长什么样子?
1.2函数的组成
先不着急看Python的函数,先来个数学函数,那些年,我们错过的函数。
数学函数y=6*x+9,x是自变量,6*x+9是执行过程,y是因变量,自变量x决定了因变量y得值。
那么,你可以将y=6*x+9看作成3部分
在Python中,我们遇到很多函数,有负责输入数据的函数,有负责数据处理的函数,有负责数据输出的函数。
以上就是我们见过的Python的函数,这些函数是Python自带的函数,我们不需要管这些函数怎么来的,就负责用就好了,这些函数也叫内置函数。
你会发现,上面这些函数,都有括号(),里面存放我们需要传给函数的数据,在Python江湖中,这种数据称为【函数的参数】。
【参数】指的是函数要接受、处理的数据,其实就是一个变量。
好了,我们看过了函数的样子。
但是问题来了,这些函数很好,如果用不到他们怎么办。
就像我们KFC餐厅里,顾客不想吃汉堡怎么办?
我们可以给他们做卤肉饭啊,同样,我们也可以根据自己的需要,定义自己想要的函数。
大家进入本节课重点:
定义和调用函数。
编写函数第一步,我们先来看一下如何定义一个函数,它的基本语法是什么。
+3定义和调用函数
函数三部分,第一部分输入,在y=6*x+9函数中,因为x变,y才改变,x就是输入到函数的数据,就是这个函数的参数;第二部分,执行过程,执行过程就是计算y的结果,即6*x+9的结果;还有第三部分,输出结果,计算完这个结果后要把这个结果告诉别人。
因此,这个函数可以写成下面这个样子。
拆分解读:
第一行:
def的全称是define,译为定义;fun是函数名字,自己起的;(x)这里是函数的参数,参数名字也是自己起;不要忘了最后的冒号:
江湖秘籍:
涉及到的符号都是英文的哦。
第二行:
def下一行缩进的内容叫做函数体,这是函数要实现的功能。
即根据x的值,计算6*x+9,将结果赋值给y。
第三行:
return语句是返回的意思,可以指定函数执行完毕后最终会得到什么样的结果,否则计算机是无法判断出函数最终要输出什么结果的。
定义函数是不是很简单?
但是里面还有很多注意事项,不要踩坑。
#函数名:
1.名字能体现函数的功能,一般用小写英文字母和数字、英文下划线组合使用
现在,你根据上面的例子,完成函数y=30+11*x,请在下面代码框中编写,点击运行。
你会发现,终端内没有任何内容。
没有内容就对了,现在只是定义了函数,还没有使用函数。
定义函数,就是将函数内部功能封装好,然后等待调用。
就如同包裹一样,你现在只是装好了包裹,但是还没有使用。
怎么使用函数呢?
在Python江湖中,我们使用函数叫做“调用函数”,很简单就是输入函数名与参数所对应的数据。
运行一下下面代码,观察终端里的效果。
解读分析:
math(10)就是调用函数,math为定义函数的名字(定义与调用时名字一致);传递参数,10对应函数参数x,在调用函数时,将10传递给x;在函数体中,y=30+11*10,得出y的结果为140;那么,res就用来接收y的值,即res=140。
所以,打印出来的结果就是140。
OK,现在掌握调用函数了吧。
现在你看到就是函数最基本的形式,目的就是让大家先有个认知。
接下来,我们做个练习巩固一下。
请听题:
定义一个函数,用户传入“XXX”,就打印出“您好,欢迎来到KFC餐厅,您的点餐为XXX”。
这个XXX,可以传入汉堡、薯条,任何内容。
提示:
使用input,接收用户输入内容,然后调用函数,完成功能。
来,试一下:
上面我们调用函数,设置、传递参数是编写函数的重点。
在Python江湖中,函数中无论设置、传递多少个参数都可以,哪怕不设置、传递参数也行。
先来了解一下函数类型。
们KFC餐厅,需要做一个欢迎广告语,每位顾客来的时候都要进行播放。
那看一下,如何在Python中使用函数实现这个广告语。
运行一下下面代码,观察终端里的效果。
defhelloKFC():
print('虽然我们生而不同')
print('但馋起来是一样的')
print('每个鸡翅都值得被啃个干净')
print('我们已经很饿了,你们呢?
')
print('十翅一桶39元')
print('重磅回归,就在今天')
helloKFC()
观察上面的代码,这里定义了一个helloKFC()函数,但是括号里没有参数。
这是因为,我们的广告也不需要接收用户内容,只需要原样打印广告即可,所以不需要传递参数。
1江湖秘籍:
即使没有参数,在定义函数、调用函数的时候也不能省略括号。
2在这个例子中,也不需要return语句,因为里面的内容直接打印在屏幕上即可,不要返回值的。
3简言之,函数的执行过程,可以有返回值,也可以没有返回值。
好了,接下来,我们看看函数可以设置多少个参数。
我们KFC餐厅在刚开业的时候,因为其他原因,只能为每位顾客提供汉堡、饮料、小食三种食品。
如果写成函数,这个函数就有3个参数。
我使用hamburger、drink、snacks作为汉堡、饮料、小食的参数运行一下下面代码,观察终端里的效果。
编程题
在这里,我们设置了默认参数snacks='蛋挞',在调用函数的时候,蛋挞也会默认添加到菜单中。
当然了,如果有的顾客不想吃蛋挞,他就想吃薯条怎么办。
那就按顾客的来,顾客是上帝嘛。
运行一下下面代码,观察终端里的效果。
在调用函数时,参数一一传递;在第三次调用函数menu('培根烤鸡腿堡','橙汁','薯条')时,‘薯条‘会替换默认的参数’蛋挞‘,将snacks设置为’薯条‘。
了解完默认参数,我们接着往下看。
后来,我们的餐厅经营越来越大,食品种类越来越多,但是每个人点餐的种类又不确定,我们又不能限制顾客点餐。
这时候就需要使用【不定长参数】。
它的格式比较特殊,先运行一下下面代码,观察终端里的效果。
defmenu(*food):
returnfood
order1=menu('香辣鸡腿堡','可乐')
order2=menu('卤肉饭','老北京鸡肉卷','雪碧','可乐')
order3=menu('烤串','火锅','培根烤鸡腿堡','橙汁','薯条','甜筒')
print(order1)
print(order2)
print(order3)
print(type(order1))
print(type(order2))
print(type(order3))
在调用函数时,参数一一传递;在第三次调用函数menu('培根烤鸡腿堡','橙汁','薯条')时,‘薯条‘会替换默认的参数’蛋挞‘,将snacks设置为’薯条‘。
了解完默认参数,我们接着往下看。
后来,我们的餐厅经营越来越大,食品种类越来越多,但是每个人点餐的种类又不确定,我们又不能限制顾客点餐。
这时候就需要使用【不定长参数】它的格式比较特殊,先运行一下下面代码,观察终端里的效果。
代码解读:
这里使用一个星号*加上参数名就接收到了所有参数,无论参数写几个,都能接收到。
而返回值就是参数名。
我们将返回的内容打印出来,又打印了一下返回值的类型:
Tuple叫做元组,元组的写法是将所有内容放在小括号中,使用逗号隔开,和列表用法类似。
但是又与列表不同,列表中的元素可以更改,而元组中的元素不可以更改。
和列表相同的是:
元组也是可以遍历的对象。
使用for循环遍历一下。
运行一下下面代码,观察终端里的效果编程题1
foriinfood:
print('点餐内容:
'+i)
menu('香辣鸡腿堡','可乐')
menu('卤肉饭','老北京鸡肉卷','雪碧','可乐')
enu('烤串','火锅','培根烤鸡腿堡','橙汁','薯条','甜筒')
使用for循环,将元组中的内容遍历出来。
一一显示。
我们研究一下常用的print()函数,翻看了一下Python宝典,其中是这样介绍print()函数的。
代码片段
print(*objects,sep='',end='\n',file=sys.stdout,flush=False)
我们可以看到,print()函数中第一个参数objects带了*号,是不定长参数——这也就是print()函数可以传递任意数量的参数。
现在,你掌握了函数参数的不同形态,以后视具体需要,来设置函数参数。
函数,不仅可以支持多个参数,还可以支持多个返回值。
接下来我们就讲讲如何使用return语句返回多个返回值。
回到我们的KFC餐厅,我们要优惠活动,到店顾客,只要买单我们就有美食相送。
具体规则:
用户消费满69元,我们随机赠送10元食品一份;用户消费满99元,我们随机赠送10元食品一份外加一个冰激淋。
代码已经写好了,先运行一下下面代码,观察终端里的效果。
编程题main.py
importrandom
foodten=['蛋挞','鸡翅','薯条']
deforder(money):
ifmoney>99:
a=random.choice(foodten)
returna,'冰激淋'
elif69b=random.choice(foodten)
returnb
else:
return'不好意思,您的消费达不到优惠活动'
print(order(50))
print(order(70))
print(order(130))观察代码:
代码片段
importrandom
foodten=['蛋挞','鸡翅','薯条']
deforder(money):
ifmoney>99:
a=random.choice(foodten)
在这里,有3条return语句,每条语句返回的内容都不一样,返回的数量也不一样。
这就是返回多个值returna,'冰激淋'
returnb
return'不好意思,您的消费达不到优惠活动'
在开始时候,我们说过,函数封装了独立功能,一个程序往往由多个函数来配合实现
当多函数协作运行时,就涉及到函数中一个非常重要的内容—变量作用域。
什么是变量作用域?
说白了,就是地盘问题;比如说,KFC是由哈兰·山德士老爷爷创立的,所有KFC餐厅都会听他的,他说下个月所有KFC要供应烤串,这肯定没问题;但是他如果去要求麦当劳餐厅,估计就没人理他了;但是如果特朗普说,所有的KFC与麦当劳餐厅都要卖“兰州拉面“,KFC与麦当劳肯定得卖,谁让他是美国总统呢。
我们把这个问题用代码写出来
先运行一下下面代码,观察终端里的效果。
(报错后点击【跳过本题】)
编程题
main.py
trump='所有餐厅都要卖【兰州拉面】'
defKFC():
harland='所有KFC餐厅卖烤串'
print('KFC餐厅:
%s'%trump)
print('KFC餐厅:
%s'%harland)
defMcDonald():
print('麦当劳餐厅:
%s'%trump)
print('麦当劳餐厅:
%s'%harland)
KFC()
McDonald()
看代码感觉很美,运行代码就会发现报错喽。
运行KFC()函数没有任何问题;运行McDonald()函数就报错了;
给我们弹出一个bug,在print('麦当劳餐厅:
%s'%harland)这句代码中,抛出【NameError:
name'harland'isnotdefined】的错误。
这就是变量的作用问题:
作用域分为全局作用域和局部作用域。
全局作用域:
在所有函数之外赋值的变量,可以在程序任意位置使用(全局作用域),这就是全局变量;比如第一行的trump='所有餐厅都要卖【兰州拉面】';它在KFC()与McDonald()两个函数中都起作用。
局部作用域:
在某个函数内部赋值的变量,只能在当前函数内使用(局部作用域),出了这个函数,它就不起作用了,这就是局部变量;比如harland='所有KFC餐厅卖烤串';它只在KFC()函数中起作用,在McDonald()就不起作用了。
可是,如果,我非让KFC的哈兰·山德士老爷爷说话在麦当劳管用怎么办?
也就是非要让harland='所有KFC餐厅卖烤串',在麦当劳中起作用怎么办
有办法,在harland='所有KFC餐厅卖烤串'使用global对变量进行修饰,global表示全局意思,它就告诉计算机,这个变量变成了全局变量,它在任何地方都起作用。
globalharland好了global修饰词就学到这里。
下面,我们看一下最常用的函数嵌套。
3.2函数嵌套
其实,我们都见过函数嵌套,比如:
print(len('我爱你'))、print(type(10))
这就是print()函数嵌套了len()函数,print()函数嵌套了type()函数;这样,代码会先运行print()括号内的函数,再将这个函数结果放到print()函数中执行,打印出来。
这样操作,叫做在函数内部调用其他函数,我们自己定义的函数也可以这么做。
defhello():
print('欢迎光临KFC')
print('很高兴为您服务')
deforder():
print('这里是下单中心')
hello()
print('请您点餐')
print('以上菜单的菜品都有')
order()
在这里,我定义了两个函数,函数hello()与函数order(),在函数order()中调用了函数hello(),这样函数hello()中的代码会在函数order()中运行。
这就是函数的嵌套,在一个函数中调用其他函数。
讲到这儿,是不是都饿了。
那就快去KFC吧,但是不要去KFC点拉面哦。
下节课带大家利用函数来解决项目问题。
下节课见。