python-函数入门(二)

简介: 一、函数对象 什么是函数? 函数是第一类对象,指的是函数名指向的值(函数)可以被当做数据去使用 1.函数的特性 1.函数可以被引用,即函数可以把值赋值给一个变量 def foo(): print('from foo') foo() func=foo #引用,赋值 func() print(foo) print(func) 2.

一、函数对象

什么是函数?

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

1.函数的特性

1.函数可以被引用,即函数可以把值赋值给一个变量

def foo():
    print('from foo')

foo()
func=foo    #引用,赋值
func()
print(foo)
print(func)

2.函数可以当做参数传给另一个函数

def hi():
    return "hi yasoob!"

def doSomethingBeforeHi(func):
    print("I am doing some boring work before executing hi()")
    print(func())

doSomethingBeforeHi(hi)

3.可以当做一个函数的返回值

def func(): # func=函数的内地址
    print('from func')

# print(func)

age=10
def bar(x):
    return x

res=bar(age)
print(res)

res=bar(func)
print(res)

4.可以当做容器类型的元素

容器对象(list、dict、set等)中可以存放任何对象,包括整数、字符串,函数也可以作存放到容器对象中

def func(): # func=函数的内地址
    print('from func')
age=10
l=[age,func,func()]
print(l)

二、函数嵌套

函数的嵌套又分为两大类

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

def max2(x,y):
    if x > y:
        return x
    else:
        return y

def max4(a,b,c,d):
    res1=max2(a,b)
    res2=max2(res1,c)
    res3=max2(res2,d)
    return res3

print(max4(1,2,3,4))

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

# from math import pi
# # print(pi)
#
# 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))
# print(circle(10,1))

三、名称空间与作用域

1.什么是名称空间:

  名称空间就是用来存放名字与内存地址绑定关系的地方(内存空间),但凡要查找值一定要通过名字,访问名字必须去查找名称空间

2.名称空间的三大类

  内置名称空间:存放的是python解释器自带的名字 例如:len()、man()等

  全局名称空间:存放的是文件级别的名字(不是函数内,不是内置的)

x、y、z、b、foo都是全局
m不是
x=1
y=2
if x=1:
    z=3
while Ture:
    b=4
def foo():
    m=3

  局部名称空间:在函数内部定义的

  生命周期:

    内置名称空间在解释器启动时生效,关闭时则失效

    全局名称空间在解释器解释执行python文件时生效,文件执行完毕后则失效

    局部名称空间只在调用函数时临时产生该函数的局部名称空间

  加载顺序:内置===》全局===》局部

  查找名字的顺序:

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

                 假设当前站在全局,查找顺序:全局=》内置

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

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

3.作用域

作用域指的是作用的范围,分为两种,全局作用域和局部作用域

1.全局作用域:包含的是内置名称空间与全局名称空间中的名字

  特点:全局有效,全局存活

2.局部作用域:包含的是局部名称空间中的名字

  特点:局部有效,临时存活

补:global  和  nonlocal

#global:在局部声明一个名字是来自于全局作用域的,可以用来在局部修改全局的不可变类型
# x=1
# def foo():
#     global x
#     x=2
#
# foo()
# print(x)

#nonlocal:声明一个名字是来自于当前层外一层作用域的,可以用来在局部修改外层函数的不可变类型
# x=0
# def f1():
#     x=111
#     def f2():
#         nonlocal x
#         x=222
#     f2()
#     print(x)
#
# f1()
# print(x)

四、闭包函数

1.什么是闭包函数?

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

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

def outter():
    x=111
    def inner():
        print(x)
    return inner

f=outter() #f=outter内的inner

# x=22222
# f()
def func():
    x=3333
    f()

func()

2.为何要用闭包函数?

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

3.如何使用闭包函数

为函数传值的方式有两种,参数和闭包(目前所学)

# 为函数体传值的方式一:参数
# def func(x,y):
#     print(x+y)
#
# func(1,2)
# 为函数体传值的方式二:闭包
# def outter(x,y):
#     # x=1
#     # y=2
#     def func():
#         print(x+y)
#     return func
#
# f=outter(1,2)
# f()

闭包的概念有的晦涩难以理解,期待接下里的学习!

    

 

焚膏油以继晷,恒兀兀以穷年。
相关文章
|
3天前
|
数据挖掘 数据处理 索引
python常用pandas函数nlargest / nsmallest及其手动实现
python常用pandas函数nlargest / nsmallest及其手动实现
18 0
|
15天前
|
Python
python函数的参数学习
学习Python函数参数涉及五个方面:1) 位置参数按顺序传递,如`func(1, 2, 3)`;2) 关键字参数通过名称传值,如`func(a=1, b=2, c=3)`;3) 默认参数设定默认值,如`func(a, b, c=0)`;4) 可变参数用*和**接收任意数量的位置和关键字参数,如`func(1, 2, 3, a=4, b=5, c=6)`;5) 参数组合结合不同类型的参数,如`func(1, 2, 3, a=4, b=5, c=6)`。
16 1
|
2天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
2天前
|
存储 索引 Python
Python从入门到精通——1.3.1练习编写简单程序
Python从入门到精通——1.3.1练习编写简单程序
|
2天前
|
开发框架 前端开发 数据库
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
|
2天前
|
数据采集 数据可视化 数据处理
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
|
2天前
|
Java 数据库连接 数据处理
Python从入门到精通:3.1.2多线程与多进程编程
Python从入门到精通:3.1.2多线程与多进程编程
|
2天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
8天前
|
机器学习/深度学习 数据可视化 数据挖掘
《Python 简易速速上手小册》第9章:数据科学和机器学习入门(2024 最新版)
《Python 简易速速上手小册》第9章:数据科学和机器学习入门(2024 最新版)
19 1
|
8天前
|
Serverless 开发者 Python
《Python 简易速速上手小册》第3章:Python 的函数和模块(2024 最新版)
《Python 简易速速上手小册》第3章:Python 的函数和模块(2024 最新版)
40 1