一、递归

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沉淀之路--递归、全局变量、局部变量、作用域的更多相关文章

  1. 十九、python沉淀之路--装饰器

    一.实现装饰器的预备知识 装饰器 = 高阶函数 + 函数嵌套 + 闭包 1.高价函数定义: 1.函数接收的参数是一个函数名    2.函数的返回值是一个函数名    3.满足上述条件任意一个,都可称之 ...

  2. 十五、python沉淀之路--eval()的用法

    一.eval函数 python eval() 函数的功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法:eval(source[, globals[, locals]]) -> v ...

  3. 十八、python沉淀之路--生成器

    一.生成器 生成器总结:语法上和函数类似:生成器函数和常规函数几乎是一样的.他们都是使用def语句进行定义,差别在于生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值.自动实 ...

  4. 十六、python沉淀之路--迭代器

    一.迭代器 1.什么是迭代器协议:对象必须提供一个next方法,执行该方法要返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走,不能往前走). 2.可迭代对象:实 ...

  5. 七、python沉淀之路--集合

    一. 1.字符串转集合 s = 'hello' se = set(s) print(se) {'e', 'o', 'h', 'l'} 2.列表转集合 l1 = ['hello','python','n ...

  6. 五、python沉淀之路--字典

    一. 1.根据序列,创建字典,并指定统一的值 v = dict.fromkeys(["],222) print(v) {': 222} 2.根据key 获取值,key不存在时,报错:get方 ...

  7. python沉淀之路~~整型的属性

    python的基础知识: 基本数据类型:int   str   list   tuple   dict   bool 一.整型的属性功能 1.工厂方法将字符串转换成整型 a = " b = ...

  8. 十七、python沉淀之路--三元表达式、列表解析

    一.三元表达式 a = '骑车' res = '好天气' if a == '骑车' else '睡觉' print(res) 睡觉 解析:res = '好天气'        if a == '骑车' ...

  9. 十四、python沉淀之路--文件操作

    一.文件操作b模式 1. # f = open('test11.py','rb',encoding='utf-8') # 这种情况会报错 f = open('test11.py','rb') # b ...

随机推荐

  1. iOS self 和 super 学习

    有人问我 这个问题 回答错了,题干大概是说 [self class] 和 [super class]打印结果 是不是一样的. 我睁着眼睛说是不一样的 .因为我明明记得 几天前 做 DFS 获取反射基类 ...

  2. Matlab命令合集 妈妈再也不用担心我不会用matlab了

    matlab命令 一.常用对象操作:除了一般windows窗口的常用功能键外.1.!dir 可以查看当前工作目录的文件. !dir& 可以在dos状态下查看.2.who 可以查看当前工作空间变 ...

  3. Linux CentOS7安装Mysql5.7

    一.下载mysql mkdir /home/install #创建install目录 在/home/install目录下下载mysql5.7 wget https://cdn.mysql.com//D ...

  4. 关于dispatch_semaphore的使用

    dispatch_semaphore是GCD用来同步的一种方式,与他相关的共有三个函数,分别是 dispatch_semaphore_create,dispatch_semaphore_signal, ...

  5. PHP字符串函数大全

    无论哪种编程语言,字符串操作都是一个重要的基础,往往简单而重要.PHP为我们提供了大量的字符串操作函数,功能强大,使用也比较简单.在这里结合实例总结分析PHP字符串函数的功能. 1.addcslash ...

  6. Python 数值类型

    1.数值类型分为整形(二进制(0b),八进制(0o),十进制,十六进制(0x) ),浮点型,long,complex(复合行) 当我们说十进制数的时候,是逢10进1,就是说到达10的时候就要向前一位进 ...

  7. Linux基本常用命令

    说到Linux,它就是基于POSIX和UNIX的多用户,多任务,支持多线程和多CPU的操作系统.它能运行主要的UNIX的工具软件,应用程序和网络协议.它支持32位和64位硬件.linux继承Unix以 ...

  8. springmvc中url-url-pattern /和/*的区别

    在使用springmvc时,都会在web.xml中配置一个dispatchservlet,如下: <listener> <listener-class> org.springf ...

  9. eclipse安装hibernate插件(在线Marketplace中安装)

    网上很多都是给个网址,然后在eclipse的help中new install soft中安装.每次安装还要去查找最新的地址去安装.为什么不用eclipse的marketplace直接搜索安装呢? 打开 ...

  10. jsp连接sqlServer数据库教程、jsp连接sqlServer数据库报ClassNotFoundException异常

    jsp连接sqlServer数据库教程: 首先讲下我用的工具版本以供参考: jar包:jtds1.3.1.jar  下载地址:点击进入 数据库:SQL Server2012 服务器:Tomcat8.0 ...