九、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 ...
随机推荐
- Loadrunder之脚本篇——检查点
VuGen判断脚本是否执行成功是根据服务器返回的状态来确定的,如果服务器返回的是HTTP状态为200 OK,那么VuGen就认为脚本正确地运行了,并且是运行通过的.而大多数系统出错时是不会返回错误页面 ...
- ES集群性能调优链接汇总
1. 集群稳定性的一些问题(一定量数据后集群变得迟钝) https://elasticsearch.cn/question/84 2. ELK 性能(2) — 如何在大业务量下保持 Elasticse ...
- asp.net 移除Server, X-Powered-By, 和X-AspNet-Version头
我们在开发Asp.net中,最后部署在IIS上. 然后发送HTTP请求,返回的HTTP头中包含Server, X-Powered-By, 和 X-AspNet-Version信息. 这些信息有时给攻击 ...
- C# 调用VS自带程序WebDev.WebServer40.EXE 源代码
通过Process.Start启动,VS自带程序WebDev.WebServer40.EXE 在内网架设网站时,为安装IIS条件下用VS自带的小程序来测试效果非常不错! using System; u ...
- UVA11297 Census
题目 UVA11297 Census 做法 二维线段树,单点修改,矩阵查询,树套树(\(x,y\)),维护最大值最小值废话 有一点要注意的是:\(x\)树传到\(y\)树里面修改的时候,如果\(x\) ...
- ARC 与非ARC 之间的转换,以及如何使一个项目中,ARC与非ARC共存
1,非ARC 转 ARC的操作 XCode 的 Edit -- Refactor -- Convert to Object-C ARC (注意,一般在一个大项目中,很少直接使用此方法,其正确率有待考虑 ...
- QT应用程序设置图标
一.纯Qt 1.下载图标:app.ico 2.新建记事本,输入:IDI_ICON1 ICON DISCARDABLE"app.ico":改变名字为jude.rc 3.将两个文件放在 ...
- Kubernetes Metrics-Server
github地址:https://github.com/kubernetes-incubator/metrics-server 官网介绍:https://kubernetes.io/docs/task ...
- C++字符串操作库函数
#include <bits/stdc++.h> using namespace std; int main() { ]="; ]="abcdefg"; ]= ...
- HDU 2603 二分匹配
#include <queue>#include <vector>#include <cstdio>#include <cstring>#include ...