Python之路day09+10-函数初识_形参_*args_**kwargs用法

Posted 西园公子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之路day09+10-函数初识_形参_*args_**kwargs用法相关的知识,希望对你有一定的参考价值。

前言时刻:

下午到现在写了两篇博客了,好累呀,昨天的博客本来可以写完的,但是为了早睡就没写了,就放到下午写的。有点后悔,应该当日事当日毕。

来来总结一波:

函数的实参、形参的用法

万能参数args,以及*kwargs,命名空间、变量作用域、

globals和locals

1、函数参数

1.1 实参

传递实参一般三种方式,

1、位置型参数,按照位置,一一对应

def test(name1, age1):
    print(name1, age1)  # python 18

test(\'python\', 18)

2、关键字型参数,一一对应即可,位置可不对应

def test(name, age):
    print(age, name)   # 17 python

test(age=17, name=\'python\')

3、位置型+关键字组合型

# 3、位置型+关键字型 的组合

def test(name, age, hobby):
    print(age, name, hobby)  # 17 python exercise
    

test("python", 17, hobby="exercise")

需要注意的是,位置型的参数必须在关键字型的前面。

1.2、形参

调用函数中的参数前后顺序,是位置参数>*args>默认参数>关键字参数>**kwargs,重点掌握 * 的用法。

1、* 的用法:

  • 在函数中参数 代表聚合,其含义是在调用函数传入的参数,到函数中会聚合成为一个参数args,方便简单利于后续维护。
  • 在调用中参数 代表打散,调用函数传入的参数,会全部打散成单个。然后到函数中会聚合成为一个参数args

一般是 *args (arguments的缩写),是元组 tuple 类型

*args例子:

def test(*args):
    print(args, type(args))
    
# 1、定义函数中使用 * 代表聚合

test("17", "python", \'study\') 
# (\'17\', \'python\', \'study\') <class \'tuple\'>


# 2、调用函数中使用 * 代表打散

test(*["17", "python"], *["study", "come", "on"])
# (\'17\', \'python\', \'study\', \'come\', \'on\') <class \'tuple\'>

2、**的用法:

  • 在函数中参数 代表聚合,其含义是在调用函数传入的参数,到函数中会聚合成为一个参数 kwargs,方便简单利于后续维护。
  • 在调用中参数 代表打散,调用函数传入的参数,会全部打散成单个。然后到函数中会聚合成为一个参数 kwargs,便简单利于后续维护。

一般是 *kwargs (keywords arguments的缩写),是字典 dict 类型。

**kwargs的例子:

def test(**kwargs):
    print(kwargs, type(kwargs))
    

# 1、定义函数中使用 ** 代表聚合

test(name="python", age="17") 
# {\'name\': \'python\', \'age\': \'17\'} <class \'dict\'>


# 2、调用函数中使用 ** 代表打散

test(**{\'name\': \'python\', \'age\': \'17\'}, **{\'hobby\': \'study\'})
# {\'name\': \'python\', \'age\': \'17\', \'hobby\': \'study\'} <class \'dict\'>

3、* 混合使用:

调用函数中的参数前后顺序,是位置参数>*args>默认参数>关键字参数>**kwargs,不可以更换前后顺序,否则出错。

def test(*args, **kwargs):
    print(args, type(args))
    print(kwargs, type(kwargs))
    

# 1、* he ** 混合使用

test(1, 2, **{\'we\': "can"}, age="17", name="python") 
# (1, 2) <class \'tuple\'>
# {\'we\': \'can\', \'age\': \'17\', \'name\': \'python\'} <class \'dict\'>


# 2、位置参数+args+关键字参数+kwargs

test(1, 3,*(1, 4), **{\'we\': "can"}, age="17", name="python") 
# (1, 3, 1, 4) <class \'tuple\'>
# {\'we\': \'can\', \'age\': \'17\', \'name\': \'python\'} <class \'dict\'>

2、命名空间

有点类似是 c++ 中的namespace,真的发现学好 C++ 后 Python 上手超级快,很多的概念都是一样的。

命名空间一般包括:内置命名空间、全局命名空间、局部命名空间。

  • 内置: Python 内部的定义的名称 builtins.py ,
  • 全局命名空间:指函数外定义的全部变量属于全局命名空间
  • 局部命名空间:函数内定义的变量属于局部

2.1 加载顺序:

内置命名>全局命名(从上到下加载)>局部命名(函数调用时才加载)

2.2 取值顺序:

采用就近原则,局部变量>全局变量>内置变量

2.3 作用域

全局作用域:全局命名空间+内置命名空间

局部作用域:局部命名空间。

有两个内置函数用于打印作用域,globals():打印全局作用域 和 locals() :打印当前空间的作用域

>>> name = "python"
>>> globals()
{\'__name__\': \'__main__\', \'__doc__\': None, \'__package__\': None, \'__loader__\': <class \'_frozen_importlib.BuiltinImporter\'>, \'__spec__\': None, \'__annotations__\': {}, \'__builtins__\': <module \'builtins\' (built-in)>, \'name\': \'python\'}
>>> def test():
...     age=17
...     print(locals())
... 
>>> test()
{\'age\': 17}

总结:

今天老师说了一句很对的话,就是培养自学的能力。无论干什么,都要培养自学的能力,否则你会丧失思考和学习的能力,路会变得更窄。

以上是关于Python之路day09+10-函数初识_形参_*args_**kwargs用法的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之路Day1:模块初识_自创

python成长之路第三篇_初识函数

Python之路day13-内置函数_lambda_闭包

Python之路day11-迭代器_迭代对象_函数名_global_nonlocal

Python之路_Day5

Python全栈之路Day22