那么在进行函数学习之前,我们首先得来了解一下什么是函数

简单地说,函数就是编程语言中存在的一个模块,他是组织好的,可以重复使用的,用来实现单一功能的代码。

函数function()括号里跟的是函数的参数。参数指向的是函数要接受,要处理的数据,除了Python自带的常见的函数之外,比如input(),print(),range()等等,还包括有我们根据我们自身的需要设计出来的能解决我们自身问题的函数。

在编写函数的时候,需要了解函数的基本语法。

按照我们刚刚的思路,我们来设计一个y=3x+5的函数,然后我们再来看看,每一部分的含义。

def math(x):y=3*x+5return y

第1行:def的意思是定义(define),math是【函数名】(自己取的),再搭配一个英文括号和冒号,括号里面的x是参数(参数名也是自己取)。

第2行:def下一行开始缩进的代码就是函数要实现的功能,也叫【函数体】。这里的功能就是:根据x计算出一个值y。

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

定义函数的语法并不难,但有些注意事项一开始要特别注意才能少踩坑,我将其标记在下面代码块的注释里,请你仔细阅读下。

 函数名:1. 名字最好能体现函数的功能,一般用小写字母和单下划线、数字等组合2. 不可与内置函数重名(内置函数不需要定义即可直接使用)
def math(x):参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同规范:括号是英文括号,后面的冒号不能丢y = 3x + 5函数体:函数的执行过程,体现函数功能的语句,要缩进,一般是四个空格return yreturn语句:后面可以接多种数据类型,如果函数不需要返回值的话,可以省略。

定义函数只是将函数的内部功能封装起来(组织好),它们就像是神奇宝贝里的精灵球,安静地待着,只有听见你的召唤时才会出场,为你所用。

那么该怎么调用函数呢,让它发挥作用呢?很简单,就是输入函数名和参数所对应的值,这个过程在函数里叫作参数的传递(pass)。

def math(x):
y =  x ** 2 + x
return y
a = math(10)
print(a)

math(10)的意思是将整数10赋值给参数x并运行该函数。函数执行完毕后最终返回了y的值即110,然后将这个结果赋值给变量a,再用print()将变量a打印出来。

目前看到的都是结构最基本的函数,目的是为了先让大家有个基本概念。函数还有许多更加复杂的形式,我们会在下一部分讲解。

我们之前接触过的len()函数是Python的内置函数,功能之一是可以返回字符串的长度。那么,我们可不可以自己写一个具有相同功能的函数呢?

答案是肯定的,这里提供一个实现思路,1. 设置一个初始为0的计数器;2.遍历字符串,每遍历一次,计数器加一;3.返回计数器的值。

def my_len(words):counter = 0for i in words:counter = counter + 1return countera = '三根皮带,四斤大豆'
print(my_len(a))

函数的进阶使用
前面我们提到,设置与传递参数是编写函数的重点。而善解人意的Python呢,支持非常灵活的参数形态,从0个参数到多个参数都可以实现。
参数类型这一部分,我会主要介绍函数中常见的位置参数、默认参数和不定长参数。接下来,我会用一个场景将例子串起来,这个场景就在本关标题里 —— 深夜食堂营业记!深夜食堂,开张!

def opening():  print('总有一种味道能温暖你~')print('深夜食堂正式开业啦!')print('欢迎来自五湖四海的你前来品尝!')
opening()

我们可以看到,这里定义了一个open()函数,但是没有括号里带参数,原因是这个函数的功能是打印出固定的三句话,不需要参数的参与。

需要强调的是,即便是没有参数,我们在调用函数的时候也不能省略括号,如此例中的opening()。

在这个例子里,也不需要return语句,原因是这个函数直接在屏幕打印出内容,不需要返回值。

事实上,没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值。换句话说,有时候我们需要的只是函数的执行过程(比如打印内容),有时我们需要函数执行完毕的返回结果。

【位置参数】
好,那接下来,我们来看看有多个参数的情况。
在开业初期,为了吸引人流,你采取的策略是顾客可以任意点菜。

但因为人手不足,所以只能为每个人提供一份开胃菜和一份主食。

如果写成函数的形式,这个函数就会有两个参数。接下来我会用appetizer和course来表示开胃菜和主食~ 直接运行下面的代码就好。

def menu(appetizer, course):print('一份开胃菜:' + appetizer)print('一份主食:' + course)
menu('话梅花生','牛肉拉面')#如果采用下面这种形式传递,就不需要理会参数位置
menu(course = '牛肉拉面', appetizer = '话梅花生')

这里的’话梅花生’和’牛肉拉面’是对应参数的位置顺序传递的,所以appetizer和course被叫作【位置参数】,当有多个参数的时候,我们就必须按照顺序和数量传递,这也是最常见的参数类型。

