函数的作用:
1.减少重复代码
2.方便修改,易扩展
3.代码保持一致性
把重复的语句通过一个名字一定的格式封装,方便日后调用。
函数定义格式:
define- > def函数定义的关键字
def name(arguments):
*****
函数名字的定义时具有一定的实际意义,具有描述性的文字,能大概看懂这个函数是做什么的。命名和变量规则一样,不能是保留字,函数名字区分大小写。
>>> def f(): #定义函数f()
... print("ok")
...
>>> f() #调用函数f()
ok
===========
>>> def add(x,y): #定义函数add(),带有形参,形参用来接收实参,参数与形参一一对应
... print(x+y)
...
>>> add(3,4) #调用函数add(),传入参数3,4 执行
7
必需参数
传入的参数必须一一对应
>>> def info(name,age):
... print("name:%s"%name)
... print("age:%s"%age)
...
>>> info("Lilei",26) #必须一一对应函数中的形参顺序输入
name:Lilei
age:26
关键字参数
在调用函数时,在括号中通过指定变量赋值参数
>>> def info(name,age):
... print("name:%s"%name)
... print("age:%s"%age)
...
>>> info(age=26,name="Lilei") #关键字赋值
name:Lilei
age:26
默认参数
non-default argument follows default argument
>>> def info(name,age,sex='male'): #默认参数在定义时要跟在非默认参数后面
... print("Name:%s\tage:%s\tsex:%s"%(name,age,sex))
...
>>> info('Lilei',27) #使用默认sex参数
Name:Lilei age:27 sex:male
>>> info('Hanmei',24,sex='Female') #赋值sex,不使用默认参数
Name:Hanmei age:24 sex:Female
不定长参数
>>> def add(*agrs): #使用*的方式定义,可以输入多个参数通过元组的方式传入 声明时不用命名 (无命名参数)
... print(agrs)
... add_sum =0
... for i in agrs:
... add_sum = add_sum + i
... print(add_sum)
...
>>> add(1,2,3,4,5,6,7)
(1, 2, 3, 4, 5, 6, 7) #元组
28
>>> add(1,2,3)
(1, 2, 3)
6
=============
>>> a = [1,2,3]
>>> def f (*agrs):
... print(agrs)
...
>>> f(*a) #传入一个列表作为参数
(1, 2, 3)
===========
>>> def info(**kwagrs): #以字典方式接收
... print(kwagrs,type(kwagrs))
... for i in kwagrs:
... print('%s:%s'%(i,kwagrs[i]))
...
>>> info(Name='Lilei',age=18,Job='Teacher')
{'Name': 'Lilei', 'age': 18, 'Job': 'Teacher'} <class 'dict'>
Name:Lilei
age:18
Job:Teacher
===================
>>> a = {'name':'Lilei','age':23,'sex':'male'}
>>> def f(**kwagrs):
... print(kwagrs)
...
>>> f(**a) #字典作为参数进行传参
{'name': 'Lilei', 'age': 23, 'sex': 'male'}
====================
传参为两种不定长参数位置
*agrs 放在**kwagrs之前,也就是无命名的参数放在有命名参数之前
>>> def info(**kwagrs,*agrs): #错误
File "<stdin>", line 1
def info(**kwagrs,*agrs):
^
SyntaxError: invalid syntax
>>> def info(*agrs,**kwagrs): #正确...
函数的返回值
return 返回的可以时一个值也可以时多个值,没有return时默认返回none
>>> def function():
... return 1, 2,3,'go'
...
>>> c = function()
>>> print(c)
(1, 2, 3, 'go') #返回的多个值以元组形式呈现
函数的作用域:
1.变量的查找顺序:local->enclosing->global->built-in, 局部作用域->外层作用域->当前模块中的全局->python内置作用域
2.只有模块,类,及函数才能引入新的作用域
3.对于一个变量,作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;
4.内部作用域要修改外部作用域变量的值时,全局变量要用global关键字,嵌套作用域变量要 使用nonlocal的关键字。nonlocal时python3新增关键字,有这个关键字,就能完美的实现闭包。
函数内部使用global关键字进行修改count变量后,count值变化如下运行结果
同理 nonlocal关键字也类似。