1、函数能提高应用的模块性,和代码的重复利用率。
2、参数传递为,可更改(mutable)与不可更改(immutable)对象。
3、闭包和装饰器。
def hello():
print("hello function!");
hello()
输出:
hello function!def p_num():
global num
print(num)
num=50
num=20
p_num()
print(num)
输出:
20
50
结论:
global语句可以起到声明变量作用域。
def area(width, height):
return width * height
def welcome(name):
print("www.what21", name)
welcome(".com")
width = 40
height = 50
print("width =", width , ",height =", height, ",area =", area(width, height))
输出:
www.what21 .com
width = 40 ,height = 50 ,area = 2000def ChangeInt(a):
a = 100
b = 88
ChangeInt(b)
print(b) # 结果是 88
输出:
88
结论:
1、函数的不可变类型:类似其他语言的值传递,数值、字符串和元组为不可变类型。
2、如fun(a),传递的只是a的值,没有影响a对象本身。比如在fun(a)内部修改a的值,只是修改另一个复制的对象,不会影响a本身。
def ChangeList(mylist):
"修改传入的列表"
mylist.append([1, 2, 3, 4]);
print("函数内取值: ", mylist)
return
# 调用changeme函数
mylist = [10, 20, 30];
ChangeList(mylist);
print("函数外取值: ", mylist)
输出:
函数内取值: [10, 20, 30, [1, 2, 3, 4]]
函数外取值: [10, 20, 30, [1, 2, 3, 4]]
结论:
1、函数的可变类型,类似其他语言的引用传递,列表和字典为可变类型。
2、如fun(la),则是将la真正的传过去,修改后函数外部的la也会受影响。
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
输出:
100
100
结论:
1、当内部作用域需要修改外部作用域的变量时,就要用到global和nonlocal关键字。
2、如果需要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要nonlocal关键字。
def w1(func):
def inner():
print(" 验证1")
print(" 验证3")
print(" 验证4")
return func()
return inner
@w1
def f1():
print( 'f1')
@w1
def f2():
print('f2')
@w1
def f3():
print('f3')
@w1
def f4():
print('f4')import time
def timer(func):
def inner():
start = time.time()
func()
end=time.time()
print(end - start)
return inner
print(time.time());
@timer #==> func1 = timer(func1)
def func1():
print('in func1')
func1()
输出:
1521029364.651659
in func1
0.0
结论:
1、装饰器的本质:一个闭包函数。
2、装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展。