函数
目的就是函数(function)。function这个单词,有功能的含义,所以函数其实是实现了一种功能。
python语句构成函数。函数的一个功能在于封装和复用。
封装:通过函数的语法,我们把好多的语句放在一起,并且给他们起了名字(函数名),从而把语句封装成函数。
#func1对line3-line5进行了封装
def func1(a,b,c):
print(a)
print(b)
print(c)
复用:也就是反复使用。
如果你要反复使用一个代码片段,没有函数的话,你要不断复制粘贴,工作量很大,更严重的问题,在于,如果你对这个代码片段做出修改的话,那么每一个你粘贴的地方都需要修改,要是你忘了一处怎么办?!
这个就叫做可维护性极差。
而有了函数,你不是封装了代码片段吗,你只需要在封装处进行修改,那么各个地方就可以正确使用啦。是不是很神奇呢!
所以说,封装是复用的基础。
黑盒子(函数)
当我们提到函数时候,你应该首先在脑海中浮现出一个黑盒子。因为是黑盒子,所以它里面的东西你是看不到的。这个盒子就是函数,盒子的名字,就是函数名。盒子里面,就是就是代码片段。
下面,我们引入函数的正式定义:
函数:一段可以直接被另一段程序引用的程序。也叫做子程序、(OOP中)方法。
一段:意味着是代码片段,具体代码片段是什么,我们在黑盒子阶段并不关心。
引用:也就是函数调用,后面我们将会给大家介绍。一个函数内部的代码片段可以调用其它函数,被调用的函数就叫做子函数,这个形式类似于条件嵌套。
方法:当一个函数在类中声明时,它就成为了这个类的方法(method)。类的概念后面会详细跟大家讲。
OOP中方法:面向对象程序设计(Object Oriented Programming)的一种方法,我们后面在讲解类的知识点时会体会到。
如果可以,请你用自己的语句说下你对函数的理解。
制造一个黑盒子(声明函数)
怎么制造一个黑盒子呢?也就是怎么声明或者说怎么定义一个函数呢?
我来举个例子:
def greet(name):
print(name+'早上好')
return
line1:def关键字表示开始定义函数,greet是函数名,name叫做函数的参数
line2和line3是函数内部的代码片段。其中line2输出了一句话,
line3 return表示函数返回,也就是函数结束的意思。
从黑盒子角度来看,我们知道了这个盒子叫做greet,盒子期待着一个参数,参数名称是name,盒子没有返回数据(即return后面没内容),用行话讲,叫做函数返回了None。
到这里,你就得到了一个黑盒子。
函数名:最好是取体现函数功能的名字,一般用小写字母和单下划线、数字等组合
def greet(name):
参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同
规范:括号是英文括号,后面的冒号不能丢
print(name+'早上好')
函数体:函数体就是体现函数功能的语句,要缩进,一般是四个空格
函数的参数可以有一个,也可以有两个,也可以有很多个。也可以没有。
def pika1():
print('我最喜爱的神奇宝贝是皮卡丘')
比如pika1这个函数就是没有参数的,但是它依然是一个函数。
怎么使用黑盒子(调用函数)
声明一个函数后,如果使用它,也就是怎么调用它呢?
如果你声明函数而不调用函数,那相等于挣了很多钱,但是不花钱一样。
python里面调用函数很简单,输入函数名和参数的值就可以:
函数名.()
看以下实例:
#我们把name叫做形参,形式参数
def pika2(name):
print('我最喜爱的神奇宝贝是'+name)
#我们把'皮卡丘',喷火龙叫做实参,实际参数
pika2('皮卡丘') #调用函数,输入函数名pika()并输入参数'皮卡丘'
pika2('喷火龙') #调用函数,输入函数名pika()并输入参数'喷火龙'
这个例子想和大家讲的是:调用函数最关键的是,弄清楚函数有多少个参数,如何给参数赋值。这个过程,用行话讲,叫“传参”。
形参是变量名,声明函数时使用,实参是变量值,调用函数时使用。请严格区分这两个概念。
举个复杂一些的例子:
def process_response(request, response, spider):
# Called with the response returned from the downloader.
# Must either;
# - return a Response object
# - return a Request object
# - or raise IgnoreRequest
return response
process_response(123,456,789)
这个函数process_response有3个参数,分别是request,response,spider。
传参时候就需要按照顺序把这3个参数传递进去,从而调用函数。
所以,你只要把函数想象成黑盒子,把黑盒子叫什么名字,期待什么输入搞明白,再复杂的函数也难不倒你!
关于参数
无参数函数
def a(): #定义一个函数,无任何参数
print(123)#函数体,执行函数内的语句
a() #调用函数,只有调用后程序才会去运行函数
有形式参数函数
def a(c): #定义一个函数,有一个形式参数
print(c)#函数体,执行函数内的语句,记得要缩进
a(99) #调用函数一定要写入实际参数,这里写入了99
如果函数里有形式参数,那么调用时一定要写上参数,否则会报错。
带有默认参数
def a(c,d=100): #定义一个函数,有一个形式参数,一个默认参数
print(c+d)#函数体,执行函数内的语句
a(99) #调用函数,只有调用程序才会运行函数
注意,默认参数一定要放在最后。
def a(c,d=100): #定义一个函数,有一个形式参数,一个默认参数
print(c+d)#函数体,执行函数内的语句
a(99,1) #调用函数,只有调用程序才会运行函数
注意,当输入了两个参数时,第二个参数会覆盖默认参数。
不定参数
def a(*e): #定义一个函数,有一个形式参数
print(e)#函数体,执行函数内的语句
a(99,1,100,200) #调用函数,只有调用程序才会运行函数
打印出 (99, 1, 100, 200)