一、递归

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. Loadrunder之脚本篇——检查点

    VuGen判断脚本是否执行成功是根据服务器返回的状态来确定的,如果服务器返回的是HTTP状态为200 OK,那么VuGen就认为脚本正确地运行了,并且是运行通过的.而大多数系统出错时是不会返回错误页面 ...

  2. ES集群性能调优链接汇总

    1. 集群稳定性的一些问题(一定量数据后集群变得迟钝) https://elasticsearch.cn/question/84 2. ELK 性能(2) — 如何在大业务量下保持 Elasticse ...

  3. asp.net 移除Server, X-Powered-By, 和X-AspNet-Version头

    我们在开发Asp.net中,最后部署在IIS上. 然后发送HTTP请求,返回的HTTP头中包含Server, X-Powered-By, 和 X-AspNet-Version信息. 这些信息有时给攻击 ...

  4. C# 调用VS自带程序WebDev.WebServer40.EXE 源代码

    通过Process.Start启动,VS自带程序WebDev.WebServer40.EXE 在内网架设网站时,为安装IIS条件下用VS自带的小程序来测试效果非常不错! using System; u ...

  5. UVA11297 Census

    题目 UVA11297 Census 做法 二维线段树,单点修改,矩阵查询,树套树(\(x,y\)),维护最大值最小值废话 有一点要注意的是:\(x\)树传到\(y\)树里面修改的时候,如果\(x\) ...

  6. ARC 与非ARC 之间的转换,以及如何使一个项目中,ARC与非ARC共存

    1,非ARC 转 ARC的操作 XCode 的 Edit -- Refactor -- Convert to Object-C ARC (注意,一般在一个大项目中,很少直接使用此方法,其正确率有待考虑 ...

  7. QT应用程序设置图标

    一.纯Qt 1.下载图标:app.ico 2.新建记事本,输入:IDI_ICON1 ICON DISCARDABLE"app.ico":改变名字为jude.rc 3.将两个文件放在 ...

  8. Kubernetes Metrics-Server

    github地址:https://github.com/kubernetes-incubator/metrics-server 官网介绍:https://kubernetes.io/docs/task ...

  9. C++字符串操作库函数

    #include <bits/stdc++.h> using namespace std; int main() { ]="; ]="abcdefg"; ]= ...

  10. HDU 2603 二分匹配

    #include <queue>#include <vector>#include <cstdio>#include <cstring>#include ...