小白学 Python(17):基础数据类型(函数)(下)

人生苦短,我选Pythonpython

前文传送门git

小白学 Python(1):开篇github

小白学 Python(2):基础数据类型(上)数据结构

小白学 Python(3):基础数据类型(下)函数

小白学 Python(4):变量基础操做3d

小白学 Python(5):基础运算符(上)code

小白学 Python(6):基础运算符(下)对象

小白学 Python(7):基础流程控制(上)blog

小白学 Python(8):基础流程控制(下)递归

小白学 Python(9):基础数据结构(列表)(上)

小白学 Python(10):基础数据结构(列表)(下)

小白学 Python(11):基础数据结构(元组)

小白学 Python(12):基础数据结构(字典)(上)

小白学 Python(13):基础数据结构(字典)(下)

小白学 Python(14):基础数据结构(集合)(上)

小白学 Python(15):基础数据结构(集合)(下)

小白学 Python(16):基础数据类型(函数)(上)

变量做用域

变量的做用域是指在程序中命名的变量产生想过的范围。

没看懂?不要紧,咱们写个示例慢慢品。

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 上,方便你们取用。

示例代码-Github

示例代码-Gitee

相关文章
相关标签/搜索