一、函数的对象

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

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 x res=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 x
  else:
    return y def max4(a,b,c,d):
  res1=max2(a,b)#2
  res2=max2(res1,c)#3
  res3=max2(res2,d)#4
  return res3 print(max4(1,2,3,4))#4

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

案例一

def outter():
x=1
print('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.141592653589793 def circle(radius,action=0):
"""
圆形相关运算
:param radius: 半径
:param action: 0代表求面积,1代表求周长
:return: 面积或者周长
"""
def area(radius):
return pi * (radius ** 2) def perimiter(radius):
return 2 * pi * radius if action == 0:
res=area(radius)
elif action == 1:
res=perimiter(radius) return res print(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=3 while True:
b=4
break def foo():
  m=3

2.3局部名称空间

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

2.4生命周期

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

2.4加载顺序

内置->全局->局部

2.5查找名字的顺序

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

案列一:

len=111

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

案例二

x=111

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

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

案列三:

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

案列四:

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

案列五:

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

3.作用域:

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

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

案例一

x=1#全局存活

def foo():
y=2
print(x)#1 def bar():
print(x)#1 foo()
bar()

案例二

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

案例三

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

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

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

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

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

四、闭包函数

1 什么是闭包函数

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

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

def outter():
  x=111
  def inner():
    print(x)
  return inner f=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 func f=outter(1,2)
f()

3.3案例

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

解决方案一:参数

pip3 install requests

import 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 get baidu=outter('https://www.baidu.com') tmall=outter('https://www.tmall.com')

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

  1. Python 函数对象-函数嵌套-名称空间与作用域-闭包函数

    今日内容: 1. 函数对象 函数是第一类对象: 指的是函数名指向的值可以被当中数据去使用 1.可以被引用 2.可以当做参数传给另一个函数 3.可以当做一个函数的返回值 4.可以当做容器类型的元素 2. ...

  2. python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

    今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): y=func() print(y) def foo( ...

  3. day_12函数默认值,数据类型的补充,函数对象名称空间与作用域,函数的嵌套定义

    复习, 昨天讲了字符串的比较,按照从左往右比较每一个字符,通过字符对应的ASCII码进行比较 函数的参数,‘ 实参与形参 形参:在函数定义时()中出现的参数 实参,在函数调用时()中出现的参数 实参的 ...

  4. python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义

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

  5. Python--day12(三元表达式、函数对象、名称空间与作用域、函数嵌套定义)

    今日主要内容 1.  函数默认值细节(*) 2.  数据类型补充:三元表达式.列表推导式.字典推导式 (***) 3.  函数对象:函数名的各种应用场景 (*****) 4.  名称空间与作用域:解释 ...

  6. day12函数,三元表达式 ,列表推导式 ,字典推导式,函数对象,名称空间与作用域,函数的嵌套定义

    复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 # 函数的参数 # 1)实参与形参: # -- 形参:在函数定义时()中出现的参数 # -- 实参:在函 ...

  7. 【0809 | Day 12】可变长参数/函数的对象/函数的嵌套/名称空间与作用域

    可变长参数 一.形参 位置形参 默认形参 二.实参 位置实参 关键字实参 三.可变长参数之* def func(name,pwd,*args): print('name:',name,'pwd:',p ...

  8. day12(表达式,推导式,名称空间与作用域,函数的嵌套定义)

    一,复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascll进行比较 # print('a' > 'A') #True # print('ac' > 'ab' ...

  9. python函数篇:名称空间、作用域和函数的嵌套

    一.名称空间:(有3类) (1)内置名称空间(全局作用域) (2)全局名称空间(全局作用域) (3)局部名称空间(局部作用域) 关于名称空间的查询: x=1 def func(): print('fr ...

  10. day12 函数对象,名称空间与作用域

    """ 今日内容: 1.函数参数传值细节 2.三元表达式 3.列表及字典推导式 4.函数对象 5.名称空间与作用域 6.函数的嵌套定义初识 ""&qu ...

随机推荐

  1. IE8 环境的 JQuery 中的 $.ajax 拒绝访问---解决方案

    需求是兼容到 IE8. $.ajax 总是请求失败,直接跳转到 error 函数中,报错:拒绝访问. 网上的一些解决方法都试过了还是没有用,比如再请求之前设置 jQuery.support.cors ...

  2. Python 面试总结

    公司面试: 1,说说项目都用到了什么技术? 2,mysql索引的种类? 3,索引建多有什么不好? 4,mysql的引擎有什么? 5,redis是单线程还是多线程的? 6, redis的持久化机制? 7 ...

  3. git怎样删除未监视的文件untracked files

    # 删除 untracked files git clean -f # 连 untracked 的目录也一起删掉 git clean -fd # 连 gitignore 的untrack 文件/目录也 ...

  4. 组件或者dom的特殊属性

    key:用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes. 常用姿势: 1.结合 v-for,有相同父元素的子元素必须有唯一key. <ul> <li ...

  5. L1-Day5

    1.他偷了那个装满钱的书包. [我的翻译]He stole the bag full of money. [标准答案]He stole that school bag full of money. ( ...

  6. JavaScript—对象创建方式

    JavaScript 也是面向对象的语言(oop) 之前学JavaScript 没有学对象.现在做下笔记 创建对象的方式: 1.  对象字面量 const hero = { name: '吕布', w ...

  7. 2018-2019-1 20165231 实现mypwd(选做)

    实现mypwd 要求: 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 实现mypwd 测试mypwd pwd: 在Linux层次结构中,想要知道当前所处的目录, ...

  8. Beta 冲刺(7/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(7/7) 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 还剩下哪些 ...

  9. [JLOI2014]松鼠的新家-树链剖分

    最开始的时候我在写线段树部分的时候还打了一个build,后来一想,打个球球大作战的build啊!!!有个锤子的用啊!!! #include<bits/stdc++.h> using nam ...

  10. Linux性能调优之gprof和oprofile

    为了更好的优化程序性能,我们必须找到性能瓶颈点,“好钢用在刀刃上”才能取 得好的效果,否则可能白做工作. 为了找到关键路径,我们可以使用profilng技术,在linux平台上,我们可以使用gprof ...