回到这个食堂,经营一阵之后,为了吸引更多的人流,你决定给每个顾客免费送上一份甜品绿豆沙,这时候你就可以用到【默认参数】,即直接在定义函数的时候里给参数赋值。需要注意的是:默认参数必须放在位置参数之后。我们来看看代码:

def  menu(appetizer, course, dessert = '绿豆沙'):print('一份开胃菜:' + appetizer)print('一份主食:' + course)print('一份甜品:' + dessert)
menu('话梅花生','牛肉拉面')
#因为已经默认将'绿豆沙'传递给dessert,调用时无须再传递。

如果一个函数的某个参数值总是固定的,那么设置默认参数就免去了每次都要传递的麻烦。不过默认参数并不意味着不能改变,试试运行下列结果。

def menu(appetizer, course, dessert = '绿豆沙'):print('一份开胃菜:' + appetizer)print('一份主食:' + course)print('一份甜品:' + dessert)menu('话梅花生','牛肉拉面')
menu('话梅花生','牛肉拉面','银耳羹')
#银耳羹对应参数dessert

一个萝卜一个坑,因为前两个位置参数已经有对应的值传递,Python会自动将’银耳羹’传递给参数dessert,替换了默认参数的默认值。

后来呢,盛夏来袭,你觉得卖烧烤是个不错的主意。但问题是每个人点的烤串数量都不同,你也不能限定死数量,这时候【不定长参数】就能派上用场,即传递给参数的数量是可选的、不确定的。它的格式比较特殊,是一个星号*加上参数名,它的返回值也比较特殊,我们来看看下面的例子。

def menu(*barbeque):return barbeque
order = menu('烤鸡翅','烤茄子','烤玉米')
#括号里的这几个值都会传递给参数barbeque
print(order)
print(type(order))

你会发现函数返回的是这样的结果:(‘烤鸡翅’, ‘烤茄子’, ‘烤玉米’),我们用type()函数可以知道这种数据类型叫作元组(tuple),曾在第4关的必做练习中与你打过照面。我们来稍微复习下:

元组的写法是将数据放在小括号()中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修改,但元组中的元素不可更改。和列表一样,元组是可迭代对象,这意味着我们可以用for循环来遍历它,这时候的代码就可以写成:

def menu(*barbeque):for i in barbeque:print('一份烤串:' + i)menu('烤香肠', '烤肉丸')
menu('烤鸡翅', '烤茄子', '烤玉米')
不定长参数可以接收任意数量的值一份烤串:烤香肠
一份烤串:烤肉丸
一份烤串:烤鸡翅
一份烤串:烤茄子
一份烤串:烤玉米

比如说我们最熟悉的print()函数,它完整的参数其实是长这样的:

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

可以看到第一个参数objects带了*号,为不定长参数——这也是为什么print()函数可以传递任意数量的参数。其余四个为默认参数,我们可以通过修改默认值来改变参数,对比一下下列代码的输出结果。

print('金枪鱼', '三文鱼', '鲷鱼')
print('金枪鱼', '三文鱼', '鲷鱼', sep = '+')
# sep控制多个值之间的分隔符,默认是空格
print('金枪鱼', '三文鱼', '鲷鱼', sep = '+', end = '=?')
# end控制打印结果的结尾,默认是换行)

返回多个值函数,不仅可以支持输入多个参数,而且也可以同时输出多个值吗?
接下来,我们就来讲讲如何用return语句来返回多个值。依旧回到我们的食堂,后来你决定推出不定额的优惠券,到店顾客均可参与抽奖:5元以下随机赠送一碟小菜,5-10元随机赠送一碟餐前小菜和一个溏心蛋。那么代码就可以写成这样(注:随机功能我们可以用random模块中的random.choice()函数来):

import random
#引入random模块
appetizer = ['话梅花生','拍黄瓜','凉拌三丝']
def coupon(money):if money < 5:a = random.choice(appetizer)return aelif 5 < money < 10:b = random.choice (appetizer)return b, '溏心蛋'
print(coupon(3))
print(coupon(6))
print(type(coupon(6)))
#没错,<class 'tuple'>表示返回的数据类型又是我们刚才提到的元组。在这个例子中,该元组是由两个元素构成的。

可以看到:要返回多个值,只需将返回的值写在return语句后面,用英文逗号隔开即可。

多个函数间的配合
开头的时候,曾提到过在实际编程中,我们会用函数来封装独立的功能,所以一个程序往往是通过多个函数的配合来实现的。当多个函数同时运行时,就涉及函数中一个非常重要的概念 —— 变量作用域。

