20201202_第九讲

1.函数的返回值
  返回值就是函数执行以后返回的结果。
  通过return来指定函数的返回值。
  return后面可以跟任意对象,返回值甚至可以是一个函数。

def fun(*args):
    res = 0
    for i in args:
        res += i
    print(res)
fun(1,2,3,4)

2.文档字符串
  help()是Python中内置函数,通过help()函数可以查询Python中函数的用法。
  在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明。

def fun(a,b,c):
    return 123
help(fun)
help(print)

3.函数的作用域
  变量生效的区域
  一共有两种作用域:全局作用域、函数作用域。
  全局作用域:在程序执行时创建,在程序执行结束时销毁;所有函数以外的区域都是全局作用域;在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问。
  函数作用域:在函数调用时创建,在调用结束时销毁;每调用一次就会产生一个新的函数作用域;在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问。
4.命名空间
  实际上就是一个字典,是一个专门用来存储变量的字典。
  locals()用来获取当前作用域的命名空间。
  如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间。
  返回值是一个字典。

a = 123
b = 456
space = print(locals())
print(space)
def fun():
    # a = 1
    # b = 2
    # c = 3
    # space = locals()      #locals()用来获取当前作用域的命名空间
    space = globals()       #命名空间就是一个字典
    print(space)
fun()

 4.1.命名空间有三种:内置名称,全局名称,局部名称
  内置名称:abs、char和异常名称BaseException、Exception等。
  全局名称:模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
  局部名称:函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。
 4.2.作用域
  L(Local):最内层,包含局部变量,比如一个函数/方法内部。
  E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
  G(Global):当前脚本的最外层,比如当前模块的全局变量。
  B(Built-in): 包含了内建的变量/关键字等。,最后被搜索
 4.3.作用域的引入
  python中只有模块,类以及函数才会引入新的作用域,其他的代码块(如if/elif/else、try/except、for/while)是不会引入新的作用域,即这些语句内定义的变量,外部也可以访问。

if True:
    msg = 'i am from Runoob'    #msg变量定义在if语句块中,但外部还是可以访问的
print(msg)
#msg_inner是局部变量,外部不能访问
def test():
    msg_inner = 'I am from Runoob'
print(msg_inner)	#报错
# 全局变量和局部变量
# 局部变量只能在其被声明的函数内部访问,全局变量可以在整个程序范围内访问。
# 调用函数时,所有在函数内声明的变量名称都将被加入到作用域中
#在两个内存空间中定义了相同名字得变量,所以值也不一样
total = 0  # 这是一个全局变量
def sum(arg1, arg2):
    # 返回2个参数的和."
    total = arg1 + arg2  # total在这里是局部变量.
    return total
print("函数返回值:",sum(10, 20))
print("函数外是全局变量 : ", total)

 4.4.全局变量和局部变量
  局部变量只能在其被声明的函数内部访问,全局变量可以在整个程序范围内访问。
  调用函数时,所有在函数内声明的变量名称都将被加入到作用域中
  在两个内存空间中定义了相同名字的变量,所以值也不一样.

total = 0  # 这是一个全局变量
def sum(arg1, arg2):
    # 返回2个参数的和."
    total = arg1 + arg2  # total在这里是局部变量.
    return total
print("函数返回值:",sum(10, 20))	#30
print("函数外是全局变量 : ", total)	#0
#内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了
num = 1
def fun1():
    global num  # 需要使用 global 关键字声明
    print(num)
    num = 123
    print(num)
fun1()
print(num)

5.递归:
  基线条件:问题可以被分解为最小的问题,当满足基线问题的时候,再去解决问题(设定的最大递归深度)。
  递归条件:将问题继续分解的条件。

# 10! =10 * 9!
# 9! = 9 * 8!
#....
# 1! = 1    #基线条件,无法再被分解
def fun(n):   #fun求n的阶乘
    #基线条件
    if n == 1:
        return 1
    #递归条件
    a = n*fun(n-1)
    return a
a = fun(10)     #res = 10*fun(9)/10*9*fun(8)
print(a)

作业:

# 用函数实现一个判断用户输入的年份是否是闰年的程序
# 1.能被400整除的年份
# 2.能被4整除,但是不能被100整除的年份
# 以上2种方法满足一种即为闰年
def leap_year(a):
    if a%400 == 0 or a%4 ==0 and a%100 != 0:
        print("是闰年")
        return a
    else:
        print("不是闰年")
leap_year(int(input("请输入年份")))
# 2. 猴子吃桃问题(递归):
# 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。
# 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
# 以后每天早上都吃了前一天剩的一半零一个。
# 到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
n = 1
def fun(time = 0):   #n桃子总数
    global n
    #递归条件
    if time < 9 :
        fun(time + 1)
        n = (n + 1) * 2
        return n
print(fun())	#1534
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值