一、函数的对象

函数是第一类对象,指的是函数名指向的值(函数)可以被当作数据去使用

def func():# func=函数的内地址print('from func')print(func)age=10
#1. 可以被引用
x=age
print(x,age)f=func
print(f)
f()#2. 可以当作参数传给另外一个函数
def bar(x):print(x)bar(age)
bar(func)#3. 可以当作一个函数的返回值
def bar(x):return xres=bar(age)
print(res)res=bar(func)
print(res)#4. 可以当作容器类型的元素
l=[age,func,func()]
print(l)

二、函数的嵌套

1.函数嵌套分为两大类

1.1函数的嵌套调用:在调用一个函数过程中,其内部代码又调用了其他函数

def max2(x,y):if x > y:return xelse:return ydef max4(a,b,c,d):res1=max2(a,b)#2res2=max2(res1,c)#3res3=max2(res2,d)#4return res3print(max4(1,2,3,4))#4

1.2函数的嵌套定义:一个函数内部又定义了另外一个函数

案例一

def outter():x=1print('from outter')def inner():print('from inner')print(x)print(inner)outter()
#from outter
#1
#<function outter.<locals>.inner at 0x000001D175B7CB70>inner()#无法在外部调用内部函数

案例二

def f1():print('from f1')def f2():print('from f2')def f3():print('from f3')f3()f2()
f1()
#from f1
#from f2
#from f3

案例三

from math import pi
print(pi)#3.141592653589793def circle(radius,action=0):"""圆形相关运算:param radius: 半径:param action: 0代表求面积,1代表求周长:return: 面积或者周长"""def area(radius):return pi * (radius ** 2)def perimiter(radius):return 2 * pi * radiusif action == 0:res=area(radius)elif action == 1:res=perimiter(radius)return resprint(circle(10,0))#314.1592653589793
print(circle(10,1))#62.83185307179586

三、名称空间与作用域

1 什么是名称空间namespace

名称空间就是用来存放名字与值内存地址绑定关系的地方(内存空间)

age=18
但凡查找值一定要通过名字,访问名字必需去查找名称空间

2 名称空间分为三大类

2.1内置名称空间

存放的是python解释器自带的名字
例如:
len
max
print

2.2全局名称空间

存放的是文件级别的名字
例如:以下名字中x\y\z\b\foo都会存放于全局名称空间中

x=1
y=2
if x == 1:z=3while True:b=4breakdef foo():m=3

2.3局部名称空间

在函数内定义的名字
例如:
foo内的m这个名字一定是存放于一个局部名称空间中

2.4生命周期

内置名称空间:在解释器启动时则生效,解释器关闭则失效
全局名称空间:在解释器解释执行python文件时则生效,文件执行完毕后则失效
局部名称空间:只在调用函数时临时产生该函数的局部名称空间,改函数调用完毕则失效

2.4加载顺序

内置->全局->局部

2.5查找名字的顺序

基于当前所在位置往上查找
假设当前站在局部,查找顺序:局部->全局->内置
假设当前站在全局,查找顺序:全局->内置

案列一:

len=111def foo():len=222print(len)foo()
print('站在全局找len: ',len)

案例二

x=111def f1():x=222def f2():def f3():x=444print(x)#444x=333f3()f2()
f1()    

(******)名字的查找顺序,在函数定义阶段就已经固定死了(即在检测语法时就已经确定了名字的查找顺序),与函数的调用位置无关,也就是说无论在任何地方调用函数,都必须回到
当初定义函数的位置去确定名字的查找关系

案列三:

x=111
def outer():def inner():print('from inner',x) # x访问的时全局名称空间中xreturn inner
f=outer()x=222
f()#222

案列四:

x=111
def outer():def inner():print('from inner',x) # x访问的时全局名称空间中xreturn innerf=outer()# x=222
def func():x=333f()x=444func()#444

案列五:

x=111
def outer():def inner():print('from inner',x) # x是来自于当前层的名字,但是此时的x并未定义x=2222222222return innerf=outer()f()

3.作用域:

域指的是范围,作用域指的就是作用的范围,分为两种
全局作用域:包含的是内置名称空间与全局名称空间中的名字
特点:全局有效,全局存活

局部作用域:包含的是局部名称空间中的名字
特点:局部有效,临时存活

案例一

x=1#全局存活def foo():y=2print(x)#1def bar():print(x)#1foo()
bar()

案例二

x=1
def foo():x=2#局部有效
foo()
print(x)#1

案例三

l=[]#这个l是存放在全局空间
def foo():l.append(1)#报错,在局部名称空间中没有ll=33333
foo()
print(l)

global:在局部声明一个名字是来自于全局作用域的,可以用来在局部修改全局的不可变类型

x=1
def foo():global xx=2
foo()
print(x)#2

nonlocal:声明一个名字是来自于当前层外一层作用域的,可以用来在局部修改外层函数的不可变类型

x=0
def f1():x=111def f2():nonlocal x#只能修改当前函数的外面一层而已x=222f2()print(x)#222f1()
print(x)#0

四、闭包函数

1 什么是闭包函数

闭:指的是闭包函数是定义在一个函数内部的函数
包:该内部函数包含对外层函数作用域名字的引用

需要结合函数对象的概念将闭包函数返回到全局作用域去使用,从而打破函数的层级限制

def outter():x=111def inner():print(x)return innerf=outter() #f=outter内的inner

2 为何要用闭包函数

