python学习5 -函数

一.函数

  用 def 来定义函数,格式如下

1 >>> def hello(name):
2     print "hello",name

  可用内置的callable 函数来判定 函数是否可以调用

1 >>> y = hello
2 >>> callable(y)
3 True
4 >>> x = 1
5 >>> callable(x)
6 False

  记录函数,给函数写文档,便于理解

 1 >>> def square(x):
 2     ''' hahahahahahahah'''
 3     return x*x
 4 
 5 >>> square.__doc__
 6 ' hahahahahahahah'
 7 >>> help(square)
 8 Help on function square in module __main__:
 9 
10 square(x)
11     hahahahahahahah

  python 中所有函数都有返回值,如果没有指定的返回值,则默认为None

1 >>> def hello():
2     print 'sss'    
3 >>> x = hello()
4 sss
5 >>> print x
6 None

   参数魔法

    字符串,数字,元组都是不可变的,所以用他们做参数,在函数内部参数有任何变化,函数外的变量不会受影响

1 >>> name = "zhang"
2 >>> def change(name):
3     name = 'lu'    
4 >>> change(name)
5 >>> name
6 'zhang'

    但如果是 可变元素作为 参数,则.....

1 >>> arr = ['zhang','lu']
2 >>> def chang_list(arr):
3     arr[0] = 'wang'
4 >>> chang_list(arr)
5 >>> arr
6 ['wang', 'lu']

  关键值参数和默认值

    调用函数时,如果传入的参数值加上参数名称,则位置可调换  ---关键字参数

 1 >>> def hello(greeting,name):
 2     print '%s,%s' %(greeting,name)
 3 
 4     
 5 >>> hello('zhang','hello')
 6 zhang,hello
 7 >>> hello(name = 'zhang',greeting='hello')
 8 hello,zhang
 9 >>> hello(name = 'cheng','hello')   #注意 默认值 一定要放到最后
10 SyntaxError: non-keyword arg after keyword arg

    在定义函数时,可以给定传入参数的默认值,那么在 调用函数时,可以不提供该参数, 或者部分提供,或者全部提供

1 >>> hello2()
2 hello,zhang
3 >>> hello2('greetings')
4 greetings,zhang
5 >>> hello2('greetings','universe')
6 greetings,universe
7 >>> hello2(name = 'cheng')
8 hello,cheng

    定义函数时  * 代表了收集其余位置的参数

 1 >>> def print_params(title,*params):
 2     print title
 3     print params
 4 
 5 >>> print_params('params:',1,2,3)
 6 params:
 7 (1, 2, 3)
 8 >>> print_params('params:')
 9 params:
10 ()

    **  ---关键值参数收集

 1 >>> def print_params(**params):
 2     print params
 3 
 4     
 5 >>> print_params(x=1,y=2,z=3)
 6 {'y': 2, 'x': 1, 'z': 3}
 7 >>> def print_params1(x,y,z=3,*pospar,**keypar):
 8     print x,y,z
 9     print pospar
10     print keypar
11 
12     
13 >>> print_params1(1,2,3,5,6,7,foo=1,bar=2)
14 1 2 3
15 (5, 6, 7)
16 {'foo': 1, 'bar': 2}

 

二.作用域

  函数内的变量 被称为局部变量(与全局变量),参数的工作原理类似于局部变量。

  函数内读取全局变量正常,但如果全局变量名 和 函数内的  全局变量名相同,则将屏蔽全局变量

  函数内 读取 全局变量的方法 globals()['name']

1 >>> name = 'zhang'
2 >>> name2 = 'cheng'
3 >>> def change2(value):
4     print value + globals()['name']
5 >>> change2(name2)
6 chengzhang

  屏蔽全局变量

1 >>> x = 1
2 >>> def change(x):
3     x = 2
4 >>> x
5 1

  重新绑定全局变量  --在函数内声明一个变量,且这个变量是全局变量

1 >>> x = 1
2 >>> def change_global():
3     global x
4     x =  x +2    
5 >>> change_global()
6 >>> x
7 3

  嵌套 --函数内定义函数

1 >>> def foo():
2     def bar():
3         print 'hello bar()'
4     bar()    
5 >>> foo()
6 hello bar()

  递归 --函数自己调用自己

    两个经典的例子 --阶乘,幂

1 >>> def factor(n):
2     if n == 1:
3         return 1
4     else:
5         return n * factor(n-1)    
6 >>> print factor(4)
1 >>> def power(x,n):
2     if n == 0:
3         return 1
4     else:
5         return x * power(x,n-1)

 

posted @ 2017-03-02 10:19  大愚者  阅读(188)  评论(0编辑  收藏  举报