python之路之函数03
一 首先我们学到函数的嵌套调用与定义:
1 函数嵌套
# def f1():
# print(f1)#我们这里如果输入f1那么输出的则是f1这个变量(函数)所在的地址。如果输入一个字符的话那么就直接输出该字符
# def f2():
# print(f2)
# def f3():
# print(f3)
# f3()
# # f2()
# f1()
那么我们在调用时,必须由外到内,也就是说我们如果想调用f3那么我们必须先通过f1才可以
2 函数的嵌套调用:
在函数内又调用了其他函数。
def max2(x,y):
if x>y:
return x
else:
return y
print(max2(,)) def max3(x,y,z):
res1=max2(x,y)
res2=max2(res1,z)
return res2
res2=max3(,,)
print(res
二 名称空间 namespace
1. 名称空间顾名思义就是存放名字与值绑定关系的地方。
2. 名称空间分为三类:
(1)内置名称空间
存放python解释器自带的名字,如print(),len()等。
当解释器一启动就会生效,也就是说就可以对其进行调用 (2)全局名称空间
用来存放文件级别的名字,只要不在函数里面都叫全局变量。
只在文件执行的时候生效,在文件结束或者文件执行期间被删除则失效。
假如我们定义一个:
x=
def func():
name='egon'
del func#将func删除,
print('====') x=
def f1():
def f2():
print(x)
f2()
f1()
输出结果为1
(3)局部名称空间 用来存放函数内定义的名字,(函数的参数以及函数内的名字都存放于局部名称空间)。
只在函数调用时执行时短暂生效,函数调用结束则失效。 那么对于这三种名称空间,他们加载的顺序就是也就是他们在程序运行的一个加载先后顺序:
内置名称空间---〉全局名称空间---〉局部名称空间
那么查找在程序运行过程中查找的顺序是跟加载顺序相反的:
也就是:局部名称空间--〉全局名称空间---〉内置名称空间 作用域:作用域顾名思义就是作用的范围。
也就是函数所能访问到的范围: 全局作用域:
那么对于内置名称空间和全局名称空间来说,他们具有全局作用域,该范围内的名字会伴随程序整个运行周期,
也就是说程序不结束,那么在任何地方都能调用。 局部作用域:
只是包含局部的名称空间的名字,所以局部作用域只能在函数内部使用,调用函数时生效,调用结束后失效。 三 函数在python中是第一类对象(相当于变量) 1 可以被引用,像变量一样被引用:
变量
x=
y=x 函数
print('from')
def bar():
f=bar#这个时候bar作为一个变量赋给f,那么f()就相当于bar()。
f() ''' def foo():# foo=<function .... x1238102391203>
print('from foo') print(foo)
x=foo
print(x) l=[foo,]
print(l) def print_msg(x):
# print(x)
return x
a='sdfasdfasdfasdfadsf'
res=print_msg(foo)
print(res) '''
2 可以当作参数传入:
def func(a):#我们定义func为有参函数。
a+=
print(a)
func(x) def bar():
print('from bar,1')
def wrapper(func):#这一步相当于fun=bar
func()#那么相当于bar() wrapper(bar)#在这个过程就相当于调用函数wrapper(),我们把函数名bar传入,那么就相当于我们运行bar函数
3可以当作函数的返回值:
1#
x=
def foo():
return x#直接将返回值传给foo
res=foo()
print(res)
2#
x=1
def foo(): 那么我们可以看出13与2#输出的结果是相同的。返回值会返回给函数本身。
print(x)
foo()
作为变量将x赋给foo() def bar(): print('from bar') def foo(func): return func print(bar) f=foo(bar) print(f) f() print(foo)#直接输出变量名,那么我们输出的是变量名所在的地址 x= print(x,id(x))
4 可以当作容器类型的元素。
x=
l=[x]
print(l) def get():
print('from get')
def put():
print('from put')
l=[get,put]
print(l)
l[]()
程序实例
def auth():
print('登录。。。。')
def register():
print('注册')
def search():
print('查看。。')
def pay():
print('支付。。') dic={
'':auth,
'':register,
'':search,
'':pay,
}
print(dic)
def interactive():
while True:
print('''
登陆
注册
查看
支付''')
choice=input('请输入编号:').strip()
if choice in dic:
dic[choice]()
else:
print('非法输入!') interactive()
l=[auth,register,search,]
print(l)
四 闭包函数
闭:指的是定义在函数内部的函数。
作用域:在函数定义阶段就规定死了,与调用位置无关,不管在哪使用都要到原函数定义位置去找。
def outter():
x=
def inner():
x=
print('from inner',x) return inner#在这里我们返回inner就是为了得到inner这个函数,而outter只是起到一个包裹作用。 f=outter()#在调用函数outter时,将inner返回给outter这个函数名,也就是f=inner。
print(f)#输出的为变量inner,也就是inner所对应的地址。
f()#当我们把x=1注释掉之后,会变成x=。
def foo():
x=
f()
foo()
闭包函数:
1、定义在函数内的函数
2、并且该函数包含对外部函数作用域中名字的引用,该函数成为闭包函数。比如上述函数中inner引用了outer中的变量x。
闭包函数说白了就是将一个函数包进另一个函数里面,而且外层函数会给内层被包含函数定义好值,所以内部函数需要值时候先去自己所在层找。
找不到就去外层函数找,但是一般不会到全局找,因为全局变量大家都可以引用,所以闭包函数外层函数专门给闭包函数传值。
传值目的就是为了得到闭包函数的执行结果,所以return。
闭包函数包含对外部作用域的引用而非全局作用域的引用
在被包函数的头上,定义一个变量。
python之路之函数03的更多相关文章
- 小白的Python之路 day3 函数
1.函数基本语法及特性 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 1 2 ...
- Python之路 day3 函数定义 *args及**kwargs
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa import time # def logger(): # time_format ...
- python之路——初识函数
阅读目录 为什么要用函数 函数的定义与调用 函数的返回值 函数的参数 本章小结 返回顶部 为什么要用函数 现在python届发生了一个大事件,len方法突然不能直接用了... 然后现在有一个需求,让你 ...
- python之路(九)-函数装饰器
装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...
- python 之路之函数01
一 函数 1 那么要想学习函数,我们首先应该知道函数是什么? 我们这里所说的函数与数学中的函数是不同的概念,在这里我们可以把函数看成我们写代码过程中需要用到的工具. 2 那么这个‘工具’有什么 ...
- python之路--初识函数
一 . 函数 什么是函数 f(x) = x + 1 y = x + 1 # 函数是对功能或者动作的封装 函数的语法 def 函数名(): 函数体 调用: 函数名() def play(): print ...
- python之路_函数实例及装饰器介绍
一.习题讲解 1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组.例如:[(‘红心’,2), (‘草花’,2), …(‘黑桃,‘A’)] def cards(): num=[] for v ...
- python之路之函数02
一 函数的参数: 我们把函数的参数分为形式参数和实际参数,简称形参和实参. 形参:在定义函数时,函数名括号内定义的参数. 实参:在调用函数时,函数名括号内需要用户传入的值. 注意: 实参值(相当于变 ...
- Python之路----生成器函数进阶
def generator(): print(123) yield 1 print(456) yield 2 g = generator() ret = g.__next__() print('*** ...
随机推荐
- 读博 在没有导师PUSH的情况下该何去何从?
读博已有两月之久,与导师也是仅有的一面之缘,短短数分钟谈话大致总结便是看看基础知识,再然后就没有什么了,突然之间有些小懵逼.突然间感慨这就是我的博士生涯的生活,这就没有啦,以后就这么过啦?在读博士之前 ...
- Java语言基础——数据类型与运算符
标识符: 1.组成元素由字母.数字.下划线.美元符号($) 2.标识符不能以数字开头 3.标识符严格区分大小写 4.标识符的命名要有意义(见名知意) 注释: 1.单行注释 // 2.多行注释 /* 注 ...
- I.MX6 Linux Serial Baud Rate hacking
/******************************************************************************** * I.MX6 Linux Seri ...
- PDF软件推荐——Sumatra PDF - imsoft.cnblogs
Sumatra PDF 优点:绿色,小巧,快速,支持格式丰富 缺点:不支持修改和添加标记 链接: http://pan.baidu.com/s/1eQ1s3Nc 密码: d8h6 主页:http:// ...
- 洛谷 1192:台阶问题(递推,DP)
题目描述 有 N 级的台阶,你一开始在底部,每次可以向上迈最多 K 级台阶(最少 1 级),问到达第 N 级台阶有多少种不同方式. 输入输出格式 输入格式: 两个正整数N,K. 输出格式: 一个正整数 ...
- list.stream().parallel() 并行流
https://blog.csdn.net/u011001723/article/details/52794455/ : parallel()其实就是一个并行执行的流.它通过默认的ForkJoin ...
- Oracle删除归档文件
归档文件过大,会导致数据库出现异常,无法登陆. 1.D盘下新建一个delete_arch.txt文件 connect target / run { DELETE ARCHIVELOG ALL COMP ...
- js模板引擎之juicer,特别好用
中文文档地址 https://www.npmjs.com/package/juicer Juicer基础知识:语法2 http://blog.163.com/lvshutao@126/blog/st ...
- JAVA中@SuppressWarnings注解的作用
eclipse中开发JAVA代码时,经常会出现编译告警符号,影响代码可读性,也影响调试的断点符号正常显示,可以使用@SuppressWarnings注解来抑制这些告警符号的再现.1.抑制单个类型的告警 ...
- Oracle 10g RAC OCR 和 VotingDisk 的备份与恢复
Oracle RAC 中OCR 和Voting Disk 备份在我的blog: Oracle RAC 常用维护工具和命令 中已经有说明,现在再次把它单独拿出做一个说明, 因为OCR 和Voting D ...