一.实参类型
-->实参可以传递任意类型
def fn(a):
print('a = ',a)
b = 123 #a = 123
b = True // a = True
b = 'python' //a = python
fn(b)
-->函数调用时解析器不会检查实参类型,需要注意
def f1(a,b):
print(a + b)
f1(1,'2')
TypeError: unsupported operand type(s) for +: 'int' and 'str'
-->如果形参执行的是一个对象(列表,字典...),但我们通过形参改变对象时,会改变所有指向该对象的变量
def fn(a):
a[0] =30
print('a = ',a, id(a))
c = [1,2,3]
fn(c) # 相当于a = c,次数a,c 是指向同一个对象
fn(c.copy()) #此时指向不同对象
print('c = ',c, id(c))
# a = [30, 2, 3] 2360030290504
# c = [30, 2, 3] 2360030290504
# a = [30, 2, 3] 1828469891720
# c = [1, 2, 3] 1828469891656
二.不定长参数
-->实参可以传递任意类型
def fn(a):
print('a = ',a)
b = 123 #a = 123
b = True a = True
b = 'python' a = python
fn(b)
-->函数调用时解析器不会检查实参类型
def f1(a,b):
print(a + b)
f1(1,'2')
# # TypeError: unsupported operand type(s) for +: 'int' and 'str'
-->如果形参执行的是一个对象(列表,字典...),但我们通过形参改变对象时,会改变所有指向该对象的变量
def fn(a):
a[0] =30
print('a = ',a, id(a))
c = [1,2,3]
fn(c) # 相当于a = c,次数a,c 是指向同一个对象
# fn(c.copy()) #此时指向不同对象
print('c = ',c , id(c))
# a = [30, 2, 3] 2360030290504
# c = [30, 2, 3] 2360030290504
# a = [30, 2, 3] 1828469891720
# c = [1, 2, 3] 1828469891656
-->在定义函数的时候,在形参前面加*,那么他就能获取所有实参,保存在元组中
多个数的计算实例:
def f4(*args):
# print('args =',args,type(args)) //args = (1, 2, 3, 4, 5)
r =0
for iin args:
r += i
print(r)
# f4(1,2,3,4,5)
# 15
注意:
1.带*的形参只能有一个,
2.带*的形参后面只能是关键字参数,否则报错
def f5(a,b,*c):
# def f6(a,*b,c):
def f7(a,*b,c):
print('a = ',a)
print('b = ',b)
print('c = ',c)
# f5(1,2,3,4,5)
# a = 1
# b = 2
# c = (3, 4, 5)
# f6(1,2,3,4,5) // TypeError: f6() missing 1 required keyword-only argument: 'c'
# f7(1,2,3,4,c = 5)
a = 1
b = (2, 3, 4)
c = 5
-->*args只能接收位置参数,
-->**keyargs可以接收关键字参数,只能有一个,且只能放在最后面
def fn8(*a):
#def fn8(**a):
print('a = ', a)
fn8(b =1,c =4,d =8)
#TypeError: fn8() got an unexpected keyword argument 'b'
a = {'b': 1, 'c': 4, 'd': 8}
三.函数返回值
1.直接使用函数返回值
2.通过变量接受函数返回值
-->return 任意对象(序列,数字,字符串,布尔值..)
-->一个函数没有return,或者return后面什么都没有写,相当于return None
-->return一旦出现,后面的代码都不会执行
def fn():
return 12
fn()
print(fn()) 12 // 1.直接使用函数返回值
r = fn()
print(r) 12 // 2.通过变量接受函数返回值
四.文档字符串
仅做了解,简单代码实例:
def fn():
"""
这是一个文档字符串
:return:
"""
help(fn)
Help on function fnin module __main__:
fn()
这是一个文档字符串
:return:
五.函数作用域
1.作用域:变量生效的区域
-->局部作用域
def fn():
a =1 #局部变量a,只能作用在函数内部
print('a = ',a)
fn() #a = 1
print('a = ', a) #NameError: name 'a' is not defined
-->全局作用域
b = 2 #//全局变量,可以被访问到
def fn1():
a = 1
print('函数内部a = ',a)
print('函数内部b = ',b)
fn1()
print('函数外部b = ',b)
# 函数内部a = 1
# 函数内部b = 2
# 函数外部b = 2
-->可以在局部作用域的变量前面加上关键字 global,使它成为全局变量
def fn():
global a
a =1
print('a = ',a)
fn()
print('a = ', a)
a =1
a =1
六.递归
递归:解决问题的思想,类似循环,但是基本不使用,在函数中自己调用自己
两个条件:
1.基线条件:问题可以被分解为最小的问题,满足基线条件,递归不再执行
2.递归条件:问题可以继续分解的条件
-->用递归求任意数(用户决定)的阶乘,
def fn(n):
if n == 1: #基线条件
return 1
else:
return fn(n - 1) * n #递归条件
print(fn(int(input('请输入阶乘数:')))) #24