Python之路【第五篇】函数

4.1 函数的定义

函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

4.2 函数的创建

函数名的命名规则:
1.函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标
点符号;
2.函数名是区分大小写的。
3.函数名不能是保留字。

4.3 函数的参数:

1.必需参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
1 def print_info(name,age):
2     print('Name: %s' %name)
3     print('Age: %d' %age)
4     
5 print_info('haha',18)
View Code

2.关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
1 def print_info(name,age):
2     print('Name: %s' %name)
3     print('Age: %d' %age)
4     
5 print_info(age=30,name='Amy')
View Code

3.默认参数

调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
默认参数一定要跟在其他参数后面!
1 def print_info(name,age,sex='male'):
2     print('Name: %s' %name)
3     print('Age: %d' %age)
4     print('Sex:%s' %sex)
5 print_info('Alex',33)
View Code

4.不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。
加了星号(*)的变量名会存放所有未命名的变量参数。而加(**)的变量名会存放命名的变量参数
 
 1 def add(*args):
 2     print(args)  # 把所有参数看作一个元组
 3     sum=0
 4     for i in args:
 5         sum+=i
 6     print(sum)
 7 add(1,2,3,4,5)
 8 
 9 def print_info(sex='male',*args,**kwargs):
10     print(kwargs)
11     for i in kwargs:
12         print('%s:%s'%(i,kwargs[i]))
13 print_info()
14 print_info('alex',23,job='IT')
View Code

4.4 函数的返回值:

要想获取函数的执行结果,就可以用return语句把结果返回
1 def add(*args):
2     # print(args)  # 把所有参数看作一个元组
3     sum=0
4     for i in args:
5         sum+=i
6     return sum
7 a=add(1,2,3,4,5)
8 print(a)
View Code

注意:

1.函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
2.如果未在函数中指定return,那这个函数的返回值为None  
3.return多个对象,解释器会把这多个对象组装成一个元组作为一个一个整体结果输出。  

4.5 函数的作用域

python中的作用域分4种情况:
  • L:local,局部作用域,即函数中定义的变量;
  • E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
  • G:globa,全局变量,就是模块级别定义的变量;
  • B:built-in,系统固定模块里面的变量,比如int, bytearray等。 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。
 1 x=int(2.9)  # int built-in
 2 g_count=0   # global
 3 def outer():
 4     o_count=1  # enclosing
 5     i_count=8
 6     def inner():
 7         i_count=2   # local
 8         print(i_count)
 9 #    print(i_count)  # 找不到
10     inner()
11 outer()
12 
13 count=10
14 def outer():
15     global count   # 声明之后不会报错
16     print(count)   # 下面想对count进行修改,所以报错了
17     count=5
18 outer()
19 
20 def outer():
21     count = 10
22     def inner():
23         # nonlocal count
24         count = 20
25         print(count)
26     inner()
27     print(count)
28 outer()
View Code

作用域小结:

(1)变量查找顺序:LEGB,作用域局部>外层作用域>当前模块中的全局>python内置作用域;
(2)只有模块、类及函数才能引入新作用域;
(3)对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;
(4)内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字。nonlocal是python3新增的关键字,有了这个关键字,就能完美的实现闭包了。 
posted on 2017-09-25 14:18  西西西  阅读(164)  评论(0)    收藏  举报