小白学 Python(17):基础数据类型(函数)(下)
人生苦短,我选Python
前文传送门
变量作用域
变量的作用域是指在程序中命名的变量产生想过的范围。
没看懂?没关系,我们写个示例慢慢品。
a = 0
def print_1():
a = 1
print('a =', a)
def print_2():
a = 2
print('a =', a)
print_a()
显示结果如下:
a = 1
在上面的示例中, a 我们进行了三次赋值,但是注意,这里并不是赋值覆盖,而是每次赋值时作用域不同。
第一次赋值 a 是在最外面,这个称为全局变量,意思是它的作用域是全局的,我们在全局任何地方使用 a ,都能获得这个值。
第二次赋值, a 是在 print_1()
这个函数中,我们调用了 print_1()
这个函数,所以这里的赋值会生效。
第三次赋值是在 print_2()
这个函数中,我们并未调用这个函数,所以这里 a 的赋值并不会生效。
比如我们可以这么打印:
a = 0
def print_1():
a = 1
print('a =', a)
def print_2():
a = 2
print('a =', a)
print('a =', a)
打印结果如下:
a = 0
这时我们就将这个全局变量打印出来了。
第二个和第三个在方法内的 a 就成了局部变量,这两个 a 都是只在当前的函数中生效,出了这个函数就不生效了。
如果我们将局部变量中的的赋值注释掉,那么在函数中是否能取到全局变量的值?
答案当然是肯定的,我们试试看:
a = 0
def print_1():
# a = 1
print('a =', a)
def print_2():
a = 2
print('a =', a)
print_a()
打印结果如下:
a = 0
我们还可以再做一点改变,在函数 print_1()
中调用函数 print_2()
,如下:
a = 0
def print_1():
# a = 1
print('a1 =', a)
def print_2():
a = 2
print('a2 =', a)
print_2()
print('a3 =', a)
print_1()
打印结果如下:
a3 = 0
a1 = 0
a2 = 2
此示例添加 a1 、 a2 、 a3 仅为打印后方便识别,并非这是三个变量。
注意: 内层函数的变量作用域仅在内层函数中,并不会覆盖到外层函数。
匿名函数
是的,你没看错,函数是可以不命名的。
当我们需要使用匿名函数的时候,可以使用 lambda
关键字来声明匿名函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
语法:
函数对象名 = lambda 形参:表达式
我们还是写一个简单的匿名函数大家体会一下:
add = lambda x,y: x + y
print(add(1, 2))
打印结果如下:
3
这里是实现了我们上一篇文章中最简单的加法,如果写一个稍微复杂一点,比如说加上逻辑判断的:
max_num = lambda x,y: x if x >= y else y
print(max_num(5, 9))
打印结果如下:
9
建议: 当函数比较复杂的时候,不建议使用匿名函数,因为它只能是一行,写起来不好写的同时还不好阅读,结构晦涩难懂,如果进行复杂的业务逻辑,匿名函数能让写的人怀疑人生,读的人生不如死。真爱生命,请远离匿名函数。
递归函数
一个函数是可以调用另一个函数的,如果这个函数调用自己的话,那么这个就叫递归函数。
现在我们如果要求 n 的阶乘:
千万别告我你不知道什么阶乘,可能你需要回去问下你的初中数学老师。
n! = 1 * 2 * 3 * ... * n
看懂了哇,想想看代码怎么写。
想不出来还是看我写的吧:
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print('10的阶乘为:', factorial(10))
打印结果:
10的阶乘为: 3628800
希望各位同学一定要自己动手敲代码。
示例代码
本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。
小白学 Python(17):基础数据类型(函数)(下)的更多相关文章
- 小白学 Python(16):基础数据类型(函数)(上)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python(3):基础数据类型(下)
人生苦短,我选Python 引言 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 前面我们介绍过了数字,本篇我们接着聊另一个常用的基础数据类型:字符串. ...
- 小白学 Python(24):Excel 基础操作(下)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python(2):基础数据类型(上)
人生苦短,我选Python 引言 前文传送门 小白学 Python(1):开篇 接触一门新的语言,肯定要先了解它的基础数据类型.啥?你问我为啥要先了解基础数据类型? 为了你的生命安全,还是乖乖听我 B ...
- 小白学 Python(6):基础运算符(下)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python(8):基础流程控制(下)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python(13):基础数据结构(字典)(下)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python(10):基础数据结构(列表)(下)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python(15):基础数据结构(集合)(下)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
随机推荐
- Ansible常用模块基本操作
Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. 前言 对于任何一个框架,一个应用,为了更便于推广,便于使用,便于商业化,都会顺便提 ...
- Case1-basic network framework/Related organization‘s name
常见的计算机网络物理拓扑结构: 1.星型网 2.树型网 3.分布式网络 4.总线型网 5.环型网 6.复合型网络 计算机网络相关的标准化组织: 国际标准化组织(ISO):International O ...
- 深入了解String,StringBuffer和StringBuilder三个类的异同
Java提供了三个类,用于处理字符串,分别是String.StringBuffer和StringBuilder.其中StringBuilder是jdk1.5才引入的. 这三个类有什么区别呢?他们的使用 ...
- Ansible配置详解
目录 Ansible配置详解 参考 配置优先级 配置参数说明 Ansible配置详解
- 针对永久不过期的key 批量设置过期时间
问题需求: redis内存暴增,后来发现有很多设置永久不过期. 解决:查找出来之后针对前缀批量设置过期时间 (过期时间与开发沟通 保证服务不受影响) 来源于网上杨一的代码 正好解决了我遇到的问题 在这 ...
- Spring5源码解析3-refresh方法初探
接上回分析完register(annotatedClasses);后,现在来看一下refresh();方法. // new AnnotationConfigApplicationContext(App ...
- TCP/UDP的小事情
UDP: 没有复杂的控制机制,面向无连接的通信服务. 常用于: 包总量少的通信 音视频传输(即时通信) TCP: 对传输.发送.通信.进行控制的协议.面向有连接的协议,只有在确认通信对端存在时才会发送 ...
- Spring 源码阅读 二
程序入口: 接着上一篇博客中看完了在AnnotationConfigApplicationContext的构造函数中的register(annotatedClasses);将我们传递进来的主配置类添加 ...
- java之ThreadLocal详解
一.ThreadLocal简介 ThreadLocal是线程的局部变量,是每一个线程所单独持有的,其他线程不能对其进行访问,通常是类中的private static字段. 我们知道有时候一个对象的变量 ...
- 重新整理django中Auth模块
0907自我总结 重新整理django中Auth模块 from django.contrib import auth 一.设置 默认Auth表单 auth默认是使用自带的user表单 自定义Auth表 ...