(D09)Python-函数的传参

Python-函数的传参


函数的传参(把数据传给函数)
函数的形参(接收函数调用的数据)


Python函数的参数传递

  • 传递方式
    • 位置传递
    • 序列传参
  • 关键字传参
    - 字典关键字传参

下面是函数的实参传递:

位置传参:
- 实际参数(实参) 的对应关系与形式参数的对应关系是按位置来一次对应的
- 说明:
- 实参和形参通过位置进行传递和匹配
- 实参的个数 必须与形参的个数相同
示例:


# 此示例示意位置传参
def myfun(a, b, c):
    '''这是一个函数传参的示例'''
    print('a的值是:', a)
    print('b的值是:', b)
    print('c的值是:', c)

myfun(1, 2, 3)
myfun(4, 5, 6)
myfun("ABC", [1,2,3], (44,55,66))

序列传参:
- 序列传参是指函数在调用过程中用*将序列拆解后按位置进行传递的传参方式
- 说明:
- 序列传参时,序列拆解的位置将于形参一一对应

示例:

# 此示例示意 序列传参
def myfun(a, b, c):
    '''这是一个函数传参的示例'''
    print('a的值是:', a)
    print('b的值是:', b)
    print('c的值是:', c)

L = [11, 22, 33]

# myfun(L[0], L[1], L[2])
myfun(*L)

# myfun(L)
``


**关键字传参:**

- 关键字传参是指传参时,按着形参名称给形参赋值,实参和形参按名称匹配
- 说明:
	- 可以不按位置进行匹配  
**示例:**

此示例示意 关键字传参

def myfun(a, b, c):
‘’‘这是一个函数传参的示例’’’
print(‘a的值是:’, a)
print(‘b的值是:’, b)
print(‘c的值是:’, c)

myfun(c=33, b=22, a=11)
myfun(b=222, c=333, a=111)
``

字典关键字传参:

  • 是指实参为字典,将字典用** 拆解后进行关键字传参的传递方式
  • 说明:
    • 字典的键名和形参名必须一致
    • 字典的键名必须为合法的标示符命名规则的字符串
    • 字典的键名要在形参中存在

示例:

# 此示例示意 字典关键字传参
def myfun(a, b, c):
    '''这是一个函数传参的示例'''
    print('a的值是:', a)
    print('b的值是:', b)
    print('c的值是:', c)

d = {'a':100, 'c':300, 'b':200}

# myfun(a=d['a'], c=d['c'], b=d['b'])
myfun(**d)  # 等同于上面一条语句

# myfun(d)  # 出错

函数的综合传参

  1. 函数的传参方式在能确定形参能唯一匹配到相应实参的情
    况下可以任意组合
  2. 函数的位置传参要先于关键字传参

示例:

    def myfun(a, b, c):
        pass
    myfun(100, *[200, 300])
    myfun(100, *"BC")
    myfun(*"AB", 300)
    myfun(*[100], 200, *[300])
    myfun(100, c=300,b=200)
    myfun(a=100, 200, c=300)  # 错误的

    myfun(100, **{'c':300, 'b':200})
    myfun(100, **{'c':300}, b=200)
    myfun(100, b=200, **{'c':300})

下面是函数的形参:

函数的缺省参数

  • 语法:
    • def 函数名(形参名1=默认实参1, 形参名2=默认实参2,
      形参名3=默认实参3, …)
  • 作用:
    • 让函数的调用者少传递参数来调用函数
  • 说明:
    1. 缺省参数必须自右至左依次存在,如果一个参数有缺省
      参数, 则其右侧的所有参数都必须有缺省参数
    2. 缺省参数可以有0个,1个或多个,甚至全部都有缺省参数

示例:

  如:
    def fn(a, b=10, c): # 错误
        pass
    def fn(a=0, b=None, c=False):  # 是这对的
        pass

函数的可变实参和不可变实参的传递

  • 说明:
    • 当一个可变对象通过函数实参传入函数内时,在函数内
      可以通过局部变量来操作可变对象(列表,字典,集合…)

面试题:

  • 试运行以下程序的结果是什么, 为什么?
	L = [1, 2]

    def fn(a, lst=[]):
        lst.append(a)
        print(lst)
  
    fn(3, L)  # [1, 2, 3]
    fn(4, L)  # [1, 2, 3, 4]
    fn(5)  # [5]
    fn(6)  # [5, 6]
    fn(7)  # [5, 6, 7]

函数形参的定义方式

  • 位置形参
  • 星号元组形参
  • 命名关键字形参
  • 双星号字典形参

位置形参:

  • 语法:
    • def 函数名(形参变量1, 形参变量2, …):
      • 语句块

星号元组形参
语法:

  • def 函数名(*元组形参名):
    • 语句块

作用:

  • 收集多余的位置传参

说明:

  • 元组形参名一般命名为’args’
  • *元组形参一个函数只能有一个

命名关键字形参
语法:

  • def 函数名(*,命名关键字形参1, 命名关键字形参2,…):
    • 语句块
  • def 函数名(*args,命名关键字形参1, 命名关键字形参2,…):
    • 语句块

作用:

  • 强制所有的命名关键字形参都必须用关键字传参或字典关
    键字传参

示例:

# 此示例示意命名关键字形参
def func(a, b, *, c, d):
    print(a, b, c, d)

# func(1, 2, 3, 4)  # 传参失败
func(1, 2, c=30, d=40)
func(a=10, b=20, c=30, d=40)
func(1, 2, **{'d':400, 'c':300})

双星号字典形参:
语法:

  • def 函数名(**字典形参名):
    • 语句块

作用:

  • 收集多余的关键字传参

说明:

  • 字典形参名一般命名为’kwargs’
  • 一个函数内字典形参最多只有一个

示例:

# 此示例示意双星号字典形参
def func(**kwargs):
    print("关键字传参的个数是:", len(kwargs))
    print('kwargs=', kwargs)

func(name="张老师", age=35, address="朝阳区")

def func(*,a, b, **kwargs):
    print("关键字传参的个数是:", len(kwargs))
    print('kwargs=', kwargs)

func(a=1, b=2, c=3, d=4)

函数的形参说明:

  • 位置形参,缺省参数,星号元组形参,双星号字典形参可以混
    合使用

函数形参自左至右的定义顺序为:

  • 位置形参
  • 星号元组形参
  • 命名关键字形参
  • 双星号字典形参

示例:

  def fn(a, b, *args, c, **kwargs):
      pass
  fn(1, 2, 3, 4, c=30, d=40, e=50)

函数的不定长参数:

  • 有两种: 星号元组形参,双星号字典形参
  • 用不定长参数可以接收任意的传参
    如:
    def fn(*args, **kwargs):
        print(args, kwargs)

全局变量和局部变量

  • 局部变量
    1. 定义在函数内部的变量称为局部变量(函数的形参也是
      局部变量)
    2. 局部变量只能在函数内部使用
    3. 局部变量在函数调用时才能创建,在函数调用之后会
      自动销毁
  • 全局变量
    1. 定义在函数外部,模块内部的变量称为全局变量
    2. 全局变量所有的函数都可以直接访问(但函数内部不能将
      其直接赋值)

说明:

  • 函数内部赋值语句不会对全局变量造成影响
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值