ql的python学习之路-day8

前言:本节主要学习的是函数的全局变量和局部变量以及递归

一、全局变量和局部变量

定义在函数外并且在函数头部的变量,叫做全局变量,全局变量在整个代码中都生效。

局部变量只在函数里生效,这个函数就叫做这个变量的作用域。

在函数里直接修改全局变量的类型是字典、列表、集合以及类,数字和字符串类型的要加上global关键字才能修改。

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:qinjiaxi
 4 hobby = 'sing'
 5 def change_name(name):
 6     global hobby#global关键字,在函数里修改全局变量
 7     hobby = 'play'
 8     print('before name', name)
 9     name = 'qinlang'#局部变量只在函数里生效,这个函数就是这个变量的作用域。
10     age = 3#出了这个函数就找不到
11     print('after name', name)
12 name = 'qinjiaxi'
13 change_name(name)
14 print(name)
15 #print(age)#报错
16 print(hobby)

 二、递归

递归的定义:在函数的内部可以调用函数;如果一个函数在内部调用自己本身,这个函数就是递归函数。

递归特性:

1.必须要有一个明确的结束条件

2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少(或者说成:问题规模每递归一次都应该比上一次问题规模有所减少)

3.递归效率不高,递归层数过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数的调用,栈就会增加一层栈帧,每当函数返回,栈就减少一层栈帧。由于栈的大小不是无限的,所以递归调用的次数过多,会导致栈溢出。)

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:qinjiaxi
 4 def calc(n):
 5     print(n+1)
 6     return calc(n+1)
 7 calc(0)#递归层数最多只有999层,然后报错,这是一个保护机制
 8 
 9 #用递归求一个数除2直到不能返回为止
10 def calc1(n):
11     print(n)
12     if n//2 > 0:
13         return calc1(n//2)
14     print('--->', n)#最后执行打印,如果不明白可以断点调试
15 calc1(10)

calc1()函数运行结果:

1 10
2 5
3 2
4 1
5 ---> 1

 三、高阶函数

变量可以指向函数,函数的参数可以接受变量,那么一个函数就可以接受一个函数作为参数,这种函数就叫做高阶函数。

注:高阶函数基本运用不到,只做了解。

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 # Author:qinjiaxi
4 #高阶函数就是把一个函数作为另外一个函数的参数使用
5 def add(a, b ,c):
6     return c(a) + c(b)
7 d = add(2,-6,abs)
8 print(d)

 

posted on 2018-08-15 23:50  秦朗的天空  阅读(250)  评论(0编辑  收藏  举报

导航