【Python】小白经常会遇到的python程序中奇怪的符号汇总

学python的时候,我们都会上网时不时的接触到一些别人写的代码。但是对于初学者来说,很多时候会遇到这样的情况:虽然我把基础的语法什么的都弄明白了,但是还是会遇到奇奇怪怪的符号,让我怀疑我和别人学的是不是同一种语言。 我把一些容易遇到的“神奇代码”归纳如下,并把他们的含义和用法解释在下面:

1、奇怪的*args**kwargs

在函数的表达式中很多情况下会遇到这两个东西*args**kwargs。你可能遇到的是诸如*arg**kw等等不同的名字,这些名字不是主要的(取任何允许的变量名都行)。重要的是这个***。这里是什么意思呢?一个*号开始的这个args表示的是位置参数(arguments),而第二个**号开始的kwargs表示的是关键字参数(keyword arguments)。他们两个叫做python中的可变参数。也就是,存在这样的场景,比如,你要输入可变数目的参数给函数,而又不能提前定义好这些参数的数量。这个时候,可变参数就能发挥作用啦。比如下面这段代码就演示的是*args的用法:

def test(one, *args):
	print("first element is %s" %one)
	print("in args:"type(args))
	for i in args:
		print("%s" %i)

当我们在调用这个代码时:

>>>test(1,2,3,4,5)
first element is 1
in args: <class 'tuple'>
2
3
4
5

可以看到,第一个参数one是必须传入的形参,而后面的四个参数作为可变参数传入到了函数中。其实在存储的时候是以元组(tuple)的方式来存储的。
下面再来看一下**kwargs,它是作为关键字参数起作用的,本质上是以字典的方式来存储的,看下面的代码:

def test_kw(one, *args, **kwargs):
	print("first element is %s" %one)
	print("in kwargs:"type(kwargs))
	for k,v in kwargs.items():
		print("%s:%s" %(k,v))

接下来我们来运行这个代码:

>>>test(1,2,3,k1=4,k2=5)
first element is 1
in args: <class 'dict'>
k1:4
k2:5

可以看到,这里4、5作为位置参数传递给了k1和k2。python用字典的方式存储了起来。

2、奇怪的@

在python程序中,有时候我们会在一些函数的前面遇到奇怪的@符号,通常长这样:

def log(func):
	def wrapper(**args, **kw):
		print("runing...")
		return func(*args, **kw)
	return wrapper

@log
def now():
	print("2019-08-11")

我们看到这里定义了两个函数,作为小白来说,都能看得懂。但是第二个函数now前面的@log到底起什么作用就很匪夷所思了。其实这涉及到python面向对象编程的一些思想,为了解释这个问题,我们先看以下一个关于函数的例子。在python里,所有的东西都是一个对象。 函数也不例外,而且函数对象也可以被用来赋值给变量,然后通过变量也能调用这个函数,比如下面的这个例子:

# 以下代码均在命令行模式下运行
>>>def test():
...       print("this is a test")
...
>>>f = test
>>>f()
this is a test

在上面代码中,我们定义了一个函数test(),然后我们将函数名赋值给了f这个变量,然后我们运行f(),发现他起到的功能跟test()是一样的。这就说明,函数对象通过赋值给了变量,通过变量也能够对函数进行调用。
假如说,现在有了一个函数test(),我们想要增强这个函数的功能,比如,在运行这个函数之前,每次都给出一条运行提示“Running…”,但是我们又不希望改动test()这个函数原本的定义。也就是说,我们想在test()这个函数已经写好的基础上,在代码运行的过程中,动态地对它的功能进行增加。实现这样的功能的方式叫做“装饰器”(Decorator),也就是我们在前面那个例子中看到的@log了。本质上,修饰器就是一个返回函数的高阶函数。观察这个log函数的定义,他作为一个装饰器,接收的参数是一个函数,然后返回的参数也是一个函数。起到的作用就是对一个已有的函数进行修饰,比如加入一些新增的或者改进的功能。在使用的时候,需要借助python的语法@将装饰器放在要修饰的函数的定义前面。
关于装饰器更多的说明可以参考廖雪峰的官方网站

3、奇怪的->

这个符号就更奇怪了,熟悉C和C++的同学知道,在C和C++里面,这个就是对指针的操作,与链表有关。但是python中是没有指针的,所以肯定不是指针的指向问题。那么这个符号经常出现在什么地方呢?其实主要出现在函数定义的后面,例如这个例子:

def add(x, y) -> int:
	return x+y

->常常出现在python函数定义的函数名后面,为函数添加元数据,描述函数的返回类型,从而方便开发人员使用。所以大多数时候这个东西的存在其实是不影响你看代码的,只是看代码的话,可以忽略。如果想了解更多增加元数据的信息,可以参考这里


版权声明:本文为NeoScofield原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。