全局与局部变量

  • 在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
  • 全局变量作用域是整个程序,局部变量作用域是定义该变量的函数。
  • 当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用。
name = "Alex Li"   # 全局变量

def change_name(name):
print("before change:",name) # 函数内部变量从内向外找,如果内部不存在,会找上一层
# 输出
# before change: Alex Li
name = "金角大王,一个有Tesla的男人" #局部变量
print("after change", name)
# 输出
# after change 金角大王,一个有Tesla的男人 change_name(name) print("在外面看看name改了么?",name) # 默认局部变量不能修改全局变量的值
# 输出
# 在外面看看name改了么? Alex Li

不用传name 值到函数里,也可以在函数里调用外面的变量

name = "Alex Li"

def change_name():
name = "金角大王,一个有Tesla的男人"
print("after change", name)
# 输出
# after change 金角大王,一个有Tesla的男人 change_name() print("在外面看看name改了么?", name )
# 输出
# 在外面看看name改了么? Alex Li

作用域

Python中函数就是一个作用域,局部变量放置在其作用域中。

如何在函数里修改全局变量?global

name = "Alex Li"
def change_name():
global name # 声明全局变量
name = "Alex 又名 金角大王,路飞学城讲师"
print("after change", name)
# 输出
# after change Alex 又名 金角大王,路飞学城讲师 change_name() print("在外面看看name改了么?", name) """
global name的作用就是要在函数里声明全局变量name ,意味着最上面的name = "Alex Li"即使不写,程序最后面的print也可以打印name
"""
在实践中global一般情况下最好不要使用,在多人协作时容易产生错误

嵌套函数

在函数里面还可以定义函数,可以嵌套多层,执行需要被调用

name = "Alex"
def change_name():
name = "Alex2" def change_name2():
name = "Alex3"
print("第3层打印", name) change_name2() # 调用内层函数
# 输出
# 第3层打印 Alex3
print("第2层打印", name)
# 输出
# 第2层打印 Alex2 change_name()
print("最外层打印", name)
# 输出
# 最外层打印 Alex

嵌套函数举例1

嵌套函数举例2

嵌套函数举例3

嵌套函数举例4

嵌套函数举例5

嵌套函数举例6

高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

变量可以指向函数

以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码

>>> abs(-1)
1
但是,如果只写abs呢?
>>> abs
<built-in function abs>

如果把函数本身赋值给变量呢?

>>> f = abs
>>> f
<built-in function abs>

总结:函数本身也可以赋值给变量,即:变量可以指向函数

验证:

f = abs
print(f(-10))
# 输出10

传入函数

既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

一个最简单的高阶函数:

def add(x, y, f):  # 高阶函数
return f(x) + f(y) """
当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,我们可以推导计算过程为:
x = -5
y = 6
f = abs
f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
"""
print(add(-5, 6, abs))
# 输出11


Python函数学习——作用域与嵌套函数的更多相关文章

  1. python语法学习第五天--函数(2)

    命名空间: 命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的. 命名空间提供了在项目中避免名字冲突的一种方法.各个命名空间是独立的,没有任何关系 ...

  2. python函数基础:嵌套函数、作用域、匿名函数、高阶函数、递归函数

    嵌套函数: 1. 函数内部可以再定义函数 2. 函数只有被调用之后才会执行 看如下代码: age = 18 def func1(): age = 22 print(age) def func2(): ...

  3. python之函数名称空间,作用域,嵌套函数

    目录 嵌套函数 定义 名称空间的三大类(只存变量名) 名称空间加载顺序 变量名的查找顺序为 作用域 嵌套函数 定义 函数内部定义的函数,无法在函数外部使用内部定义的函数. def f1(): def ...

  4. Day3 Python基础学习——文件操作、函数

    一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过文件句柄对文件进行操作 关闭文件 #打开文件,读写文件,关闭文件 http://www.cnblogs.com/linha ...

  5. python 函数的作用域,闭包函数的用法

    一.三元表达式 if条件成功的值    if  条件   else else条件成功的值 #if条件成立的结果 if 条件 else else条件成立的结果 # a = 20 # b = 10 # c ...

  6. PYTHON 100days学习笔记006:函数和模块的使用

    目录 Day006:函数和模块的使用 1.函数的作用 2.定义函数 2.1 语法 2.2 实例 2.3 函数的调用 4.函数的参数 4.1 必须参数 4.2 关键字参数 4.3 默认参数 4.4 不定 ...

  7. Python基础学习——文件操作、函数

    一.文件操作 文件操作链接:http://www.cnblogs.com/linhaifeng/articles/5984922.html(更多内容见此链接) 一.对文件操作流程 打开文件,得到文件句 ...

  8. python基础学习(六)函数基础

    函数的基本使用 函数的定义 def 函数名(): 函数封装的代码 …… def 是英文 define 的缩写 函数名称 应该能够表达 函数封装代码 的功能,方便后续的调用 函数名称 的命名应该 符合 ...

  9. python视频学习笔记4(函数)

    函数中return和print的区别,没有return会默认返回None值 函数定义:所谓**函数**,就是把 **具有独立功能的代码块** 组织为一个小模块,在需要的时候 **调用** 1.函数的步 ...

随机推荐

  1. android 无法import

    参考 https://blog.csdn.net/u012489412/article/details/72784095 File - Invalidate Caches/Restart

  2. Python设计模式 - UML - 组件图(Component Diagram)

    简介 组件图又称构建图,用于显示系统各组件及各组件关系的物理视图. 组件图通常包括组件.接口.关系.端口和连接器,用来显示程序代码中相应的模块.源文件或源文件集合之间的依赖和泛化关系. 组件图中的组件 ...

  3. TZOJ 1689 Building A New Barn(求平面上有几个其它点求到n个点的曼哈顿距离最小)

    描述 After scrimping and saving for years, Farmer John has decided to build a new barn. He wants the b ...

  4. 150. Evaluate Reverse Polish Notation逆波兰表达式

    [抄题]: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are ...

  5. 交叉编译bash

    1 下载bash版本:[version 4.2.53]地址:http://ftp.gnu.org/gnu/bash/ 2 解压将下载的bash压缩包解压,命令: # mkdir /home/carri ...

  6. java_14 Date

    1.Date类的构造方法 Date是表示时间的类 空参构造 public Date() public class Demo { public static void main(String[] arg ...

  7. Selenium 学习汇总

    Commands (命令) Action 对当前状态进行操作 失败时,停止测试 Assertion 校验是否有产生正确的值 Element Locators 指定HTML中的某元素 Patterns ...

  8. 基于Zxing的二维码的二维码扫描之横屏扫描

    最近项目条码扫描要改为横屏,网上所搜了一下,然后发现我写的需要改动几行代码就可以了,还是很给力的. 如未查看之前的代码,请移步: 基于Zxing的二维码生成和二维码扫描 修改下面写代码就可以实现横屏条 ...

  9. IDEA下Spring Boot显示Run Dashboard面板

    在 .idea/workspace.xml 文件中找到 <component name="RunDashboard"> <option name="ru ...

  10. 【转】最近用Timer踩了一个坑,分享一下避免别人继续踩

    [转]最近用Timer踩了一个坑,分享一下避免别人继续踩 最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实 ...