Python函数

函数能提高应用的模块性,和代码的重复利用率。

函数应保持清晰性,接参返结果,用户交互操作在函数外进行或将函数分为两大类,一类只做事,不需要返回结果(如与用户交互或设置变量的值),另一类则执行一些运算,最后返回结果,最好不要在函数中用print语句输出信息

Python提供了许多内建函数,比如print(),max()和min()可传多个参数比较。

但你也可以自己创建函数,这被叫做用户自定义函数。

 

1.自定义函数

语法

Python 定义函数使用 def 关键字,一般格式如下:

def 函数名(参数列表):
    函数体

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 def my_abs (x):
5     if x >= 0:
6         return x
7     else:
8         return -x
9 print(my_abs(-99))

isinstance()   实例  对参数类型做检查

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 
 4 def my_abs (x):
 5     #如果参数x不是int或float则抛出一个类型异常
 6     if not isinstance(x,(int,float)):
 7         raise TypeError('bad operand type')
 8     if x >= 0:
 9         return x
10     else:
11         return -x
12 print(my_abs('-99'))

 

2.参数类型

以下是调用函数时可使用的正式参数类型:

  • 必需参数
  • 关键字参数
  • 默认参数
  • 不定长参数

必需参数

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样,不然会出现语法错误。

关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值,以字典的形式。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 def printInfo( name, age ):
5     print ("名字:", name)
6     print ("年龄:", age)
7     return
8 
9 printInfo( age = 100, name = "chb")

默认参数

调用函数时,如果没有传递参数,则会使用默认参数。

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 
 4 def printInfo( name, age = 21 ):
 5     print ("名字:", name)
 6     print ("年龄:", age)
 7     return
 8 
 9 printInfo( age = 100, name = "chb")
10 print('--------------------------')
11 printInfo( name = "chb" )

不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数(也称可变参数),和上述 2 种参数不同,声明时不会命名。

加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 def printInfo( age, *vartuple ):
5     print(age)
6     print(vartuple)
7 
8 printInfo( 11, 22, 33, 44)

 

参数组合先后顺序:必需、默认、不定长、关键字

 

3.匿名函数

Python 使用 lambda 来创建匿名函数。

所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 sum = lambda arg1, arg2: arg1 + arg2
5 #关键字lambda表示匿名函数,冒号前面表示函数参数,冒号后面就是要做的事情
6 
7 print ("相加后的值为 : ", sum( 10, 20 ))
8 print ("相加后的值为 : ", sum( 30, 40 ))

 

4.变量作用域

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:

  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内置作用域(内置函数所在模块的范围)

以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。

1 g_count = 0  # 全局作用域
2 def outer():
3     o_count = 1  # 闭包函数外的函数中
4     def inner():
5         i_count = 2  # 局部作用域

global 和 nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global(全局)和nonlocal(非局部)关键字了。

以下实例修改全局变量 num:

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 
 4 num = 1
 5 def fun():
 6     global num   #需要使用global关键字声明
 7     print(num)
 8     num = 333
 9     print(num)
10     
11 fun()
12 print(num)

如果要修改嵌套作用域中的变量则需要 nonlocal 关键字了,如下实例:

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 
 4 def outer():
 5     num = 10
 6     def inter():
 7         nonlocal num  #nonlocal关键字声明
 8         num = 100
 9         print(num)
10     inter()
11     print(num)    
12 outer()

 

posted @ 2019-04-19 11:48  北风吹沙  阅读(191)  评论(0编辑  收藏  举报