牛刀小试:
定义一个无参函数
1 >>> def myFirstFunc(): 2 ... print("Hello python") 3 ... print("hello world") 4 ... print("hello my fist func") 5 ... 6 >>> myFirstFunc() 7 Hello python 8 hello world 9 hello my fist func
定义一个有参函数
1 >>> def mySecondFunc(name): 2 ... print("hello", name) 3 ... 4 >>> mySecondFunc('zhz') 5 hello zhz
函数之形参和实参
1 >>> def add(first, second): 2 ... return first + second 3 ... 4 >>> add(1, 5) 5 6
定义函数时,first和second就是形参,在函数调用时,传递的1和5就是实参。
函数之注释和文档
1 >>> def add(first,second): 2 ... '这是函数文档:计算两个参数的和' 3 ... #这是函数注释:计算两个参数的和 4 ... return first + second 5 ...
函数文档可以使用以下方式查看
1 >>> add.__doc__ 2 '这是函数文档:计算两个参数的和' 3 4 >>> help(add) 5 6 Help on function add in module __main__: 7 8 add(first, second) 9 这是函数文档:计算两个参数的和
函数之关键字参数
1 >>> def saysome(name, words): 2 ... print(name, '->', words) 3 ... 4 >>> saysome('Jobs', 'stay hungry,stay foolish') 5 Jobs -> stay hungry,stay foolish 6 >>> saysome('stay hungry,stay foolish','Jobs') 7 stay hungry,stay foolish -> Jobs 8 >>> saysome(words = 'stay hungry,stay foolish',name = 'Jobs') 9 Jobs -> stay hungry,stay foolish
函数之默认参数
1 >>> def saysome(name = 'Jobs', words = 'stay hungry, stay foolish'): 2 ... print(name, '->', words) 3 ... 4 >>> saysome() 5 Jobs -> stay hungry, stay foolish 6 >>> saysome('nazi') 7 nazi -> stay hungry, stay foolish 8 >>> saysome(words = 'keep working') 9 Jobs -> keep working 10 >>> saysome('nazi','keep looking') 11 nazi -> keep looking
函数之收集参数
1 >>> def test(*params): 2 ... for i in range(len(params)): 3 ... print(params[i]) 4 ... 5 >>> test(1, 'hello', (1,3, ['abc'])) 6 1 7 hello 8 (1, 3, ['abc'])
收集参数后最好使用默认参数,用关键字参数调用。
函数返回值
python中,用return语句可以从函数返回一个对象,列表或元组。当没有显示调用return语句时,python会自动返回一个NoneType对象。所以,可以说python中只有函数,没有过程。
1 >>> def hello(): 2 ... print("Hello") 3 ... 4 >>> temp = hello() 5 Hello 6 >>> print(temp) 7 None 8 >>> type(temp) 9 <class 'NoneType'> 10 >>> def back(): 11 ... return 1,2,'abc',[1,2] 12 ... 13 >>> back() 14 (1, 2, 'abc', [1, 2]) 15 >>> def back(): 16 ... return [1, 3.14, 'abv', [2]] 17 ... 18 >>> back() 19 [1, 3.14, 'abv', [2]]
局部变量和全局变量
在函数内部声明的变量是局部变量,在函数外声明的变量是全局变量。
1 def discount(price,rate): 2 'final_price, price, rate are local variables' 3 final_price = price * rate 4 return final_price 5 6 if __name__ == '__main__': 7 'old_price, rate and new_price are global variables' 8 old_price = float(input("原价:")) 9 rate = float(input("折扣:")) 10 new_price = discount(old_price, rate) 11 print("折后价:", new_price)
在函数中试图修改一个全局变量的值时,会python创建一个和全局变量相同的局部变量,此时,修改的只是该局部变量,全局变量不变。
1 >>> number = 10 2 >>> def test(): 3 ... number = 5 4 ... 5 ... 6 >>> test() 7 >>> number 8 10
要在函数内部修改全局变量的值,可以使用global关键字。
1 >>> number 2 10 3 >>> def test(): 4 ... global number 5 ... number = 5 6 ... 7 >>> test() 8 >>> number 9 5
内嵌函数
在函数内部可以定义其他函数,这个内部函数的作用域仅限于外部函数内部。在外部函数外部的任何位置使用该内部函数,都会抛出一个异常。
1 >>> def funA(): 2 ... print("funA") 3 ... def funB(): 4 ... print("funB") 5 ... funB() 6 ... 7 >>> funA() 8 funA 9 funB 10 >>> funB() 11 Traceback (most recent call last): 12 File "<stdin>", line 1, in <module> 13 NameError: name 'funB' is not defined
闭包
如果在一个内部函数里对外部作用域(非全局作用域)的变量进行引用,那么内部函数被认为是一个闭包。
1 >>> def funX(x): 2 ... def funY(y): 3 ... return x*y 4 ... return funY 5 ... 6 >>> i = funX(5) 7 >>> type(i) 8 <class 'function'> 9 >>> i(6) 10 30 11 >>> funX(5)(6) 12 30
同样的,在闭包内修改外部作用域变量,系统会自动创建局部变量x,屏蔽外部变量。
1 >>> def fun1(): 2 ... x = 5 3 ... def fun2(): 4 ... x *= x 5 ... fun2() 6 ... 7 >>> fun1() 8 Traceback (most recent call last): 9 File "<stdin>", line 1, in <module> 10 File "<stdin>", line 5, in fun1 11 File "<stdin>", line 4, in fun2 12 UnboundLocalError: local variable 'x' referenced before assignment
此时要修改外部变量,一,可以使用列表,列表不是放在栈里。
1 >>> def fun1(): 2 ... x = [5] 3 ... def fun2(): 4 ... x[0] *= x[0] 5 ... fun2() 6 ... print(x) 7 ... 8 >>> fun1() 9 [25]
二,可以使用nolocal关键字
1 def fun1(): 2 x = 5 3 def fun2(): 4 nonlocal x 5 x = 50 6 fun2() 7 print(x) 8 9 if __name__ == '__main__': 10 fun1()