运维八一 运维八一
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)

运维八一

运维,运维!
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)
  • Go

  • Python

    • 前言

    • python基础

      • 变量
      • 格式化输出和运算符
      • 数据类型
      • 流程控制
      • 文件处理
      • 字符编码原理
      • 函数概念
      • 函数嵌套和作用域
        • 1. 函数的嵌套调用
        • 2. 名称空间
        • 3. 作用域
        • 4. 闭包函数
        • 5. 三元运算
      • 装饰器-迭代器-生成器
      • 递归函数和匿名函数
      • 内置函数
  • Shell

  • Java

  • Vue

  • 前端

  • 编程浅尝
  • Python
  • python基础
lyndon
2023-06-07
目录

函数嵌套和作用域

# 1. 函数的嵌套调用

在调用一个函数的过程中,又调用了另一个函数

def bar():
    print('from nbar')

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

foo() 
输出:
from foo
from nbar
1
2
3
4
5
6
7
8
9
10
11

函数的嵌套定义:在一个函数的内部,又定义另一个函数

def f1():
    x=1
    def f2():
        print('from f2')
    f2()

f1()
1
2
3
4
5
6
7

# 2. 名称空间

存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方

  • **内置名称空间:**在python解释器启动时产生,存放一些python内置的名字

  • **全局名称空间:**在执行文件时产生,存放文件级别定义的名字

  • **局部名称空间:**在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间,用来存放该函数内定义的名字,该名字在函数调用时生效,在函数调用结束时失效

x=1            #全局名称空间
def func():
    y=2         #局部名称空间
    def f1():pass
    print

import os     #内置名称空间

class Foo:
    pass

del x
1
2
3
4
5
6
7
8
9
10
11
12
  • 加载顺序: 内置---》全局---》局部

  • 查找顺序: 局部---》全局---》内置

# 3. 作用域

作用域的范围

  • **全局作用域:**全局存活,全局有效 globals()

  • **局部作用域:**临时存活,局部有效 locals()

x=11111111111111111111111111111111111111111111
def f1():
    x=1
    y=2
    def f2():pass
    # print(locals())
    print(globals())           #globals返回的是一个字典类型的全局范文

f1()
print(locals() is globals())  #返回布尔值True,局部包含在全局中
# print(locals())
#
# print(dir(globals()['__builtins__'])) #dir查看globals模块下包含内容
x=1
def f1():
    global x   #在局部中修改全局的变量
    x=2

f1()
print(x)
l=[]
def f2():
    l.append('f2')

f2()
print(l)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

globals的使用:

  • 针对不可变数据类型(字符串等),在局部中需要使用globals进行修改
  • 针对可变数据类型(列表、字典等),不用使用globals

nonlocal的使用:

  • nonlocal在局部中使用,能够跨局部使用,但不能修改全局
x=0
def f1():
    # x=1
    def f2():
        # x=2
        def f3():
           # global x
           nonlocal x
           x=3
        f3()
        # print(x)
    f2()
    print(x)
f1()
print(x)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

作用域关系,在函数定义时就已经固定,于调用位置无关,在调用函数时,必须回到函数原来定义的位置去找作用域关系

小范围的可以用大范围的,但是大范围的不能用小范围的

范围从大到小(如图):

图片

如果在小范围内,要用一个变量,是当前这个小范围有的,就用自己的

如果在小范围内没有,就用上一级的,上一级没有的,就用上上级的,以此类推

如果都没有,报错

# 4. 闭包函数

什么是闭包函数?

  • 定义在函数内部的函数
  • 包含对外部作用域名字的引用,而不是对全局作用域名字的引用,那么该内部函数就称为闭包函数
#闭包函数的应用:惰性计算
import requests #pip3 install requests

# def get(url):
#     return requests.get(url).text
#
# print(get('https://www.python.org'))        #为get函数传入参数


# def index(url):
#     # url='https://www.python.org'
#     def get():        #以闭包的形式给函数定义一个状态
#         # return requests.get(url).text
#         print(requests.get(url).text)
#
#     return get
#
# python_web=index('https://www.python.org')  # baidu_web=index('https://www.baidu.com')

# python_web()
# baidu_web()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 5. 三元运算

if 条件 成立的结果

if 条件 else 条件不成立的结果

例:

a=20
b=10
c=a if a>b else b
print(c)
1
2
3
4
上次更新: 2023/07/05, 16:57:02
函数概念
装饰器-迭代器-生成器

← 函数概念 装饰器-迭代器-生成器→

最近更新
01
ctr和crictl显示镜像不一致
03-13
02
alpine镜像集成常用数据库客户端
03-13
03
create-cluster
02-26
更多文章>
Theme by Vdoing | Copyright © 2015-2024 op81.com
苏ICP备18041258号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式