项目Projects
猜数字
Q10
五子棋
Q56
敲代码的节奏
1.
写
分析步骤
逐步写
2.
测试
3.
整理
4.
回到步骤 1
抽离大法Extract Method
什么是
方法抽离
将一大段代码抽离出来,形成一个函数
案例
使用前
1 2 3 4 5 6 7 def run(): a = 1 b = 10 sum = 0 for i in range(a, b): sum += i print(sum)
将上面高亮的部分抽离出来
使用后
1 2 3 4 5 6 7 8 def run(): print(sum_of_range(1, 10)) def sum_of_range(start, end): sum = 0 for value in range(start, end): sum += value return sum
步骤
1.
识别函数级别的输入输出
输入:代码上面定义的,但里面要用到的
输出:里面定义的,外面要用到的
输入 | a, b |
---|---|
输出 | sum |
2.
声明函数
输入变为参数,输出变为返回值
1 2 3 4 5 6 7 8 9+10+def run(): a = 1 b = 10 sum = 0 for i in range(a, b): sum += i print(sum) def f(a, b): pass
3.
移植代码
原代码改为函数调用,用变量接住返回值
1 2 3 4-5-6-7+8 9 10 11+12+13+14+def run(): a = 1 b = 10 sum = 0 for i in range(a, b): sum += i sum = f(a, b) print(sum) def f(a, b): sum = 0 for i in range(a, b): sum += i return sum
4.
重新定义
重新审视被抽出来的代码,
给函数和变量,起更符合局部代码意义的名字
1 2 3 4*5 6 7*8 9*10*11 def run(): a = 1 b = 10 sum = sum_of_range(a, b) print(sum) def sum_of_range(start, end): sum = 0 for value in range(start, end): sum += value return sum
5.
优化原始函数
原始函数甚至可以更简单
1 2-3-4-5*6 7 8 9 10 11 def run(): a = 1 b = 10 sum = sum_of_range(a, b) print(sum_of_range(1, 10)) def sum_of_range(start, end): sum = 0 for value in range(start, end): sum += value return sum
多返回值Returning Multiple Values
什么
在有些业务下,为我们希望在一个函数内同时返回多个值,这个时候怎么办
利用数组
如果要返回的多个值,都是 一个类型,
可以使用数组打包后,返回。
接住返回值后,再拆解
1 2 3 4 5 6 7 8 def run(): location = random_location() x = location[0] y = location[1] print(f'{x}, {y}') def random_location(): return [3, 4]
利用元组
如果要返回的多个值,都是 一个类型,
可以使用数组打包后,返回。
接住返回值后,再拆解
1 2 3 4 5 6 def run(): x, y = random_location() print(f'{x}, {y}') def random_location(): return 3, 4
作用域控制Scope
引言
目前 1
1 2 <v = 1print(v)1
目前 2
1 2 3 4 5 <def run(): v = 1 print(v) run()1
如果 1
1 2 3 4 5 v = 1def run(): print(v) run()
如果 2
1 2 3 4 5 def run(): v = 1 run()print(v)
全局变量 与 局部变量Global and Local
1 2 3 4 5 v1 = 1 # globaldef run(): v2 = 1 # local run()
外部访问内部
局部变量,在函数结束后,就会被销毁
1 2 3 4 5! <def run(): v = 1 run()print(v)NameError: name 'v' is not defined
注意
外部可以赋值,但其实已经不是一个变量了
1 2 3 4 5 6 <def run(): v = 1 run()v = 2print(v)2
内部访问外部
函数内部,可以访问全局变量
1 2 3 4 5 <v = 1def run(): print(v) run()1
内部修改外部
函数内部修改外部变量,实际上是在内部开了一个局部变量,并没有修改外部变量
1 2 3 4 5 6 7 < <v = 1def run(): v = 2 print(v) run()print(v)21
正确做法
增加 global 声明,此时函数内部不会因为出现 变量赋值 而产生局部变量
1 2 3 4 5 6 7 8 < <v = 1def run(): global v v = 2 print(v) run()print(v)22
结论
函数内部 读取 全局变量,可以直接写
函数内部 修改 全局变量,需要添加 global 声明
使用全局变量降低参数传递
使用前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def run(): some = ... func1(some) func2(some) def func1(some): print(some) def func2(some): print(some) run()
使用后
1+2 3 4+5 6*7*8 9 10*11 12 13 14*15 16 17 18 some = None def run(): global some some = ... func1() func2() def func1(): print(some) def func2(): print(some) run()