九、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 ...
随机推荐
- 我的npm笔记
本文记录一些npm的使用技巧,主要包括自己常用的命令,做个备忘. NPM 是什么? NPM是NodeJS的包管理工具,现在已经进一步发展,致力于为很多其他平台提供包管理工具,其核心思想就是让包的安装更 ...
- 生成sql表结构
DataConstruct.php <?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/7/21 * Time ...
- Shell编程之Linux信号及信号跟踪
一.Linux信号 1.什么是信号? Linux信号是由一个整数构成的异步消息,它可以由某个进程发给其他进程,也可以在用户按下特定键发生某种异常事件时,由系统发给某个进程. 2.信号列表 [root@ ...
- readonly与disabled
readonly与disabled都能将元素设为不可编辑状态,但他们有许多区别: 1.样式 readonly与一般样式一样,disabled会将元素背景设为灰色 2.应用范围 readonly只对in ...
- JavaWeb Request和Response
1. Request与Response 1.1. Web应用运行机制 到目前为止,我们已经掌握了Web应用程序的运行机制,现在学习的就是Web应用程序运行机制中很重要的内容 —— Request与Re ...
- JAVAWeb学习总结(一)
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- webpack 从0 手动配置
1. npm init 2. npm install -D webpack webpack-cli 3. 创建webpack入口文件( 默认 webpack.config.js 可以通过 webpac ...
- hive学习5(复制表结构)
hive复制表结构 CREATE TABLE new_table LIKE old_table; 例:创建一个和stg_job表一样表结构的s_job表 create table s_job like ...
- HDFS数据完整性
数据完整性 Hadoop用户肯定都希望系统在存储和处理数据时不会丢失或损坏任何数据.尽管磁盘或网络上的每个I/O操作不太可能将错误引入自己正在读/写的数据中,但是如果系统中需要处理的数据量大到Hado ...
- JConsole操作手册
一篇Sun项目主页上介绍JConsole使用的文章,前段时间性能测试的时候大概翻译了一下以便学习,今天整理一下发上来,有些地方也不知道怎么翻,就保留了原文,可能还好理解点,呵呵,水平有限,翻的不好,大 ...