乐趣区

关于python:Python之路day0910函数初识形参argskwargs用法

前言时刻:

下午到当初写了两篇博客了,好累呀,昨天的博客原本能够写完的,然而为了早睡就没写了,就放到下午写的。有点悔恨,应该当日事当日毕。

来来总结一波:

函数的实参、形参的用法

万能参数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}

总结:

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

退出移动版