一, 递归
1, 递归函数, 同时使用嵌套, 并且是将别的函数作用于调用函数里面
例 1
- num = [1,2,3,4,5]
- def add_one(i):
- return i+1
- def reduce(i):
- return i - 1
- def map_test(func,array): #此处为重点
- ret = [ ]
- for n in array:
- re = func(n)
- ret.append(re)
- return ret
- print(map_test(add_one,num))
- print(map_test(lambda x :x**2,num))
- print(list(map(lambda x:x-1,num)))
- [2, 3, 4, 5, 6]
- [1, 4, 9, 16, 25]
- [0, 1, 2, 3, 4]
例 2
- ms = 'ajfklasf'
- print(list(map(lambda x :x.upper(),ms))) #map 后面可传进去的可以是列表字典集合定
- lis2 = ['bjgugong','bjtiananmen','bjxiangshan','motianlun']
- def filter_test(func,array):
- li = []
- for n in array:
- if not func(n):
- li.append(n)
- return li
- def show_bj(ss):
- return ss.startswith('bj')
- print(list(filter_test(show_bj,lis2)))
- li = [2,2,3,100]
- def mult(x,y):
- return x * y
- def reduce_test(func,array,init=None):
- if init is None:
- rr = array.pop(0)
- else:
- rr =init
- for i in array:
- rr = func(rr,i)
- return rr
- print(reduce_test(mult,li,2))
- #注: map filter reduce 三者的区别
- from functools import reduce
- print(reduce(lambda x,y:x * y,li,3))
- ['A', 'J', 'F', 'K', 'L', 'A', 'S', 'F']
- ['motianlun']
- 2400
- 3600
递归示例
- name='地球'
- def china():
- name = "中国"
- print(name)
- def beijing():
- name = "北京"
- print(name)
- def haidian():
- name = '海淀'
- print(name)
- haidian()
- print(name)
- beijing()
- print(name)
- print('*',name)
- china()
- print('**',name)
* 地球
中国
北京
海淀
北京
中国
** 地球
二, 函数的作用域只跟函数声明时定义的作用域有关, 跟函数的调用位置无任何关系
三, 全局变量与局部变量
1, 全局变量: 关键字 global
例 1,
- name = '地球'
- print(name)
- def change_name():
- global name #在函数里面的 name 本身是局部变量的, 由于经过了 global 的声明, 函数内部的 name 变成了全局变量
- name = '中国' #也就是说原来的作用域是函数内部, 现在声明以后的作用域变成了全部
- print('change_name:',name)
- change_name()
- print(name)
地球
change_name: 中国
中国
对比下面的
- name = '地球'
- print(name)
- def change_name():
- name = '中国'
- print('change_name:',name)
- change_name()
- print(name)
地球
change_name: 中国
地球
错误示例如下
- name = '地球'
- print(name)
- def change_name():
- name = '中国'
- global name #既然要声明, 就必须放在被声明变量的上面,, 如果放在下面, 没意义, 运行会出错
- print('change_name:',name)
- change_name()
- print(name)
例 2: 局部可以读取全局变量
- NAME = '地球'
- print(NAME)
- def change_name():
- name = '中国' #在局部不可以对全局变量进行修改, 赋值等, 因为没有关键字 global
- print('change_name:',name ,NAME) #此处在局部读取了全局变量
- change_name()
地球
change_name: 中国 地球
############# 关于全局变量和局部变量的一些规则 ##############
全局变量变量名大写
局部变量变量名小写
在局部里面, 优先读取局部变量; 如果没有关键字 global 声明, 局部也能读取全局变量, 但是在局部无法修改全局变量
但是对于可变类型, 如局部变量, 可以在内部对其进行修改. 即可以对内部元素进行操作
如果函数内部有 global 关键字, 变量本质上就是全局的那个变量, 也就是在局部可以对其读取, 也可以对其进行修改.
2, 局部变量: 关键字 nonlocal
例 1: 没有关键字 nonlocal 的情况
- NAME = '地球'
- print('第一次:',NAME)
- def outward():
- name = '中国'
- def inward():
- name1 = '北京' #此处是关键, 注意细节
- print('inward:',name1)
- inward()
- print(name)
- outward()
第一次: 地球
inward: 北京
中国
例 2: 有 nonlocal 的情况
- NAME = '地球'
- print('第一次:',NAME)
- def outward():
- name = '中国'
- def inward():
- nonlocal name #nonlocal 可以作用到上一层, 但是, 如果只有一层函数, 那么 nonlocal 不能作用到最外层
- name = '北京' #下面还有一个例子
- print('inward:',name)
- inward()
- print('outward:',name)
- outward()
第一次: 地球
inward: 北京
outward: 北京
例 3: 错误示例
- name = '地球'
- print('第一次:',name)
- def outward():
- nonlocal name #报错. nonlocal 不能作用到全局变量的作用域, 它只能在局部向上次一层作用
- name = '中国'
- print(name)
- outward()
来源: http://www.bubuko.com/infodetail-2577907.html