1 实参的类型
实参可以传递任意类型的对象,且调用函数的时候是不会检查实参的类型。
def func(a, b):
print(a + b)
func(1,2)
func('a', 'b')
在函数中重新给形参重新赋值,不会影响其他的变量。
如果是一个列表,尝试修改列表里面的元素,如果现在的形参执行的是一个对象,通过形参修改对象时,会影响到所有指向的对象的变量。
2 不定长参数
def s(a,b):
print(a + b)
s(123,345,789)
s(123)
综上情况,在定义函数的时候,可以在形参的前面加上一个*。形参即可获取所有人的实参,将获取的实参放到一个元组中。
def s(*a):
print('a = ',a)
s()
s(1,2,3)
s(4)
s(1,2,'a')
注意:注意带的形参只能有1个,会发生报错。
不定长参数不一定非要在后面,但是一定要带后面的参数,都必须以关键字的形式来进行传参。
*形参只能接收位置参数。
** 形参可以接收其他关键字参数,他会将这些参数统一保存到一个字典当中。
key 就是参数的名字,value为参数的值。
** 形参只能有一个,并且只能卸载所有参数的后面。处理关键字参数。
3 函数的返回值
返回值就是函数执行之后返回的结果。使用return来指定函数的返回值。
可以直接使用函数的返回值,也可以通过一个变量来接收函数的返回值。
return后面返回任意对象,也可以返回函数。
def fn():
return 123
r = fn()
print(r)
当函数后面没有return或者只有return,则等于return None。
在函数中,return后面的代码都不会执行。return一旦执行函数自动结束。
def fn2():
print(1)
return
print(2)
fn2()
4 文档字符串
help()是Python中内置函数,通过help()函数可以查询Python中函数的⽤法,在定义函数时,可以在函数内部编写⽂档字符串,⽂档字符串就是对函数的说明
def fn(a:int,b,c):
'''
这是一个文档字符串的实例
参数的作用
:param a: 作用 类型 默认值...
:param b: 作用 类型 默认值...
:param c: 作用 类型 默认值...
:return: 返回值的类型是什么....
'''
return 10
help(fn)
5 函数的作用域
作用域就是变量生效的区域。
- 全局作用域:全局作用域在程序执行时创建,在程序执行结束时销毁所有函数以外的区域都是全局作用域。
在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问。 - 函数作用域:函数作用域在函数调用时创建,在调用结束时销毁
函数每调用一次就会产生一个新的函数作用域
在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问。
a = 20
def fn():
a = 10
print('内部函数:a = ',a)
fn()
print('外部函数:a = ',a)
希望在函数内部修改全局变量的时候,则需要使用global关键字,来声明变量。
a = 20
def fn():
global a
a = 10
print('函数内部a =',a)
fn()
print('函数外部a =', a)
a变成了全局变量,值发生改变。
6 递归函数
递归是解决问题的一种方式,和循环比较类似。将大问题分解为多个小问题,直至无法分解,再来解决问题。
# 10 的阶乘
n = 10
for i in range(1,10):
n *= i
print(n)
使用函数递归的方法。
# 求任意数的阶乘
def fn(n):
result = n
for i in range(1,n):
result *= i
return result
print(fn(10))
1.基线条件
问题可以被分解为最小的问题,当满足基线条件时,递归就不在执行。
2.递归条件
将问题可以继续分解的条件
def fn(n):
# 参数n 要求阶乘的数字
# 1 基线条件
# 判断如果n为1的时候,结束递归
if n == 1:
return 1
# 2 递归条件
return n * fn(n-1)
print(fn(10))
# 求一个数的随意阶乘
def fn(n,i):
if i==1:
return n
return n*fn(n,i-1)
print(fn(5,6))