九、python沉淀之路--递归、全局变量、局部变量、作用域
一、递归
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()
九、python沉淀之路--递归、全局变量、局部变量、作用域的更多相关文章
- 十九、python沉淀之路--装饰器
一.实现装饰器的预备知识 装饰器 = 高阶函数 + 函数嵌套 + 闭包 1.高价函数定义: 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个,都可称之 ...
- 十五、python沉淀之路--eval()的用法
一.eval函数 python eval() 函数的功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法:eval(source[, globals[, locals]]) -> v ...
- 十八、python沉淀之路--生成器
一.生成器 生成器总结:语法上和函数类似:生成器函数和常规函数几乎是一样的.他们都是使用def语句进行定义,差别在于生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值.自动实 ...
- 十六、python沉淀之路--迭代器
一.迭代器 1.什么是迭代器协议:对象必须提供一个next方法,执行该方法要返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走,不能往前走). 2.可迭代对象:实 ...
- 七、python沉淀之路--集合
一. 1.字符串转集合 s = 'hello' se = set(s) print(se) {'e', 'o', 'h', 'l'} 2.列表转集合 l1 = ['hello','python','n ...
- 五、python沉淀之路--字典
一. 1.根据序列,创建字典,并指定统一的值 v = dict.fromkeys(["],222) print(v) {': 222} 2.根据key 获取值,key不存在时,报错:get方 ...
- python沉淀之路~~整型的属性
python的基础知识: 基本数据类型:int str list tuple dict bool 一.整型的属性功能 1.工厂方法将字符串转换成整型 a = " b = ...
- 十七、python沉淀之路--三元表达式、列表解析
一.三元表达式 a = '骑车' res = '好天气' if a == '骑车' else '睡觉' print(res) 睡觉 解析:res = '好天气' if a == '骑车' ...
- 十四、python沉淀之路--文件操作
一.文件操作b模式 1. # f = open('test11.py','rb',encoding='utf-8') # 这种情况会报错 f = open('test11.py','rb') # b ...
随机推荐
- $git学习总结系列(1)——基本用法
廖雪峰的官方网站:http://www.liaoxuefeng.com/ 本文是学习廖雪峰的官方网站上git教程git基本用法的总结,详细内容可以进入廖雪峰的官方网站查看. 注:本文中的主要内容都是基 ...
- Raspberry Pi开发之旅-WIFI遥控小车
一.简单介绍树莓派的GPIO口 上图是树莓派2代的接口(不同型号接口会有差异),我们就以此为例来说下这些接口. 1.GPIO介绍 GPIO 英文全称是:General-purpose input/ou ...
- opencv manager package was not found 解决办法
http://blog.csdn.net/zjck1995/article/details/50358817 从网上好不容易找到的一个方法 1 解压OpenCV sdk 压缩包 2 eclipse 导 ...
- CSS3手风琴菜单 可同时折叠多个菜单
在线演示 本地下载
- PreTranslateMessage作用和使用方法
PreTranslateMessage作用和使用方法 PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用, ...
- 斯坦福机器学习视频笔记 Week9 异常检测和高斯混合模型 Anomaly Detection
异常检测,广泛用于欺诈检测(例如“此信用卡被盗?”). 给定大量的数据点,我们有时可能想要找出哪些与平均值有显着差异. 例如,在制造中,我们可能想要检测缺陷或异常. 我们展示了如何使用高斯分布来建模数 ...
- (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
说明:Statement stmt = con.createStatemen=(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY ...
- Oracle、Mysql、SqlServer创建表和给表和字段加注释
一.Oracle --创建表 create table test ( id varchar2(200) primary key not null, sort number, ...
- linux 安装jdk1.7 环境
由于各Linux开发厂商的不同,因此不同开发厂商的Linux版本操作细节也不一样,今天就来说一下CentOS下JDK的安装: 方法一:手动解压JDK的压缩包,然后设置环境变量 1.在/usr/目录下创 ...
- Windows系统 本地文件如何复制到远程服务器
很多人在使用远程服务器的时候往往要将本地的文件传输到远程服务器内,方法有很多种,下面介绍下如何使用Windows自带的远程桌面连接程序将文件复制到远程服务器内. 1.首先,点击windows开始按钮, ...