对于许多有志于成为数据科学家的开发者来说,深入理解编程语言的中级概念是至关重要的。这不仅仅是为了掌握高级的数据科学和人工智能库,更是为了在任何专业化领域之前,巩固对编程语言基础的理解。因此,本系列文章“Python:2分钟理解”,旨在为那些已经掌握了Python基础并希望进一步深入学习的有志之士提供帮助。将涵盖包括位置参数、关键字参数(*args和**kwargs)在内的中级话题。
在函数定义中使用*args语法,可以传递一个变量数组作为参数。程序可以将无关键字或可变长度的参数传递给另一个函数。例如,以下两个Python程序展示了args在参数长度中的应用。
def print_numbers(*args):
for number in args:
print(number)
print_numbers(1, 2, 3, 4)
当在函数定义中看到*args时,这意味着可以在调用该函数时传递任意数量的值。在函数内部,args就像一个盒子,包含了传递的所有值,可以使用它来处理这些值。
这种特殊的**kwargs语法是由Python定义的,用于处理关键字化的可变长度参数列表。Kwargs之所以被称为两个星号,是因为双星号使得传递关键字参数成为可能。例如,以下Python程序展示了Kwargs在关键字参数中的应用。
def greet(**kwargs):
if 'name' in kwargs:
print(f"Hello, {kwargs['name']}!")
else:
print("Hello, there!")
greet(name="Alice")
greet()
当在函数定义中看到**kwargs时,这意味着可以在调用函数时使用名称传递值。在函数内部,kwargs就像一个字典,包含了传递的所有命名值,可以使用它来访问这些值。
让开始理解*args和**kwargs在Python中的含义。可能经常在Python中看到这些东西。首先,让开始理解,除非有星号(*)标志,否则不一定要写args和kwargs这些词。星号标志基本上接收可变数量的命令行参数。
根据Python文档,**(双星号/星号)和*(星号/星号)对于参数的作用是什么?在Python函数中,如果有比形式参数插槽更多的位置参数,除非存在使用“*标识符”语法的形式参数,否则会引发TypeError异常。在这种情况下,该形式参数会接收一个包含多余位置参数的元组(如果没有多余的位置参数,则为空元组)。这种机制特别适用于在Python函数中高效处理多个参数。
如果任何关键字参数不对应形式参数名称,除非存在使用“**标识符”语法的形式参数,否则会引发TypeError异常;在这种情况下,该形式参数会接收一个包含多余关键字参数的字典(使用关键字作为键,参数值作为相应的值),或者如果没有多余的分配给这些关键字参数,则为一个新的空字典。
*args允许向函数传递任意数量的参数。在这种情况下,args通常意味着参数。让看一个例子。
def demo(*args):
print(args)
Call the function
demo("Humpty", "Dumpty") # call with two arguments
Output:
('Humpty', 'Dumpty')
因此,不管传递了多少参数,*args都会显示结果。不管传递的是(“Humpty”,“Dumpty”)还是(“Humpty”,“Dumpty”,“Sat”,“On”,“A”,“Wall”),*args都会为处理。注意:正如提到的,可以写任何东西,不仅仅是args。让试试*whatever。
def demo(*whatever):
print(whatever)
Call the function
demo("Humpty", "Dumpty", "Sat", "On", "The", "Wall")
Output:
('Humpty', 'Dumpty', 'Sat', 'On', 'The', 'Wall')
这完全没问题!让写一个函数,它可以求和任意数量的输入。
def sum(*args):
c = 0
for arg in args:
c += arg
return c
print(sum(1,2,3,4,5))
现在,不管是求1到5的和还是1到10的和,Python都会为计算结果,不管参数的数量如何。这就是*args的美妙之处。
那么,**kwargs呢?嗯,它们并没有太大的不同。Kwargs这个术语通常代表关键字参数,这表明这种格式使用基于关键字的Python字典。让尝试一个例子。
def demo(**kwargs):
print(kwargs)
Call the function
demo(name="Humpty", location="Wall")
Output:
{'name': 'Humpty', 'location': 'Wall'}
**kwargs代表函数的关键字参数。与args的唯一区别是它使用关键字,并以字典的形式返回值。现在,让写一个普通函数,并通过args和kwargs传递参数,并使用以下代码。
def list_numbers(first, second, third):
print("First number", first)
print("Second number", second)
print("Third number", third)
Call the function
args = ("One","Two","Three")
list_numbers(*args)
Output:
First number One
Second number Two
Third number Three
再次尝试!
kwargs = {"third": "Three", "second": "Two", "first": "One"}
list_numbers(**kwargs)
Output:
First number One
Second number Two
Third number Three
Python的关键字参数提供了灵活性,允许通过名称而不是位置来指定参数。这增强了代码的可读性,并使函数能够接受各种配置,而不需要严格遵守参数顺序。例如,一个函数greet(name, message="Hello")可以被调用为greet("Alice")或greet(message="Hi", name="Bob")。此外,关键字参数简化了处理具有多个参数的函数,通过明确说明每个参数的目的。这种清晰度在calculate_total_price(price, tax_rate=0.2, discount=0)中得到了体现,其中值被明确分配给参数。本质上,Python的关键字参数赋予开发者编写更具表现力、可维护性和适应性代码的能力,有效地分离参数,并轻松容纳额外的参数。
命令行参数,包括单个参数和所有参数,是在通过命令行或终端执行程序时提供给程序的参数。它们在不改变程序源代码的情况下修改程序的行为。在程序内部访问参数,可以解析参数,包括Python中的kwargs,以确定动作或参数。选项或标志(例如,-h或–help)指定模式或设置,而值代表要处理的数据。例如,运行一个Python程序my_program.py –verbose input.txt output.txt设置详细模式并指定输入和输出文件。命令行参数对于配置程序行为、传递输入数据和控制执行流程至关重要。程序应该优雅地处理不正确的参数,提供有用的错误消息或使用说明。
知道为什么在函数中使用args吗?它有助于处理可变数量的参数。现在,让谈谈*kwargs,这是另一种在函数中处理参数的方式。它与args类似,但不接收位置参数。相反,它接受关键字参数。例如,如果有一个名为concatenate()的函数,可以使用kwargs遍历Python中的一个字典并将它的值连接在一起。记住要使用()。以下是如何使用*kwargs重写一个早期的例子:只是请记住,在本例中,字典中的对象是在字典中常见的典型对象。
因此,结束了本系列“Python:2分钟理解”的第一篇教程。这个想法是走过Python的中级和高级概念,以便成为一个高效的Python开发者,然后成为一个高效的数据科学家。确实,Python的学习曲线很容易,Python的语法特性相对简单且易于理解。但是,许多初学者在学会基础知识后会想“接下来是什么”。因此,在本系列中,涵盖了Python的这些中级方面。主题包括Args和Kwargs、生成器、Map、Reduce、Filter、集合、装饰器、线程、__slot__、集合、枚举、对象检查、推导、异常、OOP(面向对象Python)等。将在即将发布的文章中逐一涵盖这些中级部分。
可以在其他项目上找到:
在LinkedIn上联系:
电子邮件: |