0%

【Python笔记】函数

1、定义

1
2
3
4
5
6
def function():
print("This is a function.")


if __name__ == "__main__":
function()

2、参数

  • 必备参数
  • 关键字参数
  • 默认参数
  • 不定长参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
def add(a, b):
return a + b


def demo_1():
print("Demo 1:")
print(add(1, 2))


def sum_abcd(a, b, c=0, d=0):
return a + b + c + d


def demo_2():
print("Demo 2:")
print(sum_abcd(1, 2, 3, 4))
print(sum_abcd(1, 2, c=3, d=4))
print(sum_abcd(1, 2, d=4))
print(sum_abcd(1, d=4, b=2))
# print(sum_abcd(1, c=3, d=4))
pass


def max(*args):
print(type(args)) # tuple
print(args)
num = len(args)
if num == 0:
return None
ret = args[0]
for item in args:
if item > ret:
ret = item
return ret


def demo_3():
print("Demo 3:")
print(max())
print(max(1, 2, 3, 4, 5, 6))
arr = (1, 2, 3, 4, 5, 6)
print(max(*arr))
arr = [1, 2, 3, 4, 5, 6]
print(max(*arr))


def print_dict(**args):
print(type(args)) # dict
print(args)
num = len(args)
if num == 0:
print(None)
for key, value in args.items():
print(f"{key} = {value}")
pass


def demo_4():
print("Demo 4:")
print_dict()
print_dict(a=1, b=2, c=3, d=4)
dic = {"a": 1, "b": 2, "c": 3, "d": 4}
print_dict(**dic)
print(sum_abcd(**dic))


def test_var_args(a, b, *args, **kwargs):
print(f"a = {a}")
print(f"b = {b}")
print(args)
print(kwargs)
pass


def demo_5():
print("Demo 5:")
test_var_args(1, 2, 3, 4, e=5, f=6)
test_var_args(1, 2, 3, 4)
test_var_args(1, 2, e=5, f=6)
pass


if __name__ == "__main__":
demo_1()
demo_2()
demo_3()
demo_4()
demo_5()
pass

3、参数传递

  • 不可变类型:

    整数、浮点数、字符串、元组

  • 可变类型

    列表、字典、自定义类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
def change_1(a: int, b: float, c: str, d: tuple):
a -= 10
b -= 10.0
c = c.replace("Hello", "Hi")
# d[0] = 5
pass


def demo_1():
print("Demo 1:")
a = 5
b = 5.0
c = "Hello World!"
d = (1, 2, 3, 4)
change_1(a, b, c, d)
""" a=5, b=5.0, c=Hello World!, d=(1, 2, 3, 4) """
print(f"a={a}, b={b}, c={c}, d={d}")
pass


def change_2(a: list, b: dict):
a.reverse()
for key in b.keys():
b[key] *= 10
pass


def demo_2():
print("Demo 2:")
a = [1, 2, 3, 4]
b = {"a": 1, "b": 2}
change_2(a, b)
""" a=[4, 3, 2, 1], b={'a': 10, 'b': 20} """
print(f"a={a}, b={b}")
pass


class MyClass():

def __init__(self) -> None:
self.a = 0
self.b = 0
pass

def __str__(self) -> str:
return f"a={self.a}, b={self.b}"
pass


def change_3(obj: MyClass):
obj.a = 10
obj.b = 20
pass


def demo_3():
print("Demo 3:")
obj = MyClass()
change_3(obj)
""" a=10, b=20 """
print(obj)


if __name__ == "__main__":
demo_1()
demo_2()
demo_3()
pass

4、返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
def return_value_1():
pass


def demo_1():
print("Demo 1:")
ret = return_value_1()
print(ret) # None
pass


def return_value_2(a, b):
return a + b


def demo_2():
print("Demo 2:")
ret = return_value_2(1, 2)
print(ret) # 3
pass


def return_value_3(a, b, c):
a += 10
b += 10
c += 10
return a, b, c


def demo_3():
print("Demo 3:")
ret = return_value_3(1, 2, 3)
print(ret) # (11, 12, 13)
a, b, c = return_value_3(1, 2, 3)
print(f"a={a}, b={b}, c={c}") # a=11, b=12, c=13
# a, b = return_value_3(1, 2, 3)
# a, b, c, d = return_value_3(1, 2, 3)
pass


def return_value_4():
return return_value_2


def demo_4():
print("Demo 3:")
add = return_value_4()
ret = add(1, 2)
print(ret) # 3
pass


if __name__ == "__main__":
demo_1()
demo_2()
demo_3()
demo_4()
pass

5、匿名函数

lambda函数的语法只包含一个语句

1
lambda [arg1 [,arg2,.....argn]]:expression
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def demo_1():
print("Demo 1:")
sq = lambda x: x**2
ret = sq(10)
print(ret) # 100
pass


def demo_2():
print("Demo 2:")
""" lambda [arg1 [,arg2,.....argn]]:expr1 if condition else expr2 """
max = lambda x, y: x if x > y else y
ret = max(10, 100)
print(ret) #100
pass


if __name__ == "__main__":
demo_1()
demo_2()
pass

6、作用域

全局变量局部变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# total = 0  # 全局变量


def demo_1():
total = 100 # 局部变量
pass


def demo_2(total):
total = 100
pass


def demo_3():
global total
total = 100 # 全局变量
pass


def demo_4(total):
# global total # "total" is assigned before global declaration
total = 100
pass


def demo_5():
global g_total
g_total = 100
pass


if __name__ == "__main__":
total = 0
demo_1()
print(total) # 全局变量total: 0

total = 0
demo_2(total)
print(total) # 全局变量total: 0

total = 0
demo_3()
print(total) # 全局变量total: 100

demo_5()
print(g_total) # 全局变量g_total: 100
pass

LEGB规则

Python按以下顺序依次进行查找符号对应的对象

locals $\to$ enclosing $\to$ globals $\to$ build-in

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
""" LEGB规则 """


def demo_1():
tmp = 10
print(tmp) # 局部变量


def sq(x):
print(f"Global function sq, x={x}")
pass


def demo_2(a):

def sq(x):
return x**a # 嵌套作用域

return sq(2)


def demo_3():
print(total) # 全局变量


def demo_4():
print(__name__) # 内置作用域


if __name__ == "__main__":
demo_1()

ret = demo_2(10)
print(ret)

total = 100
demo_3()

demo_4()
pass