一、函数是什么
函数是一段可以通过固定名称多次使用的代码段。
二、为什么要使用函数
我们在编写程序时,某个功能即某些代码块需要使用多次,那么我们可以把这个功能的代码块封装成一个函数。然后在需要使用这个功能的地方,直接调用这个函数即可。
函数的优点:
减少代码行
减少工作量
当功能需要变更时,改变函数即可
三、内置函数
在python中有内置函数和自定义函数,前面使用的input()和print()就是python内置的两个函数,用来实现标准输入和标准输出。
查看python内置的函数
#!/usr/bin/env usipython3
print(dir(__builtins__))
查看函数的功能说明
#!/usr/bin/env python3
print(abs.__doc__)
#!/usr/bin/env python3
print(help(max))
推荐使用第一种方式,第二种方式需要在交互器模式下使用。
四、函数如何定义
python中定义函数的关键字为def,def后面跟空格、函数名、中括号。
中括号里面是函数参数,中括号后是冒号: 然后在下一行,缩进体中编写函数体,函数的返回值用return返回。
函数中,函数名称下面””” “”” 引起的内容是函数的说明。使用”函数名.doc“可以引用。 格式如下:
def 函数名(参数列表):
函数体
示例:
定义一个求两个数大小的函数:
#!/usr/bin/env python3
def SpecificSize(a,b):
"""函数的功能说明"""
if a > b:
c = "a比b大"
else:
c= "a比b小"
return c
a=3
b=2
print(SpecificSize(a,b))
#输出函数的说明
print(SpecificSize.__doc__)
五、函数如何调用
要调用函数,需要知道函数的名称和参数。以刚才自定义的函数为例,其中a和b就是参数。
调用方式就是:
SpecificSize(a,b)
print(SpecificSize(a,b)) 是把函数调用的结果输出
六、函数参数
必需参数(位置参数)
必需参数必需以正确的顺序传入函数。调用时的数量、位置和声明时一样。
示例1:
#!/usr/bin/env python3
def printem(ste):
print(ste)
return
printem()
执行这个程序以后,会报下面的错误,因为没有传递参数。
Traceback (most recent call last):
File "test.py", line 5, in <module>
printem()
TypeError: printem() takes exactly 1 argument (0 given)
示例2:
#!/usr/bin/env python3
def printem(ste,ste2):
print(ste,ste2)
return
printem("123")
执行这个程序以后,会报下面的错误,因为只传递了一个参数。
Traceback (most recent call last):
File "test3.py", line 6, in <module>
printem("123")
TypeError: printem() takes exactly 2 arguments (1 given)
正确调用方式:
#!/usr/bin/env python3
def printem(ste,ste2):
print(ste,ste2)
return
printem("123","456")
输出结果:
123 456
七、默认参数
默认参数,即函数的参数有一个默认值。函数调用时不传递参数的话,就会使用默认值。传递参数则会使用传递的值。
示例1:
#!/usr/bin/env python3
def printem(ste,ste2="456"):
print(ste,ste2)
return
printem("123")
输出结果:
123 456
示例2:
#!/usr/bin/env python3
def printem(ste,ste2="456"):
print(ste,ste2)
return
printem("123","789")
输出结果:
123 789
八、关键字参数
关键字参数是指在函数调用的时候,指定了参数名称的参数。使用关键字参数调用函数时,函数调用时传递的参数位置和函数定义时参数的位置可以不同。
示例:
#!/usr/bin/env python3
def printem(ste,ste2):
print(ste,ste2)
return
printem(ste2="456",ste="123")
输出结果
123 456
九、命名关键字参数
示例2:
#!/usr/bin/env python3
def printem(ste,ste2):
print(ste,ste2)
return
printem(ste2="456",ste="123")
输出结果
123 456
十、不定长参数
不定长参数,即在调用函数时,传入函数的参数个数不是固定的。不定长参数使用*和**来定义。*定义的参数会以元组(tuple)的形式导入,**定义的参数会以字典(dict)的形式导入。
示例1:
#!/usr/bin/env python3
def printem(ste,*ste2):
print(ste)
print(ste2)
return
printem("123","456","789",)
输出结果为
123
('456', '789')
使用**不定长参数时,函数调用,需要指定关键字,否则无法传递。所以这种方式也可以称为关键字参数。
示例2:
#!/usr/bin/env python3
def printem(ste,**ste2):
print(ste)
print(ste2)
return
printem("123",a="456",b="789",)
输出结果为
123
{'a': '456', 'b': '789'}
十一、变量作用域
程序中的变量,并不是在任何位置都可以访问的,访问的权限有变量的作用域来决定,即变量是在哪里赋值的。
python中变量作用域分为4种:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
x = int(2.9) # 内建作用域
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 f/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问
十二、局部变量和全局变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
示例:
#!/usr/bin/env python3
c="5" #全局变量
def printem(ste,**ste2):
d="5" #局部变量
print(ste)
print(ste2)
return
printem("123",a="456",b="789",)
print(d)
输出结果:
123
{'a': '456', 'b': '789'}
5
十三、global和nonlocal关键字
nonlocal用来修改嵌套作用域中的变量(需要在上一层中定义了此变量,否则无法使用。)
示例2:
#!/usr/bin/env python3
def printem(ste):
d=5
sum = 100
def inner():
nonlocal sum
sum = 20
return
inner()
print(sum)
print(ste)
return
printem("123")
输出结果:
20
123