学习目录
七、函数(点击跳转)
3、不定长参数
3.1、* 星号
在定义形参前面加个*星号表示该形参会接收所有的位置传参,
把接收的位置传参放在一个元组里面,
示例1:
def fn(*name):
print(name)
fn('盖伦','德莱厄斯','卡特琳娜')
>> ('盖伦', '德莱厄斯', '卡特琳娜')
带 * 星号的形参可以放在其他位置(不一定要最后)
但如果这么做就需要额外的步骤:关键字传参
示例1:
def fn(a,*b,c):
print('a =',a)
print('b =',b)
print('c =',c)
fn('亚索','图奇','永恩','薇恩','茂凯',c='墨菲特')
>> a = 亚索
>> b = ('图奇', '永恩', '薇恩', '茂凯')
>> c = 墨菲特
3.2、** 双星号
在定义形参前面加上 ** 双星号表示该形参会接收所有的关键字传参,
把接收的关键字传参放在一个字典里
带 ** 双星号的形参一定在最后面
示例1:
def fn(**a):
print(a)
fn(a='不灭狂雷',b='戏命师',c='疾风剑豪')
>> {'a': '不灭狂雷', 'b': '戏命师', 'c': '疾风剑豪'}
3.3、参数的解包
解包与星号的操作差不多是相反,星号是接收参数,而解包是分配参数
在传递实参时候在实参前加上 * 星号,单星号和双星和用法一样
示例1:
t = (10,20,30)
def fn(a,b,c):
print('a =',a)
print('b =',b)
print('c =',c)
fn(*t)
>> a = 10
>> b = 20
>> c = 30
示例2:
d = {'name':'张三','age':'18'}
def fn(**a):
print('我叫',a['name'],'今年',a['age'],'岁了!')
fn(**d)
>> 我叫 张三 今年 18 岁了!
4、返回值 (return)
返回值就是函数执行返回的结果,如果没有定义返回值,默认返回值是 None
可以通过 return 来定义函数返回值,
return 定义返回值可以是任意对象,甚至可以是一个函数
示例1:函数的默认返回值为None
def fn():
pass
return
r = fn()
print(r)
>> None
示例2:
def fn(a,b):
return a+b
r = fn(1,2)
print(r)
>> 3
函数的返回值可以用变量接收再次利用
示例1:
def fn(a,b):
return a+b
r = fn(5,5)
print(r + 2)
>> 12
return 和循环里的 break有些相似,都具有结束功能:
break 用来结束循环
return 用来结束函数
示例1:
def fn():
print('函数开始执行')
return
print('函数结束执行')
fn()
>> 函数开始执行
5、文本说明
5.1、help( )
内置函数 help() 用于查询函数的用法
在定义函数时,给函数编写文档字符串,以确保其他人能够理解
这相当于函数使用说明书
语法:
help(函数对象)
可以使用单引号、双引号、三引号来定义函数注释内容
示例1:
def fn():
'''
这是一个自定义函数
没有任何作用
'''
pass
help(fn)
>> fn()
>> 这是一个自定义函数
>> 没有任何作用
6、作用域
作用域指的是变量生效的区域
全局作用域中的变量与局部作用域的变量不会有冲突
6.1、全局作用域
不函数内的区域都是全局作用域
在程序执行时创建,在程序结束时销毁
在全局定义的变量都为全局变量,全局变量可以在任意位置进行访问
6.2、函数作用域
在函数内的区域都是函数作用域
在函数执行的创建,在函数结束时销毁
在函数作用域定义的变量都是局部变量,局部变量只能在函数作用域中访问
对不可变对象进行修改时:
函数内部( 局部 )赋值变量,函数外部( 全局 )的变量不受影响
示例1:
a = 'hello world'
def fn():
a = 'hello Python'
print(a)
fn()
print(a)
>> hello Python
>> hello world
对可变对象修改时:
在函数内部( 局部 )修改对象是会影响到外部( 全局 )的对象
示例1:
a = [1,2,3]
def fn(a):
a[0] = 5
fn(a)
print(a)
>> [5, 2, 3]
6.3、global 声明变量
在局部修改全局的变量时,则需要用 global 声明局部变量为全局变量
语法:
global 变量名
示例1:
a = 10
def fn():
global a
a += 5
fn()
print(a)
>> 15
7、命名空间
命名空间实际上是一个字典,用来储存变量的字典
locals( ) 用来获取当前位置的全部局部变量
示例1:
def fn(i):
a,b,c,d = 10,20,30,40
print(locals())
fn(5)
>> {'i': 5, 'a': 10, 'b': 20, 'c': 30, 'd': 40}
8. 递归式函数
递归是解决问题的一种方式,和循环非常的像
递归的整体思想是将一个大问题分解为一个一个小问题,直到问题无法分解时,再去解决问题。递归式函数有2个条件:
1、基线条件
2、递归条件递归式函数:函数调用自身
8.1、基线条件
基线条件:
问题可以被分解为最小问题,当满足基线条件时,递归就不执行
满足基线条件时函数将直接返回一个值,不在进行递归
8.2、递归条件
递归条件:
可以将问题继续分解的条件
将问题继续分解为小问题,问题终将被分解成基线条件就可以解决最小问题
示例1:求任意数的阶乘
def fn(a):
if a == 1:
return a
return a * fn(a-1)
print(fn(10))
>> 3628800
- 分析示例1
先把问题拆分
10! = 10 * 9!
9! = 9 * 8!
8! = 8 * 7!
以此推论,最终结果为 1! = 1
从而得知:1的阶乘为1
大于1的阶乘,其阶乘为 n - 1 的阶乘再乘以 n1、基线条件
从拆分问题得到基线条件为 1! = 1
如果a == 1 的时候直接返回一个a
基线条件解决了2、递归条件
从拆分问题得到递归条件为拆分部分 a * (a - 1)
如果不符合基线条件,那么递归条件就执行,拆分问题直到符合基线条件位置
a * fn (a - 1) 相当于 a * a-1
示例2:求任意值的任意幂运算,a为任意值,b为任意幂的次数
def fn(n,i):
if i == 1:
return n
else:
return n * fn(n,i-1)
print(fn(10,10))
>> 10000000000
- 分析示例2
先把问题拆分
10 ** 10 = 10 * 10 ** 9
10 ** 9 = 10 * 9 ** 8
10 ** 8 = 10 * 8 ** 7
以此推论,最终结果为 10 ** 1 = 10
从而得知:n 的 1次幂等于 n
大于1的幂运为 n * n ** i - 11、基线条件
从拆分问题得到基线条件为: i == 1
如果次幂数为 i ==1 时的时候直接返回一个 n
基线条件解决了2、递归条件
从拆分问题得到递归条件为拆分部分 n * n ** i -1
n * n ** i -1 相当于 n * fn ( n, i-1 )
本文深入探讨Python函数的高级特性,包括不定长参数、返回值、帮助文档、作用域、全局变量声明、命名空间及递归函数的原理与应用。通过实例解析,帮助读者掌握函数的灵活使用。

2498

被折叠的 条评论
为什么被折叠?



