python学习笔记,视频day15-全局变量与局部变量、风湿理论、函数递归

上节课回顾

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

  1. 必须有明确的结束条件
  2.  每进行一次递归,问题的规模比上次递归都减少
  3. 效率不高
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知道,直走左拐就是
View Code

 

原文地址:https://www.cnblogs.com/ppll/p/11545431.html