函数来了, 函数基础课程.
一、函数是抽象的第一步
1. 有关高压锅
2. 函数是抽象出来的结构,是总结,是方法
3. 多用函数
二、如何定义函数
1. def是关键词, 括号冒号永不忘, 无缩进无真相
2. 没有return的函数,不是大丈夫 -- 不是真函数
3. 不写doc的函数,就像没有性别的人类
下面的函数不是真函数
def test():
print '422'
test()
下面是比较好的方法:
def test():
'这是关于函数的描述'
return '422'
print test()
print test.__doc__
三、函数的参数魔法和陷阱
1. 如何定义参数
1.1 位置参数, 可选参数
# 位置参数
def test(a,b,c,d,e):
"是关于函数的描述"
# print a
# print b
# print c
# print d
# print e
return a,b,c,d,e
print test(1,2,3,4,5)
# 可选参数
def test( a = 4):
"是关于函数的描述"
return a
print test(5)
# 可选参数的应用方式 (伪代码)
def test1(a,b,c,d,return_data = 'json'):
if return_data == 'json':
return json(a,b,c,d)
elif return_data == 'xml':
return xml(a,b,c,d)
test1(a,b,c,d, return_data = 'xml')
2. 参数的值是局部变量
2.1 参数只在函数内部有用
2.2 全局变量介绍, 使用方法
2.3 全局变量最讨厌
b = 3
def a():
# 将3赋值给全局变量b
b = 4
return b
def c():
return b
def d():
global b # 能不用global尽量不要用
b = 4
return b
print b
print a()
print c()
print d()
print b
结果为 3,4,3,4,4
3. 参数默认值:方便引入不经常变化的值 或者 有时候需要根据应用的不同需要修改参数
4. 如何修改参数
4.1 介绍
4.2 这样修改参数实在太恶心
b = [1,2,3]
def fun1(l):
l.append(4)
return l
# b 引入进去后,b就变化了,这样的方式非常危险, 不推荐这些样.
fun1(b)
print b
# 下面的写法是比较推荐的
b = fun1(b) # 函数有返回值,返回值这样写比较好
print b
5. **和* 猩猩是字段, 星是元组
def test(**kr):
return kr
print test(a=1, b=2, c=3, d=4) # 他会把所有的参数塞进kr这个字典里面去
print test()
def test(*z):
return z
print test(1,4,5,6,7,[1,4,5]) # 位置参数
结果:(1, 4, 5, 6, 7, [1, 4, 5])
def test1(*z,**kr):
return z, kr
print test1(1,4,5,6,7,[1,4,5], a=4, b=9, c=6) # 返回键值以及位置参数组合成的元组
结果:((1, 4, 5, 6, 7, [1, 4, 5]), {'a': 4, 'c': 6, 'b': 9})
# 用途:可以和很好地将你没有特别去设定的参数将它组合成一个可以被利用的变量,这就是** 和 *的意义
print test1(a=4, 1,4,5,6,7,[1,4,5], b=9, c=6) #错误,赋值不能放在前面
print test1( 1,4,5,a=4,6,7,[1,4,5], b=9, c=6) #错误 ,赋值不能放在中间,所以赋值只能放在右边.
def test2(a,b,c,*z,**kr):
return z, kr
# print test2(1,2,3,4, a=4,g=1) #错误
#正确, 赋值的变量不能和位置参数重复,这一点一定要注意.另外,赋值会按照顺序给到
print test2(1,2,3,4,5,6,[1,2,3], f=4, g=1)