【python学习】python的函数参数

中国史之【启继禹位】:
禹死后,其子启即位,成为中国由“禅让制”变为“世袭制”的第一人。
-来源:全历史APP

今天讲python的函数参数。有需要的也可以直接去我的github查看全部笔记:

https://github.com/JackKoLing/python_notes_with_ten_days
在这里插入图片描述
俗话说:“好记性不如烂笔头”,多写写多记记,总不会错。多一些不为什么的坚持,少一些功利主义的追求。对于环境的配置,可以参考以下两篇:

1 函数的简单示例

  • 多态性:一个函数实现多种类型的操作
def f1(x):
    print(x)
f1(3)
f1("Jackko")
>>>
3
Jackko
def f2(x, y):
    print(x+y)
f2(3, 4)
f2("hello ", "world")
>>>
7
hello world
m=3
n=4
def f3(x, y):
    x -= 1
    print(x, y)
f3(m, n)
print(m, n) # 变量是不可变对象
>>>
2 4
3 4
l1 = [1, 2, 3]
def f4(x):
    x.pop()
    print(x)
f4(l1) # 列表是可变对象
>>>
[1, 2]
l1 = [1, 2, 3]
def f5(x):
    x.pop()
    print(x)
f5(l1[:]) # 不要把l1传过去,而是弄一个切片新对象
print(l1)
>>>
[1, 2]
[1, 2, 3]

2 参数匹配模型

  • 默认情况下,参数通过其位置进行传递,从左到右,所以必须精准地传递和函数头部参数一样多的参数,也可以通过关键字参数、默认参数或参数容器等改变这种机制
  • 位置参数:从左到右,精准匹配
  • 关键字参数:调用函数时,使用“name=value”的语法通过参数名进行匹配
  • 默认参数:定义函数时,使用“name=value”的语法直接给变量一个值,从而传入的值可以少于参数个数
  • 可变参数:定义函数时,使用*开头的参数,可用于收集任意多基于位置或关键字的参数
  • 可变参数解包:调用函数时,使用*开头的参数,可用于将参数集合打散,从而传递任意多基于位置或关键字的参数
# 位置参数:从左到右,精准匹配
m = 3
n = 4
def f6(x, y):
    print(x, y)
f6(m, n)
# 关键字参数,在调用时使用关键字
f6(y=m, x=n)
>>>
3 4
4 3

先放所有的位置参数,再放所有的关键字参数

# 混用位置参数和关键字参数时,从左到右,必须先放所有的位置参数,再放所有的关键字参数
o = 7
def f7(x, y, z):
    print(x, y, z)
f7(m, z=o, y=n) # f7(z=o, y=n, m)则是语法错误
>>>
3 4 7

默认的参数放在后面

# 默认参数:在定义函数时使用,也是要求默认的参数放在后面
def f8(x, y, z=9):
    print(x, y, z)
f8(m, n, o)
f8(m, n) # 不给第三个参数,就使用默认参数
>>>
3 4 7
3 4 9

一个*是收集位置参数,返回元组

# 可变参数:在定义函数时使用,类似于收集参数。一个*是收集位置参数,返回元组
def f9(*x):
    print(x)
f9(m)
f9(m, n, o)
f9(m, n, 9)
>>>
(3,)
(3, 4, 7)
(3, 4, 9)

两个*是收集关键字参数,返回字典类型

# 可变参数的两个*是收集关键字参数,返回字典类型
def f10(**x):
    print(x)
f10(x=1, y=2, z=9)
>>>
{'x': 1, 'y': 2, 'z': 9}
# 混用位置参数和可变参数
def f11(x, *y):
    print(x, y)
f11(m, n, o)
>>>
3 (4, 7)
def f12(x, y=10, *z):
    print(x)
    print(y)
    print(z)
f12(m, n, o)
f12(m) # 不传z,则返回空元组
>>>
3
4
(7,)
3
10
()

Again: 一个是收集位置参数,返回元组; 两个是收集关键字参数,返回字典类型

def f13(*x, **y):
    print(x)
    print(y)
f13(m, n, o, i=3, j=6)
>>>
(3, 4, 7)
{'i': 3, 'j': 6}

可变参数解包:在调用函数时使用

# 可变参数解包:在调用函数时使用,刚好和可变参数相反,这是分解参数
l1 = ['Sun', 'Mon', 'Tus']
def f14(x, y, z):
    print(x, y, z)
f14(*l1) # 元素个数需要和函数参数匹配
l2 = ['a', 'b']
f14(m, *l2)
>>>
Sun Mon Tus
3 a b
def f15(x, *y):
    print(x)
    print(y)
f15(m, *l2)
>>>
3
('a', 'b')
d1 = {'k1':1, 'k2':2, 'k3':3}
def f16(x, *y, **z):
    print(x)
    print(y)
    print(z)
f16(m, *l2, **d1)
>>>
3
('a', 'b')
{'k1': 1, 'k2': 2, 'k3': 3}
f16(m, n, o, **d1)
>>>
3
(4, 7)
{'k1': 1, 'k2': 2, 'k3': 3}
f16(m, n, o, k1='v1', k2='v2') # 反正就是位置参数,关键字参数对应起来
>>>
3
(4, 7)
{'k1': 'v1', 'k2': 'v2'}

3 匿名函数lambda

lambda args: expression # args是参数,expression是语句
  • lambda是一个表达式,而非语句
  • lambda语句必须是合法的表达式,它是单个表达式,而不是代码块
  • lambda的首要用途是指定短小的回调函数,即函数功能非常简单,可以尝试使用lambda
  • lambda将返回一个函数,而不是将函数赋值给某变量名
  • lambda也支持使用默认参数,如f=(lambda x,y,z=10: x+y+z)
f = lambda x, y : x+y # 执行x+y
f(3, 4)
>>>
7
l3 = [ (lambda x: x*2), (lambda y: y*3)]
for i in l3:
    print(i(4)) # 函数调用,注意l3是列表,所以i代表两个lambda表达式
>>>
8
12

【声明】:学习笔记基于互联网上各种学习资源的个人整理。

以上是本期内容,下期介绍python的函数式编程。

我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我一起学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackkoLing

感谢你的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值