函数嵌套:
函数嵌套:
嵌套指的是,一个物体包含另一个物体,函数嵌套就是一个函数包含另一个函数
按照函数的两个阶段
嵌套调用
指的是在函数的执行过程中调用了另一个函数,其好处可以简化外层大函数的代码,使得结构更清晰
可以将一个大的复杂的功能拆成多个简单的小功能

嵌套调用的好处:

def max(a,b):
if a>b:
return a
return b
print(max(100,200))
嵌套调用:

def max_3(a,b,c):
temp=max(a,b)
m=max(temp,c)
return m
print(max_3(100,200,300))

def func1():
print('func1 run !')
def func2():
print('func2 run !')
func1()
func2()
嵌套定义
值得是在函数的函数体中定义了另一个函数体称作为函数的嵌套定义
特点:
需要注意的是,内部定义的函数只能在内部使用,外部无法直接访问,
唯一的使用场景是闭包函数,除此之外不要这么写

def outer():
print('outer run')
def inner():
print('inner run')
inner()
outer()
名称空间:
存储名字的内存区域
名称空间的分类:
x=10
内置名称空间:存的是解释器自带的名称print len ...
顺着解释器的启动二生效,随着解释器关闭而失效

在任何位置都能访问到

全局名称空间:
只要是顶着最左边写的没有任何缩进的,就在全局名称空间中
程序运行的过程中,在所有位置都能访问到一直有效,随着文件的结束而失效
需要注意的是在 if 中,如果if是顶着最左边的没有缩进的,if里面的名字也是全局变量
同样的 while,for,with,都是如此
if 1==1:
age=18 全局变量
print(age)

局部名称空间
存的是函数内部定义的名字,
特点:仅在函数调用中零时有效
生命周期:随着函数的调用而生效,随着函数的调用结束而失效
名字查找顺序:
局部》--全局>>--内置
名称空间的加载顺序
内置》-全局》》--局部

作用域:
作用区域,作用范围,有效范围
简单的说就是名字的有效范围
存储名字的有三个范围
内置名称空间
全局名称空间

局部名称空间 :
由于内置名称空间的名字与全局名称空间的名字,可以在任何位置来访问
所以他们两可以划分到同一个范围内,称作全局作用域

局部名称空间的名字,只能在当前的函数中访问,所以他划到了单独的 一个范围中
这个范围称之为局部作用的范围即局部作用域
global(全局) 与 nonlocal (不使用本地)关键字
global 当需要在函数内部修改全局名字值得时候需要使用global
注意,必须在使用这个名字之前声明写(global)
a=100
def func():
global a
a=1# 改写法,既有修改a的值得意思,也有定义变量的意思 默认在函数中都是定义新的变量
func()
print(a)
应用场景
is_login = False
# def login(name,pwd):
# global is_login
# if name == "cgon" and pwd == "8848":
# print("登录成功!")
# is_login = True
#
# login("cgon","8848")
# print(is_login)

nonlocal
当需要在内层函数中修改外层函数中的名字,就是需要nonlocal
会一层一层的往外找,直到找到了找到位置,但是只能在函数中找,不能找全局

a=0
def f1():
# a = 1
# def f2():
# def f3():
# nonlocal a
# a = 3
# f3()
# print("f2 中的a", a)
# f2()
# print("f1 中的a",a)
# f1()
# print("全局的a",a)
#

函数对象
目的是为了让你知道 函数都可以怎么使用
面向对象经典语录:
万物皆对象
函数是第一类对象
1、能够被调用,
2、可以当做容器类型的元素
3、可以当做函数的参数
4、可以当做函数的返回值
函数名除了可以调用之外与一个变量名,没有什么区别,函数名怎么用变量名怎么用

闭包函数;
闭包:一个函数将另一个函数关闭在内部,反着来说一个函数被另一个函数包裹
闭包函数也是一种函数
特点:
1、该函数是定义在另一个函数中的
2、该函数包含了对外层函数中名字的引用,无论在任何位置使用这个函数,其都包含了外部名字的引用
满足以上两条,就称之为闭包函数
需要注意的是:名字所在的作用域 在函数定义阶段就已经固定了,与调用位置无关
现阶段可以将闭包函数理解为另一种为函数传值的方式
之前只能通过参数给函数传值
现在可以通过闭包的方式

  def counter():
n=0
def incr():
nonlocal n
x=n
n+=1
return x
return incr c=counter()
print(c())
print(c())
print(c())
print(c.__closure__[0].cell_contents) #查看闭包的元素

def func1():
def func2():
pritn('func2,run')
func2()

func1()

由于名称空间与作用域的特点,内层定义的对象只能在函数内使用
而函数对象可以将一个函数作为返回值,使得内部函数也可以被外界使用

outer():
    name = "扎尔伯克"
    def inner():
        print("name :",name)
#   inner()
    return inner

inner = outer()
name = "比尔盖茨"
inner()

闭包函数的应用:
"""

"""
import requests

