前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >函数(二)

函数(二)

作者头像
py3study
发布2020-01-15 16:43:11
2800
发布2020-01-15 16:43:11
举报
文章被收录于专栏:python3python3

函数的嵌套

定义

函数内部定义的函数,无法在函数外部使用内部定义的函数

代码语言:javascript
复制
def f1():
    def f2():
        print('from f2')
    f2()
f2()
代码语言:javascript
复制
def f1():
    def f2():
        print('from f2')
f1()
代码语言:javascript
复制
from f2

圆的面积周长

代码语言:javascript
复制
from math import pi
def circle(radius,action='area'):
    def area():
        return pi*(radius**2)
    def perimeter():
        return 2*pi*radius
    if action=='area':
        return area()
    else:
        return perimeter()
print(f'circle(10):{circle(10)}')
print(f"circle(10,action='perimeter'): {circle(10,action='perimeter')}")

名称空间与作用域

定义

内存中有一块内存存储变量名与变量间绑定关系的空间,称为名称空间

内置名称空间

存放python解释器自带的名字

生命周期:解释器启动时生效,关闭失效

全局名称空间

处内置与局部的名字之外,其余都存放在全局名称空间

局部名称空间

用于存放函数调用期间函数体产生的名字 生命周期:函数调用期间生效,函数执行结束后失效

代码语言:javascript
复制
def f1():
    def f2():
        print('from f2')
        f2()
f1()
加载顺序

内置-全局-局部

查找顺序

当为局部名称空间:局部-全局- 内置

代码语言:javascript
复制
x = 1
y = 2
len = 100


def func():
    y = 3
    len = 1000
    print(f"y: {y}")
    print(f"len: {len}")
    # print(a)  # NameError: name 'a' is not defined


func()
代码语言:javascript
复制
y: 3
len: 1000
代码语言:javascript
复制
x = 1


def func():
    print(x)


x = 10
func()
代码语言:javascript
复制
10
作用域

域指的是区域,作用域即作用区域

全局作用域

全局作用域:全局有效,全局存活,包含内置名称空间和全局名称空间。

代码语言:javascript
复制
x = 1


def bar():
    print(x)


bar()
代码语言:javascript
复制
1
局部作用域

局部作用域:局部有小,临时存储,只包含局部名称空间

代码语言:javascript
复制
def f1():
    def f2():
        def f3():
            print(x)
        x = 2
        f3()
    f2()


f1()
代码语言:javascript
复制
2

注意:作用域关系在函数定义阶段就固定死了,与函数的调用无关

代码语言:javascript
复制
# 作用域注意点
x = 1


def f1():  # 定义阶段x=1
    print(x)


def f2():
    x = 2
    f1()


f2()
代码语言:javascript
复制
1

补充:global:修改全局作用域中的变量

​ nonlocal修该局部作用域中的变量

代码语言:javascript
复制
x = 1


def f1():
    x = 2

    def f2():
        #         nonlocal x
        x = 3

    f2()
    print(x)


f1()
代码语言:javascript
复制
2
代码语言:javascript
复制
x = 1


def f1():
    x = 2

    def f2():
        nonlocal x
        x = 3

    f2()
    print(x)


f1()
代码语言:javascript
复制
3

注意:

  1. 在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
  2. 在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数的嵌套
    • 定义
    • 名称空间与作用域
      • 定义
        • 内置名称空间
        • 全局名称空间
        • 局部名称空间
        • 加载顺序
        • 查找顺序
        • 作用域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档