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))

浙公网安备 33010602011771号