重点
def my_len(words): counter = 0 for i in words: counter = counter + 1 return counter a = ‘三根皮带,四斤大豆’ print(my_len(a)) 这段代码定义了一个名为my_len
的函数,用于计算字符串的长度。函数接受一个参数words
,通过遍历words
中的每个字符并计数,最后返回计数值。在代码的最后,将字符串’三根皮带,四斤大豆’作为参数传递给my_len
函数,并打印结果。
输出结果为:10
在给定的代码片段中,counter
是一个变量,用于追踪字符串中字符的数量。在函数my_len
中,counter
被初始化为0,然后对于字符串words
中的每个字符,counter
的值都会增加1。这样,当遍历完成时,counter
的值就等于字符串的长度。
在数学术语中,counter
可以被视为一个计数器,它是一个整数变量,用于记录循环迭代的次数或某个特定事件的发生次数。在这个上下文中,counter
是用来计算字符串中字符的数量。
在提供的示例代码中,counter
最终的值是字符串’三根皮带,四斤大豆’的长度,即10个字符(包括中文字符和标点符号)。
:
没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值。
v
len
分行
\n
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, '溏心蛋'
print(coupon(6))
print(type(coupon(6)))
——返回 1或2
这段代码定义了一个名为coupon
的函数,该函数接受一个参数money
。根据money
的值,函数会返回不同的结果。如果money
小于5,函数会从appetizer
列表中随机选择一个元素并返回;如果money
大于等于5且小于10,函数会从appetizer
列表中随机选择两个元素并返回。
在最后两行代码中,调用了coupon(6)
函数并将结果打印出来。然后使用type()
函数获取返回值的类型并将其打印出来。
——同
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)
result是一个元组
这段代码定义了一个名为coupon
的函数,该函数接受一个参数money
。根据money
的值,函数会返回不同的结果。如果money
小于5,函数会从appetizer
列表中随机选择一个元素并返回;如果money
大于等于5且小于10,函数会从appetizer
列表中随机选择两个元素并返回。
在最后一行代码中,调用了coupon(6)
函数并将结果赋值给变量result
。
由于money
的值为6,所以result
将是一个包含两个元素的元组,第一个元素是从appetizer
列表中随机选择的一个元素,第二个元素是字符串’溏心蛋’。
?? dish, egg = coupon(7) # 元组的两个元素分别赋值给变量dish和egg print(dish) print(egg) : 这段代码定义了一个名为
coupon
的函数,该函数接受一个参数money
。根据money
的值,函数会返回不同的结果。如果money
小于5,函数会从appetizer
列表中随机选择一个元素并返回;如果money
大于等于5且小于10,函数会从appetizer
列表中随机选择两个元素并返回。
在最后两行代码中,调用了coupon(7)
函数并将结果赋值给变量dish
和egg
。
由于money
的值为7,所以dish
将是从appetizer
列表中随机选择的一个元素,
egg
将是字符串’溏心蛋’。然后分别打印出dish
和egg
的值。
def
部分
rent = 3000
utilities = int(input('请输入本月的水电费用'))
food_cost = int(input('请输入本月的食材费用'))
variable_cost = utilities + food_cost
# 以上均为全局变量
print('本月的变动成本是' + str(variable_cost))
def sum_cost():
sum = rent + variable_cost
print('本月的总成本是' + str(sum))
sum_cost()
这段代码的功能是计算本月的总成本。
首先,它定义了一个全局变量rent
,然后通过input()
函数获取用户输入的水电费用和食材费用,并将它们相加得到变动成本variable_cost
。接着,定义了一个名为sum_cost
的函数,该函数将rent
和variable_cost
相加得到总成本,并打印出来。最后,调用sum_cost()
函数执行计算。
全局变量
调用函数
内容
2 练习 - 年终奖有多少? 嘿,一日不见如隔三秋!今天的你有更热爱敲代码了吗? 在上一关的思维课中,我们学会了如何正确面对编程中的两大瓶颈,希望大家在学习过程中遇到难题时要心平气和,相信办法总比困难多,坚持就是胜利。 话不多说,让我们继续一往无前的Python学习之旅吧! 这两关的任务是要带大家认识一个熟悉的“陌生人” —— 函数。之所以这么说,是因为我们在前面的课程已经接触过Python里的函数,但是对它还没有一个系统化的了解。 鉴于函数的重要性,我们会在这关掌握相关的基础知识和概念,下个关卡我们则会利用所学知识,完成一个函数的实操项目 —— 工时计算小程序。 今天的内容可分成三个部分: 你一定好奇这和标题中的深夜食堂有什么关系,别急,我会在第二部分揭晓谜底哈~初识函数
首先呢,在学习具体知识前,我想和大家简要介绍下函数的作用,来帮大家确立一个关于函数的整体概念。函数的作用
正如老师在课堂反复强调过,编写代码要不断追求简洁和易读。换句话说,我们要尽量避免写重复的代码,少复制粘贴,也就是所谓的DRY原则——Don’t Repeat Yourself。 前面学习过的循环是减少代码重复的一种手段,那么接下来要学习的函数则是Python里增强代码重用性最有力的工具,它的定义是: 什么意思呢?我们之前所写的代码都是立即运行且只能被执行一次,而函数可以让我们整合打包好代码,以便这些代码能够随时被复用,这样能极大地减少代码冗余。 往后,随着我们想要实现的功能越来越复杂,代码可能会有几百上千行,这样对写代码和读代码都是一个挑战。如果将一个程序用函数拆分成多个独立的子任务来完成,就会让代码结构变得清晰许多。 当然了,函数的这些妙处你得在后续的不断实践中慢慢体会。讲了这么多关于函数的好话,你是不是很好奇函数究竟长什么样呢?函数的组成
我们先不急着讲Python里的函数长什么样。我想你第一次听到这个词,大概率是在初中的数学课堂上,那就先让我们回忆下吧。y = 3x + 5是个标准的一次函数,x是自变量,3x + 5是执行过程,自变量x决定了y的输出值。
函数(Function)能实现的功能从简单到复杂,各式各样,但其本质是相通的,我们可以看作成三个部分。 在Python中,函数也是如此,“喂”给函数一些数据,它就能内部消化,执行相应的功能,最终给你“吐”出你想要的东西,就好比自动贩卖机一样。 以上“陈列的”就是我们之前接触过的Python函数,它们是Python本身就自带的函数,所以也叫内置函数,提供了许多我们常用的基本功能。 如果你眼尖的话,你还会发现图片里的函数后面都跟了个括号。 括号里放的东西,也就是我们需要输入给函数的数据,它在函数中被称作【参数】。【参数】指向的是函数要接收、处理怎样的数据(你也可以把它理解成自变量)。 比如len()函数会根据括号里放的参数的不同,输出(返回)不同的值。已完成课堂练习
重做 分享 main.py 1 #直接运行代码即可 2 a = len(‘万物的终极答案是42’) 3 print(a) 4 b = len([‘海伯利安’,’基地’,’三体’]) 5 print(b) 终端 括号里面的字符串和列表,都是len() 函数的参数。 好,现在问题来了,就像贩卖机不总是有我们想要的东西。除了Python自带的内置函数,我们能不能根据自己的需要,自己定义一个独一无二的函数呢? 答案是肯定的,下面我就来教大家如何DIY一个函数,这也是今天的重点。定义和调用函数
编写函数的第一步,我们需要去定义一个函数,我们先来看看基本语法。 照着这个语法,我们以刚刚提到的y = 3x + 5 为例子,来定义一个一次函数。 还记得我说的函数三部分吗?我们可以把这里的参数等同于输入,函数体等同于执行过程,return语句等同于输出,所以呢,这个函数可以写成这样: 1 2 3 来一起读代码。第1行:def的意思是定义(define),math是【函数名】(自己取的),再搭配一个英文括号和冒号,括号里面的x是参数(参数名也是自己取)。 第2行:def下一行开始缩进的代码就是函数要实现的功能,也叫【函数体】。这里的功能就是:根据x计算出一个值y。 第3行:return语句是返回的意思,可以指定函数执行完毕后最终会返回什么值或表达式,否则计算机是无法判断出函数最终要输出什么结果的。 定义函数的语法并不难,但有些注意事项一开始要特别注意才能少踩坑,我将其标记在下面代码块的注释里,请你仔细阅读下。 1 2 3 4 5 6 7 8 9 现在,请你根据上面的语法自己写一遍,定义一个新的函数,表达式是y = x² + x已完成课堂练习
重做 分享 main.py 1 # 提示:x ** y 表示 x的y次幂 2 def math(x): 3 y = x*x + x 4 return y 终端 老师的答案是这样子的: 1 2 3 如果终端既无报错,也没有显示任何东西,那是正常的,因为截至目前,我们只是完成了【定义函数】。 定义函数只是将函数的内部功能封装起来(组织好),它们就像是神奇宝贝里的精灵球,安静地待着,只有听见你的召唤时才会出场,为你所用。 那么该怎么调用函数呢,让它发挥作用呢?很简单,就是输入函数名和参数所对应的值,这个过程在函数里叫作参数的传递(pass)。 比如说刚刚的例子,我们希望计算出当x = 10时y的结果,注意看第五、六行的代码,然后直接运行。 已完成课堂练习 重做 分享 main.py 1 def math(x): 2 y = x ** 2 + x 3 return y 4 5 a = math(10) 6 print(a) 终端math(10)的意思是将整数10赋值给参数x并运行该函数。函数执行完毕后最终返回了y的值即110,然后将这个结果赋值给变量a,再用print()将变量a打印出来。
当然,你也可以只用一行代码print(math(10))来表示同样的意思。 现在,请你依次将20、30传递给参数x,并把返回的结果打印出来吧。 已完成课堂练习 重做 分享 main.py 1 def math(x): 2 y = x ** 2 + x 3 return y 4 print(math(20)) 5 print(math(30)) 终端 很好,现在你也知道如何调用函数了。那么,定义和调用函数的基本语法就讲得差不多了。 这里想强调一下:目前看到的都是结构最基本的函数,目的是为了先让大家有个基本概念。函数还有许多更加复杂的形式,我们会在下一部分讲解。 在继续深入了解前,我们先来做个练习巩固一下。 我们之前接触过的len()函数是Python的内置函数,功能之一是可以返回字符串的长度。那么,我们可不可以自己写一个具有相同功能的函数呢? 答案是肯定的,老师在这里提供一个实现思路,1. 设置一个初始为0的计数器;2.遍历字符串,每遍历一次,计数器加一;3.返回计数器的值。 现在,请你写出一个能计算字符串长度的函数,然后传递参数’三根皮带,四斤大豆’来调用函数,并将结果打印出来。 已完成课堂练习 重做 分享 main.py 1 def my_len(words): 2 counter = 0 3 for i in words: 4 counter = counter + 1 5 return counter 6 7 a = ‘三根皮带,四斤大豆’ 8 print(my_len(a)) 终端 老师的答案是这样子的: 1 2 3 4 5 6 7 8 9 相信对你不成问题。那么接下来呢,我会带你继续深入了解函数的应用。函数的进阶使用
前面我们提到,设置与传递参数是编写函数的重点。而善解人意的Python呢,支持非常灵活的参数形态,从0个参数到多个参数都可以实现。 想知道这是怎么实现的吗?这需要我们先来了解一下参数类型。参数类型
这一部分,我会主要介绍函数中常见的位置参数、默认参数和不定长参数。 接下来,我会用一个场景将例子串起来,这个场景就在本关标题里 —— 深夜食堂营业记!深夜食堂,开张! 已完成课堂练习 重做 分享 main.py 1 #直接运行代码即可 2 def opening(): 3 print(‘总有一种味道能温暖你~’) 4 print(‘深夜食堂正式开业啦!’) 5 print(‘欢迎来自五湖四海的你前来品尝!’) 6 7 opening() 终端 我们可以看到,这里定义了一个opening()函数,但是括号里没有带参数,原因是这个函数的功能是打印出固定的三句话,不需要参数的参与。 需要强调的是,即便是没有参数,我们在调用函数的时候也不能省略括号,如此例中的opening()。 在这个例子里,也不需要return语句,原因是这个函数直接在屏幕打印出内容,不需要返回值。事实上,没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值。 换句话说,有时候我们需要的只是函数的执行过程(比如打印内容),有时我们需要函数执行完毕的返回结果。 好,那接下来,我们来看看有多个参数的情况。 在开业初期,为了吸引人流,你采取的策略是顾客可以任意点菜。但因为人手不足,所以只能为每个人提供一份开胃菜和一份主食。如果写成函数的形式,这个函数就会有两个参数。 接下来我会用appetizer和course来表示开胃菜和主食~ 直接运行下面的代码就好。 已完成课堂练习 重做 分享 main.py 1 def menu(appetizer, course): 2 print(‘一份开胃菜:’ + appetizer) 3 print(‘一份主食:’ + course) 4 5 menu(‘话梅花生’,’牛肉拉面’) 终端 这里的’话梅花生’和’牛肉拉面’是对应参数的位置顺序传递的,所以appetizer和course被叫作【位置参数】,当有多个参数的时候,我们就必须按照顺序和数量传递,这也是最常见的参数类型。 如果不按位置顺序传递,就会闹出乌龙。请阅读下面的代码,然后点击运行。 已完成课堂练习 重做 分享 main.py 1 def menu(appetizer, course): 2 print(‘一份开胃菜:’ + appetizer) 3 print(‘一份主食:’ + course + ‘\n’) 4 #还记得转义字符\n吧,表示换行 5 6 menu(‘牛肉拉面’,’话梅花生’) 7 终端 当然,当有三个或以上的参数也是要按顺序传递,这里我就不举例了。我想位置参数是怎么一回事,你已经明白了。 回到这个食堂,经营一阵之后,为了吸引更多的人流,你决定给每个顾客免费送上一份甜品绿豆沙,这时候你就可以用到【默认参数】,直接在定义函数的时候给参数赋值。 需要注意的是:默认参数必须放在位置参数之后。我们来看看代码: 已完成课堂练习 重做 分享 main.py 1 def menu(appetizer, course, dessert = ‘绿豆沙’): 2 print(‘一份开胃菜:’ + appetizer) 3 print(‘一份主食:’ + course) 4 print(‘一份甜品:’ + dessert) 5 6 menu(‘话梅花生’,’牛肉拉面’) 7 #因为已经默认将’绿豆沙’传递给dessert,调用时无须再传递。 终端 如果一个函数的某个参数值总是固定的,那么设置默认参数就免去了每次都要传递的麻烦。不过默认参数并不意味着不能改变,试试运行下列结果。 已完成课堂练习 重做 分享 main.py 1 def menu(appetizer, course, dessert = ‘绿豆沙’): 2 print(‘一份开胃菜:’ + appetizer) 3 print(‘一份主食:’ + course) 4 print(‘一份甜品:’ + dessert) 5 6 7 menu(‘话梅花生’,’牛肉拉面’) 8 menu(‘话梅花生’,’牛肉拉面’,’银耳羹’) 9 #银耳羹对应参数dessert 终端 一个萝卜一个坑,因为前两个位置参数已经有对应的值传递,Python会自动将’银耳羹’传递给参数dessert,替换了默认参数的默认值。 了解完默认参数,我们接着往下看。 后来呢,盛夏来袭,你觉得卖烧烤是个不错的主意。但问题是每个人点的烤串数量都不同,你也不能限定死数量,这时候【不定长参数】就能派上用场,即传递给参数的数量是可选的、不确定的。 它的格式比较特殊,是一个星号*加上参数名,它的返回值也比较特殊,我们来看看下面的例子。 已完成课堂练习 重做 分享 main.py 1 def menu(*barbeque): 2 return barbeque 3 4 order = menu(‘烤鸡翅’,’烤茄子’,’烤玉米’) 5 #括号里的这几个值都会传递给参数barbeque 6 7 print(order) 8 print(type(order)) 终端 你会发现函数返回的是这样的结果:(‘烤鸡翅’, ‘烤茄子’, ‘烤玉米’),我们用type()函数可以知道这种数据类型叫作元组(tuple),曾在第4关的必做练习中与你打过照面。我们来稍微复习下: 元组的写法是将数据放在小括号()中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修改,但元组中的元素不可更改。 和列表一样,元组是可迭代对象,这意味着我们可以用for循环来遍历它,这时候的代码就可以写成: 已完成课堂练习 重做 分享 main.py 1 def menu(*barbeque): 2 for i in barbeque: 3 print(‘一份烤串:’ + i) 4 5 menu(‘烤香肠’, ‘烤肉丸’) 6 menu(‘烤鸡翅’, ‘烤茄子’, ‘烤玉米’) 7 # 不定长参数可以接收任意数量的值 终端 可能目前我们不会怎么用到不定长参数,不过了解这一个概念可以帮助我们看懂一些函数文档。 比如说我们最熟悉的print()函数,它完整的参数其实是长这样的: 1 print(*objects, sep = ‘ ‘, end = ‘\n’, file = sys.stdout, flush = False) 可以看到第一个参数objects带了*号,为不定长参数——这也是为什么print()函数可以传递任意数量的参数。其余四个为默认参数,我们可以通过修改默认值来改变参数,对比一下下列代码的输出结果。 已完成课堂练习 重做 分享 main.py 1 print(‘金枪鱼’, ‘三文鱼’, ‘鲷鱼’) 2 print(‘金枪鱼’, ‘三文鱼’, ‘鲷鱼’, sep = ‘+’) 3 # sep控制多个值之间的分隔符,默认是空格 4 print(‘金枪鱼’, ‘三文鱼’, ‘鲷鱼’, sep = ‘+’, end = ‘=?’) 5 # end控制打印结果的结尾,默认是换行) 终端 现在你明白了参数的不同形态,以后就可以视实际情况的需要,灵活设置不同的参数类型啦。返回多个值
函数,不仅可以支持输入多个参数,而且也可以同时输出多个值吗。接下来,我们就来讲讲如何用return语句来返回多个值。 依旧回到我们的食堂,后来你决定推出不定额的优惠券,到店顾客均可参与抽奖:5元以下随机赠送一碟小菜,5-10元随机赠送一碟餐前小菜和一个溏心蛋。 那么代码就可以写成这样(注:随机功能我们可以用random模块中的random.choice()函数来): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 可以看到:要返回多个值,只需将返回的值写在return语句后面,用英文逗号隔开即可。 1 2 切记!我们不能写成上面这种两行的格式,是因为函数在执行过程中遇到第一个return语句就会停止执行,所以第二个return ‘溏心蛋’永远不会被执行。 接下来我们直接运行下列的代码,看看返回的结果是什么数据类型。 已完成课堂练习 重做 分享 main.py 1 import random 2 appetizer = [‘话梅花生’,’拍黄瓜’,’凉拌三丝’] 3 def coupon(money): 4 if money < 5: 5 a = random.choice(appetizer) 6 return a 7 elif 5 <= money < 10: 8 b = random.choice (appetizer) 9 return b, ‘溏心蛋’ 10 11 print(coupon(6)) 12 print(type(coupon(6))) 终端 没错,多个函数间的配合
开头的时候,老师提到过在实际编程中,我们会用函数来封装独立的功能,所以一个程序往往是通过多个函数的配合来实现的。 当多个函数同时运行时,就涉及函数中一个非常重要的概念 —— 变量作用域。变量作用域
什么是变量作用域呢?我们还是先来看看一个例子。 月底了,身为老板的你要核算成本来调整经营策略,假设餐馆的成本是由固定成本(租金)和变动成本(水电费 + 食材成本)构成的。 那么我们可以分别编写一个计算变动成本的函数和一个计算总成本的函数,请阅读下列代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 乍一看代码好像没有什么问题,但是一旦运行,终端就会报错。请你先阅读下报错信息,我马上会来解释。 已跳过课堂练习 重做 分享 main.py 1 rent = 3000 2 3 def cost(): 4 utilities = int(input(‘请输入本月的水电费用’)) 5 food_cost = int(input(‘请输入本月的食材费用’)) 6 variable_cost = utilities + food_cost 7 print(‘本月的变动成本是’ + str(variable_cost)) 8 9 def sum_cost(): 10 sum = rent + variable_cost 11 print(‘本月的总成本是’ + str(sum)) 12 13 cost() 14 sum_cost() 终端 可以发现第一个函数cost()运行没有问题,报错信息指出问题出在第10行,sum_cost()函数内的变量variable_cost没有被定义。 这就涉及一个变量作用域的问题:程序中的变量并不是在哪个位置都可以被使用的,使用权限决定于这个变量是在哪里赋值的。关于这个概念,目前我们只需要掌握下面两点即可: 第一点:一个在函数内部赋值的变量仅能在该函数内部使用(局部作用域),它们被称作【局部变量】,如cost()函数里的variable_cost。 第二点:在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们被称作【全局变量】,如第一行的rent。 在这个例子中,变量rent是在函数外被赋值的,所以它是全局变量,能被sum_cost()函数直接使用。 而变量variable_cost是在cost()函数内定义的,属于局部变量,其余函数内部如sum_cost()无法访问。事实上,当cost()函数执行完毕,在这个函数内定义的变量都会”消失”。 那要怎么解决“局部变量”和”全局变量“之间的矛盾呢?有几种方法可供参考,第一种方法最取巧:把局部变量都放在函数外,变成全局变量。还是以上面的代码为例: 1 2 3 4 5 6 7 8 9 10 11 12 那有没有一个能在函数内修改的方法呢?这时候global语句就能派上用场了,它可以将局部变量声明为全局变量,仔细看第四行代码。 已完成课堂练习 重做 分享 main.py 1 rent = 3000 2 3 def cost(): 4 global variable_cost 5 utilities = int(input(‘请输入本月的水电费用’)) 6 food_cost = int(input(‘请输入本月的食材费用’)) 7 variable_cost = utilities + food_cost 8 print(‘本月的变动成本是’ + str(variable_cost)) 9 10 def sum_cost(): 11 sum = rent + variable_cost 12 print(‘本月的总成本是’ + str(sum)) 13 14 cost() 15 sum_cost() 终端 global语句一般写在函数体的第一行,它会告诉Python,“我希望variable_cost是个全局变量,所以请不要用这个名字创建一个局部变量”。所以sum_cost()函数内部现在可以直接使用声明后的全局变量variable_cost。 我们来做一个小练习,请你在下列代码加入global语句,让代码能够成功运行。 已完成课堂练习 重做 分享 main.py 1 def egg(): 2 global quantity 3 quantity = 108 4 5 egg() 6 print(quantity) 终端 好,global语句我们就学到这。要实现函数间变量的相互传递,还有一种更常用的方法就是利用函数的嵌套,这也是这一关最后的知识点啦。函数的嵌套
事实上,函数的嵌套我们并不陌生,最简单的例子就是print(len(‘我和你’)),这里就是print()嵌套了len(),Python会先执行len()函数,得到一个返回值,再由print()打印出来。 依葫芦画瓢,我们定义的函数也可以这样操作,即在一个函数内部调用其他函数,那么刚刚的例子就可以写成: 已完成课堂练习 重做 分享 main.py 1 rent = 3000 2 3 def cost(): 4 utilities = int(input(‘请输入本月的水电费用’)) 5 food_cost = int(input(‘请输入本月的食材费用’)) 6 variable_cost = utilities + food_cost 7 print(‘本月的变动成本是’ + str(variable_cost)) 8 return variable_cost 9 10 def sum_cost(): 11 sum = rent + cost() 12 print(‘本月的总成本是’ + str(sum)) 13 14 sum_cost() 终端 cost()函数运行结束后会返回变量variable_cost,而sum_cost()函数内部调用了cost(),所以调用sum_cost()的时候,cost()函数也会执行,并得到返回值variable_cost。sum = rent + cost() 的结果就是sum = rent + variable_cost。最后调用函数时,也只需调用sum_cost()即可。
接下来我们再来看个例子:计算完成本之后,就是数数赚了多少钱的时候了!假设你想算出这个月的利润增长率,公式应该是:本月利润增长额 / 上月利润 * 100% 因为除数不能为0,为了使程序不报错,我们可以加进一些异常处理机制:当除数为0的时候重新输入数值。 请你阅读下面三个函数,弄明白当调用main()主函数的时候,程序是怎么运行的: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 可以看到,div()函数会计算并返回利润率,warning()函数是打印出一句提示,它们都被嵌套在main()主函数里,当满足不同的条件时,这两个子函数会被调用。 所以虽然定义了三个函数,但最后只需调用main()函数即可。 有些学员可能还是会疑惑:代码不是从上往下一行一行执行吗,为什么不是依次执行div(),warning(),main()呢? 老师在此再强调一下,def语句后的代码块只是封装了函数的功能,如果没有被调用,那么def语句后面的代码永远不会被执行。 这里的调用语句是main(),所以会直接执行main()函数里的代码,我们可以结合注释来看下这段代码的执行顺序:(按箭头所标的序号) 现在,请你自己把代码打一遍,熟悉一下函数的嵌套这个用法吧~(不要偷懒复制哦!) 已完成课堂练习 重做 分享 main.py 1 def div(num1, num2): 2 growth = (num1 - num2) / num2 3 percent = str(growth * 100) + ‘%’ 4 return percent 5 6 7 def warning(): 8 print(‘Error: 你确定上个月一毛钱都不赚不亏吗?’) 9 10 11 def main(): 12 while True: 13 num1 = float(input(‘请输入本月所获利润’)) 14 num2 = float(input(‘请输入上月所获利润’)) 15 if num2 == 0: 16 warning() 17 else: 18 print(‘本月的利润增长率:’ + div(num1,num2)) 终端 呼,那么今天的课到这里就结束咯~可能你的肚子都饿了吧哈哈~ 这一关的知识点看起来不少,这是因为函数是Python里非常重要的工具!只有掌握了它,我们才有可能写出更强大的代码。 下一关,老师会带大家利用函数知识上手实操一个和实际生活有关的项目。记得先完成课后练习~ 下一关,我们不见不散! 更多练习>>>>>>
def math(x):
y = 3*x + 5
return y
# 函数名:1. 名字最好能体现函数的功能,一般用小写字母和单下划线、数字等组合
# 2. 不可与内置函数重名(内置函数不需要定义即可直接使用)
def math(x):
# 参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同
# 规范:括号是英文括号,后面的冒号不能丢
y = 3*x + 5
# 函数体:函数的执行过程,体现函数功能的语句,要缩进,一般是四个空格
return y
# return语句:后面可以接多种数据类型,如果函数不需要返回值的话,可以省略
def math(x):
y = x ** 2 + x
return y
def my_len(words):
counter = 0
for i in words:
counter = counter + 1
return counter
a = '三根皮带,四斤大豆'
print(my_len(a))
#等价于print(my_len('三根皮带,四斤大豆'))
import random
#引入random模块
appetizer = ['话梅花生','拍黄瓜','凉拌三丝']
def coupon(money):
if money < 5:
a = random.choice(appetizer)
return a
elif 5 <= money < 10:
b = random.choice (appetizer)
return b, '溏心蛋'
print(coupon(3))
print(coupon(6))
return b
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)
# result是一个元组
print(result[0])
print(result[1])
rent = 3000
def cost():
utilities = int(input('请输入本月的水电费用'))
food_cost = int(input('请输入本月的食材费用'))
variable_cost = utilities + food_cost
print('本月的变动成本费用是' + str(variable_cost))
def sum_cost():
sum = rent + variable_cost
print('本月的总成本是' + str(sum))
cost()
sum_cost()
rent = 3000
utilities = int(input('请输入本月的水电费用'))
food_cost = int(input('请输入本月的食材费用'))
variable_cost = utilities + food_cost
# 以上均为全局变量
print('本月的变动成本是' + str(variable_cost))
def sum_cost():
sum = rent + variable_cost
print('本月的总成本是' + str(sum))
sum_cost()
def div(num1, num2):
growth = (num1 - num2) / num2
percent = str(growth * 100) + '%'
return percent
def warning():
print('Error: 你确定上个月一毛钱都不赚不亏吗?')
def main():
while True:
num1 = float(input('请输入本月所获利润'))
num2 = float(input('请输入上月所获利润'))
if num2 == 0:
warning()
else:
print('本月的利润增长率:' + div(num1,num2))
break
main()
习题
练习要求
- 眼看要过年了,深夜食堂经营的不错,你打算给员工发奖金犒劳一下。请你定义函数,当输入员工姓名和工作时长两个参数,即可打印出该员工获得多少奖金。发放奖金的要求如下:
- 工作时长不满六个月,发放固定奖金500元。
- 工作时长在六个月和一年之间(含一年),发放奖金120元*月数(如8个月为960元)
- 工作时长在一年以上,发放奖金180元*月数 (如20个月为3600元)
2书写代码
- 定义两个函数:第一个函数功能为根据工作月数返回奖金额,第二个函数功能为打印出’该员工来了XX个月,获得奖金XXX元’。发放奖金的要求如下:
- 工作时长不满六个月,发放固定奖金500元。
- 工作时长在六个月和一年之间(含一年),发放奖金120元*月数(如8个月为960元)
- 工作时长在一年以上,发放奖金180元*月数 (如20个月为3600元)
- 最后传入参数(‘大聪’,14)调用第二个函数,打印结果’大聪来了14个月,获得奖金2520元’
AI:名字长
def calculate_bonus(months):
if months < 6:
return 500
elif 6 <= months <= 12:
return 120 * months
else:
return 180 * months
def print_employee_info(name, months):
bonus = calculate_bonus(months)
print(f"{name}来了{months}个月,获得奖金{bonus}元")
print_employee_info(‘大聪’, 14)
参考:
def bonus(month):
if month < 6:
money = 500
return money
elif 6 <= month <= 12:
money = 120 * month
return money
else:
money = 180 * month
return money
def info(name, month):
gain = bonus(month)
print('%s来了%s个月,获得奖金%s元' % (name, month, gain))
info(‘大聪’,14)