函数
创建
例:【下面的一定要看懂】
# 作者:咸瑜
# 代码时间:2022年11月28日
def calc(a, b):
return a + b
# 传参方式 1 [自动"位置"传参]
res = calc(1, 9)
print(res)
print(calc(1, 9))
# 传参方式 2 [参数名传参]
res = calc(a=11, b=22)
print(res)
# 传参方式 3 [手动“位置”传参]
params = [1, 2]
print(calc(*params)) # 1 + 2 = 3
# 传参方式 4 [手动“关键字”传参]
params = {"a": 2, "b": 2}
print(calc(**params)) # 2 + 2 = 4
传参内存分析
# 作者:咸瑜
# 代码时间:2022年11月28日
def fun(s1, s2):
print("函数内:s1:", s1)
print("函数内:s2:", s2)
s1 = 10086
s2.append(110)
print("计算后-函数内:s1:", s1)
print("计算后-函数内:s2:", s2)
h1 = 10
h2 = [20, 30, 40]
print("h1:", h1)
print("h2:", h2)
fun(h1, h2)
print("调用函数后 h1:", h1)
print("调用函数后 h2:", h2)
# 结果:
# h1: 10
# h2: [20, 30, 40]
# 函数内:s1: 10
# 函数内:s2: [20, 30, 40]
# 计算后-函数内:s1: 10086
# 计算后-函数内:s2: [20, 30, 40, 110]
# 调用函数后 h1: 10
# 调用函数后 h2: [20, 30, 40, 110]
可以看出 其实和Java/C等语言差不多,就是传值还是传址的关系了。
官方点:
如果是不可变对象,那么在函数体内修改不会影响到实参的值。
如果是可变对象,那么在函数体内修改会影响到实参的值。
返回值
挺神奇的啊 ,可以返回多个返回值,用逗号隔开即可。
def res():
return "参数1", "参数2"
print(res()) # ('参数1', '参数2')
注意:
没有函数返回值那么就 省略不写
如果函数返回值只有1个 直接返回原值
如果函数返回值只有多个 返回元祖
例子就不写了,都是有基础的人了。我也懒得写。【原谅我好吧...】
默认参数值
其实就是在函数定义的时候,就写好参数值,然后调用的时候如果存在值,那么就替换掉了:
注意有个很神经病的现象,就是如果你给第一个形参赋了默认值,那么第二个形参一定要默认值,不然报错
def calc(a, b=100):
return a + b
print(calc(2)) # 102
神经现象[错误写法]:
def calc(a = 1, b):
return a + b
函数的参数定义
- 个数可变的位置参数【用* 定义、结果是元祖】
- 个数可变的关键字形参【用 ** 定义 、结果是字典】
def param_test(param1, default2=0, *args3, **keyword4):
print('必选参数为:', param1)
print('默认参数为:', default2)
print('可选参数为:', args3)
print('关键字参数为:', keyword4)
param_test(1, 2, 3, 4, p1=5, p2=6)
# 必选参数为: 1
# 默认参数为: 2
# 可选参数为: (3, 4)
# 关键字参数为: {'p1': 5, 'p2': 6}
例子可以清清楚楚明明白白,但是:
- 个数可变的位置参数 和 个数可变的关键字形参 只能存在一个
函数参数小总结
变量
作用域
没什么好说的,看例子就完了:
# 作者:咸瑜
# 代码时间:2022年11月29日
name = "咸瑜老师"
def test():
print(name)
c = "test函数可调用的变量" # 只能在test上调用了。是个局部变量
# 错误: global globalVar = "全局变量" # 在定义全局变量的时候,不能赋值
global globalVar
globalVar = "全局变量"
test() # 咸瑜老师 证明:name的作用域穿透了函数test
print(globalVar) # 全局变量 证明:全局变量本页面中哪里都能使用。
递归函数
斐波那契数(递归实现):
# 作者:咸瑜
# 代码时间:2022年11月29日
name = "咸瑜老师"
# 1 1 2 3 5 8 13 21 34 55
def fbnqs(n):
if n == 1:
return 1
elif n == 2:
return 1
else:
return fbnqs(n - 1) + fbnqs(n - 2)
# 打印 1-66 的 斐波那契数
for i in range(1, 66):
print(fbnqs(i))
标签:10,函数,Python,h1,h2,参数,print,calc
From: https://www.cnblogs.com/bi-hu/p/16934545.html