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)