前言时刻:
下午到现在写了两篇博客了,好累呀,昨天的博客本来可以写完的,但是为了早睡就没写了,就放到下午写的。有点后悔,应该当日事当日毕。
来来总结一波:
函数的实参、形参的用法
万能参数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}
总结:
今天老师说了一句很对的话,就是培养自学的能力。无论干什么,都要培养自学的能力,否则你会丧失思考和学习的能力,路会变得更窄。