def get_page(url):
res = requests.get(url)
return res.text

def load(url):# url = https://www.qq.com
# 把URL函数包给get_page函数
def get_page():
res = requests.get(url)
return res.text
return get_page

qq = load("https://www.qq.com") # 拿到get_page的同时 也拿到了包裹的url参数
res = qq()
print(res)
print("==========================================================")
res2 = qq()
print(res2)

# qq = get_page("https://www.qq.com")

day12 函数的嵌套调用 闭包函数,函数对象的更多相关文章

  1. Python基础--函数的嵌套和闭包

    一.名称空间和作用域 名称空间:Python所有有关命名的操作都是在操作名称空间,例如变量名,函数名 1.内置名称空间:Python解释器提供好的功能,解释器启动跟着一起启动,是全局作用域 2.全局名 ...

  2. Python中函数的嵌套及闭包

    函数的嵌套 调用:在函数中调用函数 定义:在函数中定义函数 地址:函数名有内存地址,内存地址可赋值 示例 a = 1 def outer(): a = 1 def inner(): a = 2 def ...

  3. Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

    本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...

  4. python—day9 函数的定义、操作使用方法、函数的分类、函数的嵌套调用

    一.函数的定义 函数的四个组成部分: 函数名. 函数体. 函数返回值. 函数参数 1.概念:重复利用的工具,可以完成特定功能的代码块,函数是存放代码块的容器 2.定义: def:声明函数的关键词 函数 ...

  5. day11函数的参数,函数对象 - 函数名,函数的嵌套调用

    复习 # 什么是函数:具体特定功能的代码块 - 特定功能代码块作为一个整体,并给该整体命名,就是函数 # 函数的优点: # 1.减少代码的冗余 # 2.结构清晰,可读性强 # 3.具有复用性,开发效率 ...

  6. sh_07_函数的嵌套调用

    sh_07_函数的嵌套调用 def test1(): print("*" * 50) def test2(): print("-" * 50) # 函数的嵌套调 ...

  7. JS的一些总结(函数声明和函数表达式的区别,函数中的this指向的问题,函数不同的调用方式,函数也是对象,数组中的函数调用)

    一.函数声明和函数表达式的区别: 函数声明放在if——else语句中,在IE8中会出现问题 函数表达式则不会 <script> if(true){ function f1(){ conso ...

  8. day20 Python 高阶函数,函数,嵌套,闭包 装饰器

    高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo(): ...

  9. python函数基础:调用内置函数&定义函数

    调用内置函数 有很多内置函数,在使用中需要积累.这里只举两个例子: 分别调用abs和数据类型转换,注意当入参类型错误时候会报错 ''' print('abs(-100)') abs(-100) pri ...

随机推荐

  1. Java基础_0206:方法的定义与使用

    方法的基本概念 方法的主要功能是封装可以执行的一段代码,这样不仅可以进行重复调用,更可以方便的实现代码的维护,而本次使用的方法定义语法如下所示. public static 返回值类型 方法名称(参数 ...

  2. 4-20模块 序列化模块 hashlib模块

    1,模块,py文件就是模块,py之所以好用就是模块多. 2,模块的分类: 1,内置模块,python 安装时自带的模块 2,扩展模块,别人写好的,需要安装之后,可以直接使用.itchat微信模块, b ...

  3. css3动画transition animation

    CSS动画简介  transition   animation transition过渡:css3通过transitions属性引入时间概念,通过开始.结束状态自动计算中间状态,实现状态改变的过渡效果 ...

  4. Leetcode#561. Array Partition I(数组拆分 I)

    题目描述 给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最 ...

  5. python(六)列表推导式、字典推导式、集合推导式

    转载 https://www.cnblogs.com/tkqasn/p/5977653.html

  6. Binary Tree HDU - 5573 (思维)

    题目链接: B - Binary Tree  HDU - 5573 题目大意: 给定一颗二叉树,根结点权值为1,左孩子权值是父节点的两倍,右孩子是两倍+1: 给定 n 和 k,让你找一条从根结点走到第 ...

  7. 20165234 2017-2018-2《Java程序设计》课程总结

    2017-2018-2<Java程序设计>课程总结 一.作业链接汇总 每周作业链接 预备作业一:我期望的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:Linux安装及学习 第 ...

  8. tomcat线程一直处于RUNNABLE,不接受请求

    最近项目中一个模块出现一个问题,本人做的比较浅显,所以很简单的问题一直搞了好几天,通过各种查资料.工具终于分析除了问题.问题如下: 现在对tomcat一个工程(会通过httpurlconnection ...

  9. android动态设置组件LayoutParams

    开发中经常用到动态设置组件的LayoutParams,之前开发遇到的问题如下: LinearLayout.LayoutParams params = new LinearLayout.LayoutPa ...

  10. 动态规划 - 213. House Robber II

    URL: https://leetcode.com/problems/house-robber-ii/ You are a professional robber planning to rob ho ...