函数
函数是组织好的、可重复使用的,用来实现单一或相关联功能的代码片段。
函数能够提高应用的模块性和代码的重复利用率。
python提供了很多内建函数,如print()、int()。我们也可以自己创建函数,这样的函数称为用户自定义函数。
在程序设计中,函数是指用于进行某种计算的一系列语句的有名称的组合。定义函数时,需要指定函数的名称并编写一系列程序语句,之后可以使用名称“调用”这个函数。
print("HelloWorld")
type('hello')
int(12.1)
如上代码就是函数的调用。函数括号中表达式称之为函数的参数。函数“接收”参数,并“返回”结果,这个结果称之为返回值(return value)。如上面的示例中,int(12.1),“12.1”就是接收的“参数”,得到的结果是12,12就是这个“返回值”。
python常用内置函数
自定义函数
python支持自定义函数,即有我们自己定义一个实现某个功能的函数。
自定义函数规则:
- 函数代码块以def关键词开头,后接函数标识符名称和圆括号“()”。
- 所有传入的参数和自变量都必须放在圆括号中,可以在圆括号中定义参数。
- 函数的第一行语句可以选择性使用文档字符串,用于存放函数说明。
- 函数内容以冒号开始,并且要缩进。
- return[表达式]结束函数,选择性返回一个值给调用方。不带表达式的return相当于返回None。
Python定义函数使用def关键字,一般格式如下:
def 函数名(参数列表):
函数体
函数的名字必须以字母开头,可以包含下划线“_”。和定义变量一样,不能把python的关键字定义成函数的名字。函数的语句数量是任意的,每个语句至少有一个空格的缩进,以表示该语句属于这个函数。函数体必须保持缩进一致,因为在函数中,缩进结束就表示函数结束。
def hello():
print("hello,world")
hello()
输出:
hello,world
需要注意以下几点:
- 没有return语句时,函数执行完毕也会返回结果,不过结果为None。
- return None可以简写为return。
- 在python中定义函数时,需要保持函数体中同一层级的代码缩进一致。
def add():
a=10
b=20
print(a)
print(b)
print(a+b)
print("a+b的和等于:",a+b)
add()
输出:
10
20
30
a+b的和等于: 30
如果定义一个什么都不做的函数可以吗?当然可以。如果想定义一个什么都不做的空函数,可以用pass语句,定义如下函数并执行:
def donothing():
pass
donothing()
执行结果为没有任何输出。
pass语句什么都不做,有什么用呢?实际上pass语句可以作为占位符,比如现在韩没想好怎么写函数的代码,可以先放一个pass,让代码能够运行起来。
函数的目的是把一些复杂的操作隐藏起来,用于简化程序的结构,是程序更易于阅读。函数在调用前必须先定义。
函数的参数
以上讲述了如何定义函数,不过是简单函数,还有一类函数是带参数的,称为带参数的函数。
调用函数时可以使用以下参数类型:
- 必须参数。
- 关键字参数。
- 默认参数。
- 可变参数。
- 组合参数。
形参和实参
python函数的两种类型参数,一种是函数定义里面的形参,一种是调用函数时传入的实参。
在函数内部,会将实参的值赋给形参,如:
def personinfo(age,name):
print('年龄:',age)
print("姓名:",name)
return
在该函数中,函数名personinfo后面的参数列表age和name就是实参,在函数体中分别将age和name的值传递给age和name,函数体中的age和name就是形参。
在函数体内都是对形参进行操作,不能操作实参,即对实参作出更改。
内置函数的组合规则在自定义函数上同样适用,我们对自定义的函数可以使用任何表达式作为实参:
personinfo(21,'小萌'*2)
执行结果:
年龄: 21
姓名: 小萌小萌
变量作用域
简单来说,作用域就是一个变量的命名空间。在python中,程序的变量并不是咋任何位置都可以访问的,访问权限决定于这个变量是在哪里赋值的,代码中变量被赋值的位置决定哪些范围的对象可以访问这个变量,这个范围就是明明空间。
变量的作用域决定哪一部分程序可以访问特定的变量名称。python中有两种最基本的变量作用域:局部变量和全局变量。
局部变量
在函数内定义的变量名只能被函数内部引用,不能再函数外引用,这个变量的作用域是局部的,也称为局部变量。
定义的变量如果是在函数体中第一次出现,就是局部变量,例如:
def func():
x=100
print('变量x:%s'%x)
在func函数中,x是在函数体中被定义的,并且是第一次出现,所以x是局部变量。
局部变量只能在函数体中被访问,超出函数体的范围访问就会出错。
执行结果如下:
Traceback (most recent call last):
File "D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py", line 5, in <module>
print('变量x:%s'%x)
NameError: name 'x' is not defined
执行结果告诉我们,第5行的x没有被定义:由输入代码可知,第5行语句没有在函数体中,因而执行时报错了。
如果把x作为实参传入函数体中,在函数体中不服你故意变量x,会将x认为是是怎样的变量呢?定义如下函数并执行:
def func(x):
print('局部变量x为:',x)
func(10)
执行结果如下:
局部变量x为: 10
由执行结果可以看到,输出了局部变量的值。这里有一个疑问,在函数体中没有定义局部变量,x只是作为一个实参传入函数体中,怎么就变成局部变量了呢?这是因为参数的工作原理类似于局部变量,一旦进入函数体,就成为局部变量了。
如果在函数外定义了变量x并赋值,在函数体中能否使用x呢?
定义如下函数并执行:
def func():
print('x等于',x)
func()
执行结果如下:
x等于 50
由执行结果看到,在函数体中可以直接使用函数体外的变量(全局变量)。
如果在函数外定义了变量x并赋值,将x作为函数的实参,在函数体中更改x的值,函数体外x的值是否跟着变更呢?定义如下函数并执行:
x=50
def func(x):
print('x等于',x)
x=2
print('局部变量x变为',x)
func(x)
print('x一直是',x)
执行结果如下:
x等于 50
局部变量x变为 2
x一直是 50
由输出结果可以看到,在函数体中更改变量的值并不会更改函数体外变量的值。这是因为调用func函数时创建了新的命名空间,它作用于func函数的代码块。赋值语句x=2 只在函数体的作用域内起作用,不能影响外部作用域中的x。可以看到,函数外部调用x时,它的值并没有改变。
全局变量
在函数外,一段代码最开始赋值的变量可以被多个函数引用,这就是全局变量。全局变量可以在整个程序范围内访问。
下面看一个全局变量的例子:
total=0; #这是一个全局变量
def sum(arg1,arg2):
total=arg1+arg2; #total在这里是局部变量
print('函数内是局部变量:',total)
return total
def totalprint():
print('total的值是:',total)
return total
print('函数求和的结果是:',sum(10,20))
totalprint()
print('函数外是全局变量:',total)
执行结果如下:
D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
函数内是局部变量: 30
函数求和的结果是: 30
total的值是: 0
函数外是全局变量: 0
由执行结果可以看到全局变量可以在全局使用,在函数体中更改全局变量的值不会影响全局变量在其他函数或语句中的使用。
再定义一个函数并执行:
num=100
def func():
num=200
print('函数体中num的值为:',num)
func()
print('函数体外num的值为:',num)
D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
函数体中num的值为: 200
函数体外num的值为: 100
由输出结果可以看到,我们定义了一个名为num的全局变量,在函数体中也定义了一个名为num的全局变量,在函数体中使用的是函数体中的num变量,在函数体外使用num变量时使用的是全局变量的值。
由此我们得知:在函数体重使用某个变量时,如果该变量名既有全局变量又有局部变量,就默认使用局部变量。
要将全局变量变为局部变量,只需在函数体中定义一个和局部变量名称一样的变量即可。能否将函数体中的局部变量变为全局变量呢?定义如下函数并执行:
num=100
print('函数调用前num的值为:',num)
def func():
global num
num=200
print('函数体中num的值为:',num)
func()
print('函数体外num的值为:',num)
D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
函数调用前num的值为: 100
函数体中num的值为: 200
函数体外num的值为: 200
由函数定义及执行结果看到,在函数体中的变量num前加了一个global关键字后,函数调用结束后,在函数外使用num变量时,值变为和函数体中的值一样了。
由此我们得知:要在函数中将某个变量定义为全局变量,在需要被定义的变量前加一个global关键字即可。
在函数体中定义global变量后,在函数体中对变量做的其他操作也是全局性的。定义如下函数并执行:
num=100
print('函数调用前num的值为:',num)
def func():
global num
num=200
num+=100
print('函数体中num的值为:',num)
func()
print('函数调用结束后num的值为:',num)
D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
函数调用前num的值为: 100
函数体中num的值为: 300
函数调用结束后num的值为: 300
由执行结果可以看到,在函数体中对定义的全局变量num做了一次加100的操作,num的值由原来的200变为300,在函数体外获得的num值也变为300了。
有返回值和无返回值的函数
def noreturn():
print('noreturn函数不写return语句')
def justreturn():
print('justreturn函数只写return,不返回具体内容')
return
def returnval():
x=10
y=20
z=x+y
print('returnval函数写return语句,并返回求和结果。')
return z
print('函数noreturn调用结果:',noreturn())
print('函数justreturn调用结果:',justreturn())
print('函数returnval调用结果:',returnval())
D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
noreturn函数不写return语句
函数noreturn调用结果: None
justreturn函数只写return,不返回具体内容
函数justreturn调用结果: None
returnval函数写return语句,并返回求和结果。
函数returnval调用结果: 30
由执行结果可以看到,定义函数时不写return和只写一个return语句返回的都是None。如果写了返回具体内容,调用函数时就可以获取具体内容。