闭包函数提供了一种为函数体传值的解决方案

3 如何用闭包函数

3.1为函数体传值的方式一:参数

def func(x,y):print(x+y)
func(1,2)

3.2为函数体传值的方式二:闭包

def outter(x,y):def func():print(x+y)return funcf=outter(1,2)
f()

3.3案例

需求
def get():
  response=requests.get(url)
  if response.status_code == 200:
    print(response.text)

解决方案一:参数

pip3 install requestsimport requests
def get(url):response=requests.get(url)if response.status_code == 200:print(len(response.text))get('https://www.baidu.com')
get('https://www.baidu.com')
get('https://www.baidu.com')
get('https://www.tmall.com')
get('https://www.tmall.com')url1='https://www.baidu.com'
url2='https://www.tmall.com'get(url1)
get(url1)
get(url1)get(url2)
get(url2)
get(url2)

解决方案二:闭包

def outter(url):# url='https://www.baidu.com'def get():response=requests.get(url)if response.status_code == 200:print(len(response.text))return getbaidu=outter('https://www.baidu.com')tmall=outter('https://www.tmall.com')

转载于:https://www.cnblogs.com/yuanxiaohui/p/10280354.html

10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数相关推荐

  1. python 函数可以作为容器对象的元素_python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义...

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  2. Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)

    文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...

  3. 函数对象 函数嵌套 名称空间与作用域

    函数对象: 函数是第一类对象,即函数可以当做数据传递 1 可以被引用 2 可以当做参数传递 3 返回值可以是函数  (函数名 不带() 就是函数名的内存地址,带括号就是执行函数) 4 可以当做容器类型 ...

  4. 函数对象,嵌套,空间与作用域

    一:函数对像 #函数是第一类对象的含义是函数可以被当作数据处理 1,可以被引用: 2,可以当作参数传给另一个函数. 3,可以当作函数的返回值. 4.可以当作容器类型的元素. 例子:def pay(): ...

  5. python基础之名称空间和作用域、函数嵌套

    一.名称空间 1.定义:存放名字与值的绑定关系 2.名称空间分为:内置名称空间.全局名称空间.局部名称空间 内置名称空间:python解释器自带的名字,python解释器启动就会生成 全局名称空间:文 ...

  6. python函数的全局、局部名称空间及作用域

    """ a = 1 def func(): return func() 开辟一个-全局名称空间(当前py文件),将这些对应关系储存在里面,函数是储存成func:funct ...

  7. Python入门学习---第四天

    面向对象编程 类和实例 概念与其他面向对象编程语言类似. 以Student类为例,在Python中,定义类是通过class关键字: class Student(object):pass (object ...

  8. Python入门学习笔记1-Python基础

    Python入门学习笔记1-Python基础 前言:本文介绍了Python学习的前导知识概念以及必记基础函数,如善用help方法查看帮助文档,以及内置对象类型的概念以及常用函数的详解. 一.Pytho ...

  9. 用python画哆啦a梦的身体_每天一个Python小技巧,用Python 画个多啦A梦,小猪佩奇,文末还有Python入门学习视频...

    见网络上有人用Python 画出来个多啦A梦,很是新奇,来来来,我们看一下他们主要用到的库. 其实主要用的库就一个 turtle 库 先说明一下turtle绘图的基础知识: 1. 画布(canvas) ...

最新文章

  1. linux ssh关闭后台程序不终止
  2. Ubuntu下安装node和npm
  3. Hibernate Annotation _List/Map
  4. 零基础如何学习Java?你要注意的8件事
  5. 一条标准SQL语句是怎么执行之“步步惊心”过程详解与案例分析
  6. 无影云电脑居家办公最佳实践(AD域账号)
  7. 2018第二届河北省大学生程序设计竞赛题解
  8. PHP云尚发卡,云尚发卡1.5.7添加(极客支付)
  9. python实现二分类_感知器做二分类的原理及python numpy实现
  10. 红帽linux系统服务器下载,redhat linux 下载地址大全 完全整理
  11. 数字孪生港珠澳大桥:大湾区综合管理信息系统
  12. 【python中级】linux系统获得计算机网卡流量
  13. 第二十五届全国青少年信息学奥林匹克联赛初赛
  14. 2022Q4手机银行新版本聚焦提升客群专属、财富开放平台、智能化能力,活跃用户规模6.91亿人
  15. 云时代的阡陌纵横”的数据网络?
  16. ARM中的MOV指令
  17. 2020上半年总结:逆势上行与困顿迷茫
  18. java开发必须安装jre吗_安装jdk后还需要安装jre吗
  19. Gannicus Guo的DIY TCP/IP 连载目录
  20. 【牛客练习赛59】A:小乔和小灰灰

热门文章

  1. Hyperledger Fabric CA User’s Guide——概述(二)
  2. 在Win7旗舰版安装并运行LoadRunner11
  3. 北京治堵新方案出台了!
  4. java多线程设计wait、notify、notifyall、synchronized的使用机制
  5. SCM系统(Supply Chain Management System,供应链管理系统)
  6. VUE2中axios的使用方法
  7. [Java] 蓝桥杯ALGO-80 算法训练 整数平均值
  8. L1-048 矩阵A乘以B-PAT团体程序设计天梯赛GPLT
  9. 浮点错误的意思-PAT 、OJ
  10. 台式电脑接路由器步骤_台式电脑怎么连接无线路由器