什么是变量作用域呢?我们还是先来看看一个例子。月底了,身为老板的你要核算成本来调整经营策略,假设餐馆的成本是由固定成本(租金)和变动成本(水电费 + 食材成本)构成的。那么我们可以分别编写一个计算变动成本的函数和一个计算总成本的函数,请阅读下列代码:

rent = 3000
def cost():utilities = int(input('请输入本月的水电费用'))food_cost = int(input('请输入本月的食材费用'))variable_cost = utilities + food_costprint('本月的变动成本费用是' + str(variable_cost))def sum_cost():sum = rent + variable_costprint('本月的总成本是' + str(sum))
cost()
sum_cost()
##在此处,运行后
可以发现第一个函数cost()运行没有问题,报错信息指出问题出在sum_cost()函数内的变量variable_cost没有被定义。这就涉及一个变量作用域的问题:程序中的变量并不是在哪个位置都可以被使用的,使用权限决定于这个变量是在哪里赋值的。关于这个概念,目前我们只需要掌握下面两点即可:第一点:一个在函数内部赋值的变量仅能在该函数内部使用(局部作用域),它们被称作【局部变量】,如cost()函数里的variable_cost。第二点:在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们被称作【全局变量】,如第一行的rent。

在这个例子中,变量rent是在函数外被赋值的,所以它是全局变量,能被sum_cost()函数直接使用。而变量variable_cost是在cost()函数内定义的,属于局部变量,其余函数内部如sum_cost()无法访问。事实上,当cost()函数执行完毕,在这个函数内定义的变量都会"消失”。

那要怎么解决“局部变量”和”全局变量“之间的矛盾呢?有几种方法可供参考,
第一种方法最取巧:把局部变量都放在函数外,变成全局变量。还是以上面的代码为例:

那有没有一个能在函数内修改的方法呢?这时候global语句就能派上用场了,它可以将局部变量声明为全局变量,仔细看第四行代码。

rent = 3000
def cost():global variable_costutilities = int(input('请输入本月的水电费用'))food_cost = int(input('请输入本月的食材费用'))variable_cost = utilities + food_costprint('本月的变动成本是' + str(variable_cost))
def sum_cost():sum = rent + variable_costprint('本月的总成本是' + str(sum))cost()
sum_cost()

global语句一般写在函数体的第一行,它会告诉Python,“我希望variable_cost是个全局变量,所以请不要用这个名字创建一个局部变量”。所以sum_cost()函数内部现在可以直接使用声明后的全局变量variable_cost。

global语句我们就学到这。要实现函数间变量的相互传递,还有一种更常用的方法就是利用函数的嵌套,这也是这一关最后的知识点啦。

函数的嵌套

事实上,函数的嵌套我们并不陌生,最简单的例子就是print(len(‘我和你’)),这里就是print()嵌套了len(),Python会先执行len()函数,得到一个返回值,再由print()打印出来。依葫芦画瓢,我们定义的函数也可以这样操作,即在一个函数内部调用其他函数,那么刚刚的例子就可以写成:

ost()函数运行结束后会返回变量variable_cost,而sum_cost()函数内部调用了cost(),所以调用sum_cost()的时候,cost()函数也会执行,并得到返回值variable_cost。sum = rent + cost() 的结果就是sum = rent + variable_cost。最后调用函数时,也只需调用sum_cost()即可。接下来我们再来看个例子:计算完成本之后,就是数数赚了多少钱的时候了!假设你想算出这个月的利润增长率,公式应该是:本月利润增长额 / 上月利润 * 100%因为除数不能为0,为了使程序不报错,我们可以加进一些异常处理机制:当除数为0的时候重新输入数值。请你阅读下面三个函数,弄明白当调用main()主函数的时候,程序是怎么运行的:

以看到,div()函数会计算并返回利润率,warning()函数是打印出一句提示,它们都被嵌套在main()主函数里,当满足不同的条件时,这两个子函数会被调用。所以虽然定义了三个函数,但最后只需调用main()函数即可。有些学员可能还是会疑惑:代码不是从上往下一行一行执行吗,为什么不是依次执行div(),warning(),main()呢?老师在此再强调一下,def语句后的代码块只是封装了函数的功能,如果没有被调用,那么def语句后面的代码永远不会被执行。这里的调用语句是main(),所以会直接执行main()函数里的代码,我们可以结合注释来看下这段代码的执行顺序:(按箭头所标的序号)

展示一下自己的最终结果

撒花,哈哈。

