Python基础9-不定长参数、返回值、作用域、命名空间、递归式函数

本文深入探讨Python函数的高级特性,包括不定长参数、返回值、帮助文档、作用域、全局变量声明、命名空间及递归函数的原理与应用。通过实例解析,帮助读者掌握函数的灵活使用。

七、函数(点击跳转)

3、不定长参数

3.1、* 星号

在定义形参前面加个*星号表示该形参会接收所有的位置传参,
把接收的位置传参放在一个元组里面,

示例1def 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、** 双星号

在定义形参前面加上 ** 双星号表示该形参会接收所有的关键字传参,
把接收的关键字传参放在一个字典里
带 ** 双星号的形参一定在最后面

示例1def 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

示例2def fn(a,b):
	return a+b
r = fn(1,2)
print(r)

>> 3

函数的返回值可以用变量接收再次利用

示例1def fn(a,b):
	return a+b
r = fn(5,5)
print(r + 2)

>> 12

return 和循环里的 break有些相似,都具有结束功能:
break 用来结束循环
return 用来结束函数

示例1def fn():
	print('函数开始执行')
	return 
	print('函数结束执行')
fn()

>> 函数开始执行

5、文本说明

5.1、help( )

内置函数 help() 用于查询函数的用法
在定义函数时,给函数编写文档字符串,以确保其他人能够理解
这相当于函数使用说明书

语法:
help(函数对象)

可以使用单引号、双引号、三引号来定义函数注释内容

示例1def 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( ) 用来获取当前位置的全部局部变量

示例1def 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 的阶乘再乘以 n

1、基线条件

从拆分问题得到基线条件为 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 - 1

1、基线条件

从拆分问题得到基线条件为: i == 1
如果次幂数为 i ==1 时的时候直接返回一个 n
基线条件解决了

2、递归条件

从拆分问题得到递归条件为拆分部分 n * n ** i -1
n * n ** i -1 相当于 n * fn ( n, i-1 )


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值