Py变量,递归,作用域,匿名函数

局部变量与全局变量

全局变量:全局生效的变量,在顶头的,无缩进的定义的变量。

局部变量:函数内生效的变量,在函数内定义的变量。

name='1fh'
def changename():
    name='sb'
    print('shi',name)
changename()
print(name)

 

函数里的局部变量无法改变修改全局变量

而global可以使函数内出现的函数名变成全局变量处理

那个局部变量可以读取可以赋值

name='1fh'
def changename():
    global name
    name='sb'
    print('shi',name)
changename()
print(name)

 

一般全局变量大写,局部变量小写。

指定上一级的变量nonlocal

def xiba():
    name = 'shit'
    print(name)
    def xiba1():
        nonlocal name
        name = 'abcd'
    xiba1()
    print(name)
xiba()

 

前向引用:

如果执行一个函数时里面要调用另外一个函数,而另外一个函数在调用函数的后面才

定义,这种情况会出现报错

错误示例
def foo():
    print('from foo')
    bar()
foo()
def bar():
    print('from bar')

 

递归:一层一层往下,在函数内部,不断调用自己,死循环会报错,要有结束条件

def calc(n):
    print(n)
    if int(n/2) ==0:
        return n
    return calc(int(n/2))   #不断调用自己
calc(10)

 

递归加强版

person_list=['alex','wupeiqi','yuanhao','linhaifeng','sb','sb1']
def ask_way(person_list):
    answer1='没有人知道位置'
    answer2 = '知道位置'
    if len(person_list) == 0:
        return answer1
    person = person_list.pop(0)  # pop是删除第一个位置的元素,并取得这个元素的值
    print(person)
    if person =='linhaifeng':
        return answer2
    else:
        print('this man dont know the way',person)
        return ask_way(person_list)     #注意递归的语句要前面要加上return,否则返回值会变成none出错
abcd=ask_way(person_list)
print(abcd)

 

作用域:函数的执行与进行def定义的那段有关,与在哪调用无关

这里返回的函数名的意思是返回这个函数名所占用的内存地址

def test1():
    print('in the test1')
    return test1
res= test1()
print(res)

 

作用域示例:

name = 'alex'
def foo():
    name = 'lhf'
    def bar():
        name='abcd'
        print(name)
    bar()            #这个bar可以成功调用,因为她与def bar同级
foo()
bar()        #这个bar不能成功调用会报错,因为它是def bar的上一级

 

针对报错的问题,可以将bar函数的内存地址弄出来,然后直接对内存地址进行调用

name = 'alex'
def foo():
    name = 'lhf'
    def bar():
        name='abcd'
        print(name)
        return foo    #注意这个return是bar的返回值
    return bar      #注意这个return是foo的返回值
resbar=foo()
resbar()
sb= resbar()
print(sb)

 

匿名函数

1定义方法:

使用lambda定义。lambda 形参名:处理的方法
lambda可以随便赋予名字,平常不占用内存
比如以下这段函数
def calc(x):
    return x+1
res = calc(10)
print(res)

 

等同于
func=lambda x:x+1
print(func(10))

 

比如下面这段函数
name = 'alex'
def changename(x):
    return name+'sb'
res=changename('alex')
print(res)

 

等同于
name=input('press the name')
res=lambda x:str(name)+'sb'
print(res(name))

 

可以包含多个形参

func=lambda x,y,z:(x+1,y+1,z+1)
print(func(1,3,4))

 

posted @ 2020-09-18 22:10  克莱比-Kirby  阅读(192)  评论(0)    收藏  举报