风变编程Python9 函数的学习相关推荐

  1. 风变编程python网址_风变编程:职场学习Python的重要性

    文章来源风变编程官方账号,侵删谢谢. 近年来,随着人工智能的飞速发展,作为人工智能第一编程语言的Python越来越热门,国家政策方面开始推广编程教育,不少企业在招聘条件中都列出了"具备Pyt ...

  2. python风变编程知乎_风变编程Python小课学习之旅

    先说说我是怎样与Python结缘的吧,我之前一直就职在互联网公司,是负责公司品牌设计的,已从事设计工作十余年了,也是到了一个瓶颈期,过去的知识已经快跟不上时代的发展,想给自己充充电,拓展一下知识.在今 ...

  3. 风变编程的python课程怎么样-风变编程的Python这么火,零基础可以自学吗?

    随着人工智能技术的高速发展,简单轻快的脚本语言Python开始受到全民热捧,成为大势所趋.而对处于数字化时代的人们而言,除了基本应用外,也要通过学习基本编程调用智能科技产品的API接口.毫无疑问,Py ...

  4. python编程可以自学么-风变编程的Python这么火,零基础可以自学吗?

    随着人工智能技术的高速发展,简单轻快的脚本语言Python开始受到全民热捧,成为大势所趋.而对处于数字化时代的人们而言,除了基本应用外,也要通过学习基本编程调用智能科技产品的API接口.毫无疑问,Py ...

  5. 风变编程python第一关脸黑怪我喽_风变编程:Python适合编程初学者学习吗?

    来源标题:风变编程:Python适合编程初学者学习吗? 据百度大数据统计每月有4260705的用户在百度检索Python相关介绍,在大众周围,也总是充斥着各种如何学习Python的声音,许多人已经对于 ...

  6. 风变编程python第一关_风变编程【学习笔记】,第8关学习心得及代码扩展

    新手入门学习python   过程必定有很多疑惑和不理解的地方 我会慢慢更新前8关和后面课程的学习笔记及心得,争取用我自己踩过的雷和出现错误的地方,给大家提个醒 第8关,没有很多知识点,主要是告诉大家 ...

  7. python适合自学编程吗-风变编程:Python适合编程初学者学习吗?

    据百度大数据统计每月有4260705的用户在百度检索Python相关介绍,在大众周围,也总是充斥着各种如何学习Python的声音,许多人已经对于是否"应该学习Python"也都发表 ...

  8. 风变编程python26_风变编程学习Python的切身体会

    温故而知新,可以为师矣 Hi,很开心跟大家一起度过一段白天上班.晚上学习的日子,在这段时间里非常感谢热情的教导员和同学们,同时也感谢风变编程为我们提供了一顿编程的饕餮盛宴. 初识Python还是两年前 ...

  9. python风变编程是骗局吗-风变编程:Python适合编程初学者学习吗?

    [天极网IT新闻频道]据百度大数据统计每月有4260705的用户在百度检索Python相关介绍,在大众周围,也总是充斥着各种如何学习Python的声音,许多人已经对于是否"应该学习Pytho ...

最新文章

  1. 人民币升值与美元贬值
  2. LeetCode 743. Network Delay Time
  3. RegExp:正则表达式对象 || Global对象
  4. logic.c:1:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘’ token...
  5. html在线拖拽环绕,jQuery实现html元素拖拽
  6. python代码性能分析_使用memory_profiler对代码进行性能分析会增加执行时间
  7. 多媒体视频知识入门贴zt(二)
  8. 现代软件工程 教学计划 中国科学技术大学-微软亚洲研究院联合培养班
  9. .NET、C#和ASP.NET三者之间的区别与联系
  10. Python编程中一定要注意的那些“坑”(一)
  11. 触发效果当容器的可见性改变时
  12. iptables 之 REJECT 与 DROP 对比
  13. 利用 mount 指令解决 Read-only file system的问题
  14. 动态时间归整/规整/弯曲(Dynamic time warping,DTW)
  15. 端口冲突,可爱的8080
  16. 5分钟学会马尔科夫模型
  17. 解密Google Deepmind AlphaGo围棋算法
  18. U盘数据丢失后怎样恢复
  19. linux学习之使用piranha配置高可用集群
  20. 隐藏文件ipynb_checkpoints引起错误

热门文章

  1. 高效率实现web自动完成功能-三叉搜索树
  2. Ubuntu18.04 安装wine
  3. Mac源码安装使用OpenCV
  4. Android SystemProperties系统属性详解
  5. mysql之批量删除
  6. YOLO: Real-Time Object Detection 遇到的问题
  7. Pycharm连接Mysql问题: Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon
  8. easyui crud java_轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
  9. acm竞赛java很少_ACM比赛中JAVA的应用
  10. 禁用计算机服务,适当禁用系统服务 提升计算机运行速度