一、函数引入
与数学中的函数不同,在Python中,函数不是看上去冰冷无聊的规则和公式,而是有实打实的、有自己作用的代码。比如说当我们需要实现“打印”这个功能,我们会用到print()
;当我们需要实现“获取数据长度”这个功能,我们会要到len()
。这些都是设定好了,可以直接拿过来就用的功能,这就叫做“组织好的代码”。函数(Function)能实现的功能从简单到复杂,各式各样,但其本质是相通的:“喂”给函数一些数据,它就能内部消化,给你“吐”出你想要的东西。这就像自动贩卖机,只不过贩卖机是喂点钱,吐出来一些吃的喝的用的东西;而Python函数则是喂各种各样的数据,吐出来各种各样的功能。
二、常用python函数
你会发现图片里的函数后面都跟了个括号。而括号里放的东西,也就是我们需要输入的数据,它在函数中被称作【参数】。【参数】指向的是函数要接收、处理怎样的数据。
比如print()
函数的括号里可以放不同的参数,根据你放的参数不同,print()
函数会帮你在屏幕上显示不同的内容。
三、函数的格式
1、函数的概念:
函数是组织好的、可以重复使用,用来实现单一功能的代码
(还是用贩卖机来打比方,贩卖机是设定好可以直接使用(组织好的),可以重复上架售卖不同的物品(重复使用),功能是卖东西(单一功能)。
而函数呢?以print()函数为例,它也是设定好可以直接使用(组织好的),不论你想打印什么参数都可以(重复使用),而print函数能实现的单一功能就是“打印”。
2、定义和调用函数
1)定义函数的语法
举例:
定义一个打招呼的函数
![](https://img2018.cnblogs.com/blog/1223122/201903/1223122-20190322200655299-603010678.png)
说明:(打招呼的英文是greet,你写say_hello或别的也行,其实理论上你随便起什么都可以,但别人也看得懂是最好的啦。)
解读函数:
第1行:def的意思是定义(define),greet是【函数名】(自己取的),再搭配一个括号和冒号,括号里面的name是参数(参数名也是自己取)。
第2行:def下一行开始缩进的代码是函数要实现的功能,也叫【函数体】。这里的函数体展现出的功能就是:打印出“name+ 早上好”这句话。
第3行:一个简单的return。函数内部一旦遇到return语句,就会停止执行并返回结果。没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值(return None可以简写为return。)所以你也会看到,我们接下来的很多例子是省略了return语句的。
函数注意事项
1、#函数名:最好是取体现函数功能的名字,一般用小写字母和单下划线、数字等组合
def greet(name):
2、#参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同
3、#规范:括号是英文括号,后面的冒号不能丢
print(name+'早上好')
4、#函数体:函数体就是体现函数功能的语句,要缩进,一般是四个空格
def pika1():
print('我最喜爱的神奇宝贝是皮卡丘')
3)有多个入参
def pika3(name,person):
print('我最喜爱的神奇宝贝是'+name)
print('我最喜爱的驯兽师是'+person)
四、函数调用
1、举例:
![](https://img2018.cnblogs.com/blog/1223122/201903/1223122-20190322201337848-141344035.png)
通过这个例子,我们明白调用函数最关键的是:得弄清楚这个函数有多少个参数,如何给参数赋值,这个过程在函数里叫做参数的传递(pass)。
但函数的作用远不仅如此,它能将复杂的语句和功能统一封装进一个函数名里,调用者只需明白函数能实现什么,根据需要传递参数即可。
2、函数的参数类型
主要的参数类型有:位置参数、默认参数、不定长参数。我会用一个案例把这些参数串起来。
1)位置参数:
def menu(appetizer,course):
print('一份开胃菜:'+appetizer)
print('一份主食:'+course+'
')
#还记得转义字符
吧,表示换行
menu('牛肉拉面','话梅花生')
menu('话梅花生','牛肉拉面')
#如果采用下面这种形式传递,就不需要理会参数位置
menu(course='牛肉拉面',appetizer='话梅花生')
2)默认参数:
![](https://img2018.cnblogs.com/blog/1223122/201903/1223122-20190322202425738-465798908.png)
#因为已经默认将'绿豆沙'传递给dessert,调用时无须再传递。
默认参数是可以改变的
如下
def menu(appetizer,course,dessert='绿豆沙'):
print('一份开胃菜:'+appetizer)
print('一份主食:'+course)
print('一份甜品:'+dessert)
menu('话梅花生','牛肉拉面')
menu('话梅花生','牛肉拉面','银耳羹')
#银耳羹对应参数dessert
3、不定长参数
盛夏来袭,你觉得卖烧烤是个不错的主意。但问题是每个人点的烤串数量都不同,你也不能限定死数量,这时候【不定长参数】就能派上用场,即不确定传递参数的数量。
*
加上参数名,来看下面的例子![](https://img2018.cnblogs.com/blog/1223122/201903/1223122-20190322202904826-73232815.png)
你会发现输出的是这样的结果:('烤鸡翅', '烤茄子', '烤玉米')
,这种数据类型叫做元组(tuple)
默认参数也需要放在不定长参数的后面
上面的函数可以写成:
![](https://img2018.cnblogs.com/blog/1223122/201903/1223122-20190322203154627-1554929744.png)
2、返回多个参数
返回的是('李若彤的脸蛋', '林志玲的身材')
这样一个元组,对不对?又是元组。
事实上,Python语言中的函数返回值可以是多个,而其他语言都不行,这是Python相比其他语言的简便和灵活之处。一次接受多个返回值的数据类型就是元组。
最后需要再强调的是,没有return语句的函数会默认返回None值。
return还有一个“副作用”:一旦函数内部遇到return语句,就会停止执行并返回结果。
![](https://img2018.cnblogs.com/blog/1223122/201903/1223122-20190322205727368-322875680.png)
3、总结return
![](https://img2018.cnblogs.com/blog/1223122/201903/1223122-20190322205814121-187558095.png)
六、变量作用域
第一点:在一个函数内定义的变量仅能在函数内部使用(局部作用域),它们被称作【局部变量】。
第二点:在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们叫【全局变量】
第一个输出为 88,第二个x为99
注意:
虽然变量的名字相同(都是x),但因为全局变量和局部变量处在不同的“作用域”中,所以它们彼此井水不犯河水,都能打印出相应的结果。
但为了让程序更易读以及避免可能会出现的麻烦,建议局部变量和全局变量【不要】取相同的名字,以免混淆。
你可以将定义的函数想象成一个私人房间,所以里面存数据的容器(变量)是私有的,只能在个人的房间里使用;而在函数外存数据的变量是公用的,没有使用限制。
全局作用域中的代码中也不能使用任何局部变量,在函数内部的局部作用域,是可以访问全局变量的。
局部变量转换为全局变量
global
![](https://img2018.cnblogs.com/blog/1223122/201903/1223122-20190322211618553-1408495853.png)