1、函数是组织好的,可重复使用的,用来实现单一或相关联的代码段。
2、函数括号中的表达式称之为函数的参数,函数“接受”参数并“返回”结果。
定义一个函数:
1、函数代码块以def关键字开头,后接函数标识符名称和圆括号"()",圆括号后面要加冒号":"
2、所有传入的参数和自变量都必须放在圆括号中,可以在圆括号中定义参数(默认参数)
3、函数的第一行语句可以选择性的使用文档字符串,用于存放函数说明
4、函数内容以冒号开始,并且要缩进
5、return(表达式)用于结束函数并选择性的返回一个值给调用方,不带表达式的return相当于返回None
python定义函数使用def关键字,一般格式如下:
def 函数名 (参数列表):
函数体
备注:1、函数的名字必须以字母开头,可以包括下划线"_",和定义变量一样,不能把python的关键字定义成函数的名字
2、函数体必须保持缩进一致,因为在函数中缩进结束就代表函数的结束
3、没有return语句时,函数执行完毕后也会返回结果,不过结果为None
4、定义一个什么都不做的函数(空函数)时,需要用到pass语句
def function ():
pass
function()
调用函数:
1、函数代码块以def关键字开头,后接函数标识符名称和圆括号。定义一个函数:给了函数一个名称,指定了函数里面的参数和代码块后就可以通过函数本身来调用:直接写出函数名加括号
2、调用函数时必须带上参数
def area(width,height):
return width * height
def say_hello(name):
print(name," say hello to you ")
width = 5
height = 4
area_1 = area(width,height) #此处将函数的输出赋值给一个变量
print(say_hello("jay"))
print(area((width,height)) #直接输出函数结果
print(area_1)
函数的参数:
调用函数时经常使用的参数类型有以下几种:1、必须参数
2、关键字参数
3、默认参数
4、可变参数
5、组合参数
一、 必须参数:必须传入对应正确个数的参数
必须参数必须以 正确的顺序传入函数,调用时参数的数量必须和声明时一致
例:
def function (str):
print("我是一个传入参数:",str)
function("hello")
在上面的例子中我们定义一个必须传入参数的函数function(str),传入的参数为str,结果是将"hello"传给str
对于上面的例子,若我们不传入参数时,则会提示:
TypeError: function() missing 1 required positional argument: 'str':TypeError:function()缺少1个必需的位置参数:'str'
传入多个参数时的提示:
TypeError: function() takes 1 positional argument but 2 were given:TypeError:function()需要1个位置参数,但给出2个
二、关键字参数:在调用函数时将参数值指定给参数
1、关键字参数和函数调用关系紧密,调用函数时使用关键字参数确定传入的参数值
2、使用关键字参数允许调用函数时参数的顺序与声明时不一致,python解释器能自动根据参数名匹配参数值
3、若在调用时没有将参数值指定给参数,则解释器会默认将参数值传给对应位置的参数(必须参数)
例1:
def function (name,age):
print("我的名字是:%s,我的年龄是:%s" %(name,age))
function("zhou","22") #未指定参数值给参数,因此按照参数值的顺序传给对应位置的参数
例2:
def function (name,age):
print("我的名字是:%s,我的年龄是:%s" %(name,age))
function(age = "22",name = "zhou") #将参数值指定给参数,可以不考虑参数的位置
三、默认参数:调用函数时,没有传递参数就会使用默认参数
1、使用默认参数就是在定义函数时,给参数一个默认值。如果没有给调用的函数的参数赋值,调用的函数就就会使用这个默认值例1:
def function(name,age = "23"):
print("my name is %s,my age is %s" % (name,age))
function("zhou")
#上面函数的输出为:my name is zhou,my age is 23
2、无论有多少个默认参数,若不传入默认参数值,则使用默认值
例2:
def function(name = "zhou",age = "23"):
print("my name is %s,my age is %s" % (name,age))
function()
#上面函数的输出为:my name is zhou,my age is 23
3、当对默认参数传值时,函数执行时调用的就是我们传入的值
例3:
def function(name,age = "23",address = "sichuan"):
print("my name is %s,my age is %s,i am from %s" % (name,age,address))
function("zhou","21","chengdu")
#上面函数的输出为:my name is zhou,my age is 21,i am from chengdu
4、不管默认参数有几个,默认参数都一定要放在非默认参数后面,否则会报错
例4:
def function(name,age = "23",address = "sichuan"):
print("my name is %s,my age is %s,i am from %s" % (name,age,address))
function("zhou")
#上面函数的输出为:my name is zhou,my age is 23,i am from sichuan
5、若要更改某一个默认参数值,又不想传入其他默认值,且该默认参数的位置不是第一个,则可以通过传入参数名(关键字参数)更改想要更改的默认参数值
例5:
def function(name,age = "23",address = "sichuan"):
print("my name is %s,my age is %s,i am from %s" % (name,age,address))
function("zhou",address = "chengdu")
#上面的代码输出结果为:my name is zhou,my age is 23,i am from chengdu
例5_1:
def function(name,age = "23",address = "sichuan"):
print("my name is %s,my age is %s,i am from %s" % ( name,age,address))
function("zhou", "chengdu")
#上面的代码输出结果为:my name is zhou,my age is chengdu,i am from sichuan,可以发现若不指明参数名的话,就会按顺序(必须参数)传给参数
6、若有一个默认参数通过传入参数名(关键字参数)更改了参数值,则其他想要更改的默认参数都需要传入参数名以更改参数值(不能直接传入参数值)
例6:
def function(name,age = "23",address = "sichuan"):
print("my name is %s,my age is %s,i am from %s" % (name,age,address))
function("zhou",age = "24",address = "chengdu")
#上面的代码输出结果为:my name is zhou,my age is 24,i am from chengdu
例6_1:
def function(name,age = "23",address = "sichuan"):
print("my name is %s,my age is %s,i am from %s" % (name,age,address))
function("zhou",age = "24","chengdu")
#上面的代码输出结果为:SyntaxError: positional argument follows keyword argument
7、更改默认参数值时,传入默认参数的顺序不需要与定义函数时的参数顺序一致,不过最好同时传入参数名,否则容易出现执行结果与预期的不一致
例7:
def function(name,age = "23",address = "sichuan"):
print("my name is %s,my age is %s,i am from %s" % (name,age,address))
function("zhou",address = "chengdu",age = "24") #关键字参数
#上面的代码输出结果为:my name is zhou,my age is 24,i am from chengdu
例7_1:
def function(name,age = "23",address = "sichuan"):
print("my name is %s,my age is %s,i am from %s" % (name,age,address))
function("zhou","chengdu","24")
#上面的代码输出结果为:my name is zhou,my age is chengdu,i am from 24
备注:默认参数是比较有用的,特别是对于有相同参数时的情况
可变参数:能够处理比当初声明时更多的参数
1、可变参数在声明时不会被命名,其基本语法为如下:
def function ([formal_args]*var_args_tuple):
"函数文档字符串"
function_suit
return[expression]
2、加了星号(*)的变量名会存放所有未命名的变量参数。如果变量参数在函数调用时没有指定参数,就是一个空元组,我们也可以不向可变函数传递未命名的变量
3、语法中formal_args表示:需要指定的参数,即在函数定义时就必须声明的变量。var_args_tuple表示:用于所有未指定的参数
例1:
def function (clearly,*Variable):
print(clearly)
for number in Variable:
print("我属于可变参数: " ,number)
return #return的缩进与for一致
print("不带可变参数")
function("my")
print("带可变参数")
function("my","name","is","zhou")
#上面函数的输出结果为:
#不带可变参数
#my
#带可变参数
#my
#我属于可变参数: name
#我属于可变参数: is
#我属于可变参数: zhou
通过上面的例子我们可以发现:参数Variable接收的是一个元组,调用函数时可以传入任意个数的参数,也可以不传。在上面的
例子中我们使用了for循环,通过for循环来遍历元组
4、例2:
other = {"城市":"成都","爱好":"玩游戏"}
def function (name,number,**Variable):
print("名称:",name,"学号:",number,"其他:",Variable)
function("zhou",1002,**other)
例3:
other = {"城市":"成都","爱好":"玩游戏"}
def function (name,number,**Variable):
print("名称:",name,"学号:",number,"其他:",Variable)
function("zhou",1002,城市 = other["城市"],爱好 = other["爱好"])
#上面两段代码的输出结果都为:名称: zhou 学号: 1002 其他: {'爱好': '玩游戏', '城市': '成都'}
在上面函数中我们使用两个星号(**)来处理关键字参数:
例2中的**other表示把other这个字典所有key_value用关键字参数传入到函数的**Variable参数,Variable将获得一个字典,注意Variable获得的字典是other复制的,对Variable的改动不会影响到函数外的other
组合参数:
1、在python中可以组合使用必须参数、关键字参数、默认参数和可变参数这四种参数
2、注意定义参数的顺序必须是必须参数、默认参数、可变参数和关键字参数function(1,2,3,"abc",x = 9)def function(num_1,num_2,num_3 = 0,*vart,**kw):
print("num_1 = ",num_1,"num_2 = ",num_2,"num_3 = ",num_3,"vart = ",vart,"kw = ",kw)
function(1,2)
function(1,2,c = 3)
function(1,2,3,"a","b")
形参和实参:
1、python中有两种类型的参数,一种是函数定义里面的形参,一种是调用函数时传入的实参
2、形参指的是函数创建和定义过程中小括号里面的参数,而实参则指的是函数在被调用过程中传递进来的参数。形参只是代表一个位置,一个变量名,而实参是一个具体的内容,是赋值到变量名中的值。在函数内部会将实参的值赋值给形参
3、在函数体内都是对形参进行操作,不能操作实参
4、作为实参的表达式会在函数执行前执行,再将表达式的执行结果作为一个实参传递到函数体中
5、作为实参传入函数的变量名称和函数定义里的形参的变量名没有关系,函数只关心形参的值而不关心它在调用前叫什么名字(形参的变量名可以和实参的变量名一样)
例1:
def function(name,age):
print("名字:",name)
print("年龄:",age)
function("小明"*2,21)
上面代码的执行结果为:名字: 小明小明 年龄: 21,函数名function后(小括号中)和函数体中的name,age就为形参,而调用函数时的"小明"*2,21就为实参
例2:
def function(num_1,num_2):
print(num_1 + num_2)
num_1 = 1
num_2 = 2
function(num_1,num_2)#形参变量名与实参变量名一样时