上节课回顾
1.函数
数学中函数:y=2*x+1
python中参数:
def test(x,y,type=None):
"注释"
代码块
return res
函数名代表内存地址、引用,调用时要加括号
2.参数
形参---调用时占内存,不调用时释放内存
实参--占内存
位置参数一一对应
关键字参数
默认参数
位置参数在关键字参数左边
3.
def test(x,*args,**kwargs):
"注释"
代码块
return res
4.函数好处:
减少重复代码
易维护
可扩展
全局变量与局部变量
- 全局变量:没有任何的缩进,在全局生效的变量
- 局部变量:子程序中定义的变量
- 只有函数有私密功能
- 解释器从上到下运行,遇到函数只编译不执行
规则:全局变量变量名大写,局部变量吧变量名小写
global全局变量、nonlocal上一级变量
name="yangzi"#全局变量 def change_name(): name="jinmi"#局部变量 print("chang_name",name) change_name() print(name) # 结果 # chang_name jinmi # yangzi
global
如果函数的内容无global关键字
优先读取局部变量,无局部变量时,能读取全局变量,无法对全局变量进行赋值;对于可变变量可以对内部元素进行操作
- 有声明局部变量
name="yangzi" def change_name(): name="jinmi" print("chang_name",name) change_name() # 结果 # chang_name jinmi
- 无声明局部变量
name="yangzi" def change_name(): print("chang_name",name) change_name() # 结果 # chang_name yangzi
name=["yangzi","jingtian"] def change_name(): name.append("123") print("chang_name",name) change_name() # 结果 # chang_name yangzi
有global关键字,变量本质上就是全局变量,可读取赋值
name=["产品经理","qianyue"] def change_name(): global name name="jinmi" print("chang_name",name) change_name() print(name) # 结果 # chang_name jinmi # jinmi
NAME ="海峰" def name1(): name="huang" print(name) def liuyang(): name="liuyang" print(name) def mulige(): name="huzhihua" print(name) print(name) mulige() liuyang() print(name) name1() # 结果 # huang # liuyang # liuyang # huzhihua # huang
#global全局变量
name ="yangzi" def weihou(): name="chenzhuo" def weiweihou(): global name name="lengjin" weiweihou() print(name) print(name) weihou() print(name) # 结果 # yangzi # chenzhuo # lengjin
# nonlocal上一级变量 name ="yangzi" def weihou(): name="chenzhuo" def weiweihou(): nonlocal name name="lengjin" weiweihou() print(name) print(name) weihou() print(name) # 结果 # yangzi # lengjin # yangzi
风湿理论
函数即变量
def foo(): print("from foo") bar() def bar(): print("from bar") foo() # 结果 # from foo # from bar def foo(): print("from foo") bar() foo() def bar(): print("from bar") # 报错
函数递归(在自己内部调用自己)
函数如何终止===return
- 必须有明确的结束条件
- 每进行一次递归,问题的规模比上次递归都减少
- 效率不高
def calc(n): print(n) if int(n/2)==0: return n res=calc(int(n/2)) return res res=calc(10) print(res) # 结果 # 10 # 5 # 2 # 1 # 1
# 问路 import time person_list=["alex","wupeiqi","linhaifeng","zsc"] def ask_way(person_list): if len(person_list)==0: return "无人知晓"#print不会终止,return会终止 # 针对传的是空列表,所以person_list.pop(0)放在 if len(person_list)==0:后 person=person_list.pop(0)#一次从列表中弹出一个 if person=="linhaifeng": # return 给wupeiqi return "%s知道,直走左拐就是"%person print("%s,敢问路在何方"%person) print("%s答:我帮你问问%s"%(person,person_list)) print("__________") time.sleep(1) res=ask_way(person_list)#上面要有一个明确的返回值 print("%s问的结果是:%res"%(person,res)) return res res =ask_way(person_list) print(res) # 结果 # alex,敢问路在何方 # alex答:我帮你问问['wupeiqi', 'linhaifeng', 'zsc'] # wupeiqi,敢问路在何方 # wupeiqi答:我帮你问问['linhaifeng', 'zsc'] # wupeiqi问的结果是:'linhaifeng知道,直走左拐就是'es # alex问的结果是:'linhaifeng知道,直走左拐就是'es # linhaifeng知道,直走左拐就是

# 问路 import time person_list=["alex","wupeiqi","linhaifeng","zsc"] def ask_way(person_list): if len(person_list)==0: return "无人知晓"#print不会终止,return会终止 # 针对传的是空列表,所以person_list.pop(0)放在 if len(person_list)==0:后 person=person_list.pop(0)#一次从列表中弹出一个 if person=="linhaifeng": # return 给wupeiqi return "%s知道,直走左拐就是"%person print("%s,敢问路在何方"%person) print("%s答:我帮你问问%s"%(person,person_list)) print("__________") time.sleep(1) res=ask_way(person_list) # print("%s问的结果是:%res"%(person,res)) return res res=ask_way(person_list) print(res) # 结果 # alex,敢问路在何方 # alex答:我帮你问问['wupeiqi', 'linhaifeng', 'zsc'] # __________ # wupeiqi,敢问路在何方 # wupeiqi答:我帮你问问['linhaifeng', 'zsc'] # __________ # linhaifeng知道,直走左拐就是