10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数
一、函数的对象
函数是第一类对象,指的是函数名指向的值(函数)可以被当作数据去使用
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入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数相关推荐
- python 函数可以作为容器对象的元素_python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义...
复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...
- Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)
文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...
- 函数对象 函数嵌套 名称空间与作用域
函数对象: 函数是第一类对象,即函数可以当做数据传递 1 可以被引用 2 可以当做参数传递 3 返回值可以是函数 (函数名 不带() 就是函数名的内存地址,带括号就是执行函数) 4 可以当做容器类型 ...
- 函数对象,嵌套,空间与作用域
一:函数对像 #函数是第一类对象的含义是函数可以被当作数据处理 1,可以被引用: 2,可以当作参数传给另一个函数. 3,可以当作函数的返回值. 4.可以当作容器类型的元素. 例子:def pay(): ...
- python基础之名称空间和作用域、函数嵌套
一.名称空间 1.定义:存放名字与值的绑定关系 2.名称空间分为:内置名称空间.全局名称空间.局部名称空间 内置名称空间:python解释器自带的名字,python解释器启动就会生成 全局名称空间:文 ...
- python函数的全局、局部名称空间及作用域
""" a = 1 def func(): return func() 开辟一个-全局名称空间(当前py文件),将这些对应关系储存在里面,函数是储存成func:funct ...
- Python入门学习---第四天
面向对象编程 类和实例 概念与其他面向对象编程语言类似. 以Student类为例,在Python中,定义类是通过class关键字: class Student(object):pass (object ...
- Python入门学习笔记1-Python基础
Python入门学习笔记1-Python基础 前言:本文介绍了Python学习的前导知识概念以及必记基础函数,如善用help方法查看帮助文档,以及内置对象类型的概念以及常用函数的详解. 一.Pytho ...
- 用python画哆啦a梦的身体_每天一个Python小技巧,用Python 画个多啦A梦,小猪佩奇,文末还有Python入门学习视频...
见网络上有人用Python 画出来个多啦A梦,很是新奇,来来来,我们看一下他们主要用到的库. 其实主要用的库就一个 turtle 库 先说明一下turtle绘图的基础知识: 1. 画布(canvas) ...
最新文章
- linux ssh关闭后台程序不终止
- Ubuntu下安装node和npm
- Hibernate Annotation _List/Map
- 零基础如何学习Java?你要注意的8件事
- 一条标准SQL语句是怎么执行之“步步惊心”过程详解与案例分析
- 无影云电脑居家办公最佳实践(AD域账号)
- 2018第二届河北省大学生程序设计竞赛题解
- PHP云尚发卡,云尚发卡1.5.7添加(极客支付)
- python实现二分类_感知器做二分类的原理及python numpy实现
- 红帽linux系统服务器下载,redhat linux 下载地址大全 完全整理
- 数字孪生港珠澳大桥:大湾区综合管理信息系统
- 【python中级】linux系统获得计算机网卡流量
- 第二十五届全国青少年信息学奥林匹克联赛初赛
- 2022Q4手机银行新版本聚焦提升客群专属、财富开放平台、智能化能力,活跃用户规模6.91亿人
- 云时代的阡陌纵横”的数据网络?
- ARM中的MOV指令
- 2020上半年总结:逆势上行与困顿迷茫
- java开发必须安装jre吗_安装jdk后还需要安装jre吗
- Gannicus Guo的DIY TCP/IP 连载目录
- 【牛客练习赛59】A:小乔和小灰灰
热门文章
- Hyperledger Fabric CA User’s Guide——概述(二)
- 在Win7旗舰版安装并运行LoadRunner11
- 北京治堵新方案出台了!
- java多线程设计wait、notify、notifyall、synchronized的使用机制
- SCM系统(Supply Chain Management System,供应链管理系统)
- VUE2中axios的使用方法
- [Java] 蓝桥杯ALGO-80 算法训练 整数平均值
- L1-048 矩阵A乘以B-PAT团体程序设计天梯赛GPLT
- 浮点错误的意思-PAT 、OJ
- 台式电脑接路由器步骤_台式电脑怎么连接无线路由器