- 1. 函数的返回值
- 写一个函数的最初的梦想,是不是封装好这个功能,让我们随时可以使用(调用)
- print(r) #局部变量不能全局使用
- 任何类型的值都可以作为函数的返回值来返回
- 112
- 对于返回值来说,如果你不写return xxx 和 只写一个return ,返回的结果都是None
- return的特性: 在函数中,return后面的代码都不会执行, return一旦执行,函数自动结束
- 循环执行结束
- print(‘函数外部:’, a) # NameError: name ‘a’ is not defined
- 函数外部: 456
- 需求: 求10! 求10的阶乘
- 求任意数字的任意次幂运算
- 回文字符串的练习
- 检测一个字符串是不是一个会问字符串,是的返回True, 否则返回false
- abcdefgfedcba abcdefggfedcba
- bcdefgfedcb bcdefggfedcb
- cdefgfedc cdefggfedc
- g gg
1. 函数的返回值
- 返回值就是函数执行以后返回的结果
- 通过return来指定函数的返回值
return后面可以跟任意对象,返回值甚至可以是一个函数 ```python
写一个函数的最初的梦想,是不是封装好这个功能,让我们随时可以使用(调用)
def fun(*args): r = 0 for i in args:
r += i
print(r) return r # fun(1, 2, 3, 4) = r
result = fun(1, 2, 3, 4) # 函数的返回值用函数的调用fun()来接受了这个返回值的结果
print(r) #局部变量不能全局使用
print(fun(1, 2, 3, 4) - 4) print(result - 4)
10 10 6 6
==================
任何类型的值都可以作为函数的返回值来返回
def fun1():
# return 1# return None# return True# return [1, 2, 3]def fun2():print(111)return 112return fun2
print(fun1()) # 调用fun1(),但没有返回值 print(fun1()()) # fun1()() = fun2(), 调用 fun1()中的fun2() r = fun1()
print(r())
112
对于返回值来说,如果你不写return xxx 和 只写一个return ,返回的结果都是None
return的特性: 在函数中,return后面的代码都不会执行, return一旦执行,函数自动结束
def fun3(): print(111) return print(2222)
fun3()
111
======================= def fun4(): for i in range(5): if i == 3: break # 用来退出当前循环
# continue # 用来跳出当前循环returnprint(i)print('循环执行结束')
fun4()
0 1 2
循环执行结束
def fun4(): for i in range(5): if i == 3:
# break # 用来退出当前循环continue # 用来跳出当前循环returnprint(i)print('循环执行结束')
fun4()
0 1 2 4 循环执行结束
<a name="ENh6R"></a>## 2. 文档字符串- help()是Python中内置函数,通过help()函数可以查询Python中函数的用法- 在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明```python# 文档字符串,运用于对函数或者面向对象做功能、参数等的说明帮助文档def fun(a, b):"""这是一个文档字符串的示例这个函数的功能是做什么。。。。。函数的参数::param a: 作用 功能 类型 默认值:param b:作用 功能 类型 默认值:return: 返回值"""# help()帮助查看文档说明的#help(input)help(fun)---------------------------Help on function fun in module __main__:fun(a, b)这是一个文档字符串的示例这个函数的功能是做什么。。。。。函数的参数::param a: 作用 功能 类型 默认值:param b:作用 功能 类型 默认值:return: 返回值
3. 函数的作用域
- 作用域(scope)
- 作用域指的是变量生效的区域
- 在Python中一共有两种作用域
- 全局作用域
- 全局作用域在程序执行时创建,在程序执行结束时销毁
- 所有函数以外的区域都是全局作用域
- 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
- 函数作用域
- 函数作用域在函数调用时创建,在调用结束时销毁
- 函数每调用一次就会产生一个新的函数作用域
- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问 ```python b = 456 def fun(): a = 123 print(‘函数内部’, a) print(‘函数内部’, b)
fun()
print(‘函数外部:’, a) # NameError: name ‘a’ is not defined
print(‘函数外部:’, b)
函数内部 123 函数内部 456
函数外部: 456
def fun2():
# 声明a是全局变量,属于全局作用域global aa = 20def fun3():print('fun3里面', a)fun3()
fun2()
print(a)
fun3里面 20 20
<a name="yvg8L"></a>## 4. 命名空间- 命名空间实际上就是一个字典,是一个专门用来存储变量的字典- locals()用来获取当前作用域的命名空间- 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间- 返回值是一个字典```pythona = 1b = 2c = 3d = 4space = locals()# space['e'] = 5print(space)----------------------------{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002B9895E08B0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/pythonProject/Python基础/第9讲 函数中/命名空间.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'space': {...}}======================================def fun():abc = 123space1 = locals()space2 = globals()print('space1:', space1)print('space2:', space2)fun()-----------------------------------space1: {'abc': 123}space2: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000021A952108B0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/pythonProject/Python基础/第9讲 函数中/命名空间.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'fun': <function fun at 0x0000021A95358040>}
5. 递归函数
- 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题
- 递归式函数有2个条件
print(‘10! = ‘,fun(10))
=================
求任意数字的任意次幂运算
def fun(n, m): # fun(n, m)是求n的m次幂运算
# 基线条件if m == 1:return n# 递归条件return n * fun(n, m-1)
print(‘10**5 = ‘,fun(10, 5))
10**5 = 100000
====================================
回文字符串的练习
检测一个字符串是不是一个会问字符串,是的返回True, 否则返回false
abcdefgfedcba abcdefggfedcba
bcdefgfedcb bcdefggfedcb
cdefgfedc cdefggfedc
g gg
def fun1(s): # 判断是否是回文字符串
# 基线条件if len(s) < 2:return Trueelif s[0] != s[-1]: # != 就是不等于return False# 递归条件print(s[1:-1])return fun1(s[1:-1])
s = input(‘请输入字符串: ‘) if len(s) < 2: print(‘字符串太短’) else:
print(fun1(s))
请输入字符串: abcdedcba bcdedcb cdedc ded e True
<br /><a name="article-title"></a># 作业1. 用函数实现一个判断用户输入的年份是否是闰年的程序<br />1.能被400整除的年份<br />2.能被4整除,但是不能被100整除的年份<br />以上2种方法满足一种即为闰年```pythondef leap_year(year):if year % 400 == 0:print('闰年')elif (year % 4 == 0) and (year % 100 != 0):print('闰年')else:print('不是闰年')leap_year(int(input('请输入年份:')))
- 猴子吃桃问题(递归):
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
def monkey(j, n): # j:剩几个桃子, n:第几天i = 1for i in range(n-1):print(f'第{10-i}天', j)j = (j + 1) * 2return jnum = monkey(1, 10) # 第10天剩下1个桃子print(f'第1天 {num}')-------------------------第10天 1第9天 4第8天 10第7天 22第6天 46第5天 94第4天 190第3天 382第2天 766第1天 1534===================def monkey(i, n): # i:剩几个桃子, n:第几天print(f'第{n}天有{i}个桃子')if n > 1:i = (i + 1) * 2else:return in = n - 1return monkey(i, n)monkey(1, 10) # 第10天剩下1个桃子--------------第10天有1个桃子第9天有4个桃子第8天有10个桃子第7天有22个桃子第6天有46个桃子第5天有94个桃子第4天有190个桃子第3天有382个桃子第2天有766个桃子第1天有1534个桃子====================def fun(n): # fun(n) 是为了求n天之前的桃子一共有多少个# 今天也就是n 等于1 的时候,这个就是基线条件if n == 1:return 1return (fun(n-1) + 1) * 2print(fun(10))---------------------1534
