返回值就是函数执行以后返回的结果 通过return来指定函数的返回值
def fn(*args): r = 0 for i in args: r += i return r s = fn(1, 2, 3, 4) print(s)return后面可以跟任意对象,返回值甚至可以是一个函数 当你不写return语句 和只写有一个return 的时候,返回值是None 在函数中return后面的代码不再执行 break 和continue一定只能在循环中使用,只会对当次循环起效果
def fn(): for i in range(9): if i == 5: return print(i) print('循环执行完毕') r = fn() print(r)help()是Python中内置函数,通过help()函数可以查询Python中函数的用法 在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明
def fn(a, b, c): """ 这是一个文档字符串的说明 通常我们是用来对函数进行解释说明的 :param a: 作用 类型 默认值 :param b: 作用 类型 默认值 :param c: 作用 类型 默认值 :return: 需要不需要 """ return 123 help(fn)• 作用域(scope) • 作用域指的是变量生效的区域 • 在Python中一共有两种作用域 • 全局作用域 • 全局作用域在程序执行时创建,在程序执行结束时销毁(python垃圾回收机制:引用计数的功能,当计数为0的时候,就会销毁变量) • 所有函数以外的区域都是全局作用域(相对的,函数嵌套) • 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问 • 函数作用域 • 函数作用域在函数调用时创建,在调用结束时销毁 • 函数每调用一次就会产生一个新的函数作用域 • 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问 • global 声明变量是全局变量
b = 456 a = [b] def fn(): global a a = 123 print('函数内部:a = ', a) print('函数内部:b = ', b) fn() print('函数外部:a = ', a) print('函数外部:b = ', b)我们从三个方面来了解一下Python的垃圾回收机制。
一、引用计数 Python垃圾回收主要以引用计数为主,分代回收为辅。引用计数法的原理是每个对象维护一个ob_ref,用来记录当前对象被引用的次数,也就是来追踪到底有多少引用指向了这个对象,当发生以下四种情况的时候,该对象的引用计数器+1
对象被创建 a=14 对象被引用 b=a 对象被作为参数,传到函数中 func(a) 对象作为一个元素,存储在容器中 List={a,”a”,”b”,2} 与上述情况相对应,当发生以下四种情况时,该对象的引用计数器-1
当该对象的别名被显式销毁时 del a 当该对象的引别名被赋予新的对象, a=26 一个对象离开它的作用域,例如 func函数执行完毕时,函数里面的局部变量的引用计数器就会减一(但是全局变量不会) 将该元素从容器中删除时,或者容器被销毁时。
.当指向该对象的内存的引用计数器为0的时候,该内存将会被Python虚拟机销毁
命名空间实际上就是一个字典,是一个专门用来存储变量的字典 locals()用来获取当前作用域的命名空间 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间 返回值是一个字典
def fn(): a = 1 b = 2 c = 3 d = 4 scope = locals() scope['e'] = 5 print('e') print(scope) fn()• 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题 • 递归式函数有2个条件 • 1. 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了 • 2. 递归条件 可以将问题继续分解的条件
# 求10的阶乘(10!) # 10! = 10*9! n! = n * (n-1)! # 9! = 9*8! # 。。 # 1!= 1 def fn(n): # 定义的fn()就是要做计算n的阶乘 # 基线条件 if n == 1: return 1 # 递归条件 return n * fn(n-1) r = fn(10) # r = 10 * 9 * 8* fn(7)...*1 print(r)定义一个函数,为任意数字做任意的幂运算
# # n ** m # # n ** m = n * (n **m-1) # ...... # m = 1 def fn1(n, m): # fn1()是做n**m的运算 if m == 1: return n return n * fn1(n, m-1) r = fn1(10, 8) print(r)定义一个函数,用来检查任意的一个字符串是不是一个回文字符串,如果是返回True,不是返回False abcdefghgfedcba 是不是回文字符串
def fn2(str1): # fn2()判断字符串是不是回文字符串 if len(str1) < 2: return True elif str1[0] != str1[-1]: return False return fn2(str1[1:-1]) r = fn2('abcdefghrhgfedcba') print(r)**1.**用函数实现一个判断用户输入的年份是否是闰年的程序 1.能被400整除的年份 2.能被4整除,但是不能被100整除的年份 以上2种方法满足一种即为闰年
def fn(): n = input('请输入一个年份:') n = int(n) if n % 400 == 0: print('闰年') elif n % 4 == 0 and n % 100 != 0: print('闰年') else: print('不是闰年') fn()2. 猴子吃桃问题(递归): 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
""" 第一天的桃子数量,等于第二天的桃子数量加1然后乘以2 第二天的桃子数量,等于第三天的桃子数量加1然后乘以2 第三天的桃子数量,等于第四天的桃子数量加1然后乘以2 第四天的桃子数量,等于第五天的桃子数量加1然后乘以2 第五天的桃子数量,等于第六天的桃子数量加1然后乘以2 第六天的桃子数量,等于第七天的桃子数量加1然后乘以2 第七天的桃子数量,等于第八天的桃子数量加1然后乘以2 第八天的桃子数量,等于第九天的桃子数量加1然后乘以2 第九天的桃子数量,等于第十天的桃子数量加1然后乘以2 第十天桃子的数量已知为1个。 """ def fn(n): if n > 10 or n < 1: return elif n == 10: return 1 else: return (fn(n+1)+1)*2 print (fn(1))