Python 变量教程之打包和解包参数

目录
  • 背景
  • Packing
  • 打包和拆包
  • 用于字典

前言:

我们使用两个运算符 *(用于元组)和 **(用于字典)。

背景

考虑这样一种情况,我们有一个接收四个参数的函数。我们想调用这个函数,我们有一个大小为 4 的列表,其中包含函数的所有参数。如果我们只是将一个列表传递给函数,则调用不起作用。

# 一个演示打包和解包需求的 Python 程序

# 一个接受 4 个参数并打印它们的示例函数。
def fun(a, b, c, d):
	print(a, b, c, d)

# 驱动程序代码
my_list = [1, 2, 3, 4]

# 这不起作用
fun(my_list)

输出 :

TypeError: fun() takes exactly 4 arguments (1 given)

包我们可以使用 ***** 来解包列表,以便它的所有元素都可以作为不同的参数传递。

# 一个带有 4 个参数并打印的示例函数,
def fun(a, b, c, d):
	print(a, b, c, d)

# 驱动程序代码
my_list = [1, 2, 3, 4]

# 将列表解压缩为四个参数
fun(*my_list)

输出 :

(1, 2, 3, 4)

我们需要记住,参数的数量必须与我们为参数解包的列表的长度相同。

# 当 len(args) != 函数所需的实际参数没有时出错

args = [0, 1, 4, 9]
def func(a, b, c):
	return a + b + c
# 使用解包参数调用函数
func(*args)

输出:

Traceback (most recent call last):
  File "/home/592a8d2a568a0c12061950aa99d6dec3.py", line 10, in <module>
    func(*args)
TypeError: func() takes 3 positional arguments but 4 were given

作为另一个示例,考虑需要单独的开始和停止参数的内置 range() 函数。如果它们不能单独使用,请使用 *-operator 编写函数调用以将参数从列表或元组中解包出来:

>>>
>>> range(3, 6) # 带有单独参数的正常调用
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args) # 使用从列表中解包的参数调用
[3, 4, 5]

Packing

当我们不知道需要将多少个参数传递给 python 函数时,我们可以使用 Packing 将所有参数打包到一个元组中。

# 演示打包使用的 Python 程序

# 此函数使用打包来汇总未知数量的参数
def mySum(*args):
	return sum(args)

# 驱动程序代码
print(mySum(1, 2, 3, 4, 5))
print(mySum(10, 20))

输出:

15 
30

上述函数 mySum() 执行“打包”以将此方法调用接收到的所有参数打包到一个变量中。一旦我们有了这个“打包”变量,我们就可以用它来做我们用普通元组做的事情。args[0] 和 args[1] 会分别给你第一个和第二个参数。由于我们的元组是不可变的,您可以将 args 元组转换为列表,以便您还可以修改、删除和重新排列 i 中的项目。

打包和拆包

下面是一个显示打包和拆包的示例。

# 一个 Python 程序,用于演示打包和解包。

# 一个示例 python 函数,它接受三个参数并打印它们
def fun1(a, b, c):
	print(a, b, c)

# 另一个示例函数。
# 这是包装的一个例子。 传递给 fun2 的所有参数都打包到元组 *args 中。
def fun2(*args):

	# 将 args 元组转换为列表,以便我们修改它
	args = list(args)

	# 修改参数
	args[0] = 'Haiyong'
	args[1] = 'awesome'

	# 拆包参数并调用 fun1()
	fun1(*args)

# 驱动程序代码
fun2('Hello', 'beautiful', 'world!')

输出:

(Haiyong, awesome, world!)

用于字典

# 演示使用 ** 解包字典项的示例程序
def fun(a, b, c):
	print(a, b, c)

# 解包字典的调用
d = {'a':2, 'b':4, 'c':10}
fun(**d)

输出:

2 4 10

这里 ** 解压了与它一起使用的字典,并将字典中的项目作为关键字参数传递给函数。所以写“fun(1, **d)”就相当于写“fun(1, b=4, c=10)”。

# 一个 Python 程序,用于演示使用 ** 打包字典项
def fun(**kwargs):

	# kwargs 是一个字典
	print(type(kwargs))

	# 打印字典项目
	for key in kwargs:
		print("%s = %s" % (key, kwargs[key]))

# 驱动程序代码
fun(name="geeks", ID="101", language="Python")

输出:

<class 'dict'>
name = geeks
ID = 101
language = Python

应用和要点 :

  • 在套接字编程中用于向服务器发送大量请求。
  • 在 Django 框架中用于将变量参数发送到视图函数。
  • 有些包装函数需要我们传入可变参数。
  • 参数的修改变得容易,但同时验证不正确,因此必须小心使用它们。

到此这篇关于Python 变量教程之打包和解包参数的文章就介绍到这了,更多相关Python 打包解包参数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python序列类型的打包和解包实例

    打包 如给出一系列由逗号分隔的表达式,他们将被视为一个单独元组,即使没有提供封闭的圆括号 如: numbers = 1, 2, 3, 4 使numbers被赋值元组(1, 2, 3, 4) return a, b 返回元组(a, b) 解包 Python可以自动解包一个序列,润许单个标识符的一系列元素赋值给序列中的各个元素,如: a, b, c, d = range(1,5) a = 1, b = 2, c = 3, d = 4 quotient, remainder = divmod(a, b

  • 关于Python形参打包与解包小技巧分享

    Python中的函数调用与c++不同的是将this指针直接作为self当作第一个形参进行处理,从而将静态函数与实例方法的调用形式统一了起来.在实际编程过程中,可以通过传递函数的地址.函数的形参的方式将所有函数(包括静态函数.类实例函数)的调用用统一的方式表达出来,方便统一接口和抽象. 待传递的2个函数如下: class Operation: @staticmethod def close_buy(): """ :return: """ print

  • python元组打包和解包过程详解

    1.在将多个以逗号分隔的值赋给一个变量时,多个值被打包成一个元组类型.当我们将一个元组赋给多个变量时,它将解包成多个值,然后分别将其赋给相应的变量. # 打包 a = 1, 10, 100 print(type(a), a) # <class 'tuple'> (1, 10, 100) # 解包 i, j, k = a print(i, j, k) # 1 10 100 2.解包时,如果解包出来的元素数目与变量数目不匹配,就会引发ValueError异常.错误信息为:too many valu

  • Python 变量教程之打包和解包参数

    目录 背景 解 Packing 打包和拆包 用于字典 前言: 我们使用两个运算符 *(用于元组)和 **(用于字典). 背景 考虑这样一种情况,我们有一个接收四个参数的函数.我们想调用这个函数,我们有一个大小为 4 的列表,其中包含函数的所有参数.如果我们只是将一个列表传递给函数,则调用不起作用. # 一个演示打包和解包需求的 Python 程序 # 一个接受 4 个参数并打印它们的示例函数. def fun(a, b, c, d): print(a, b, c, d) # 驱动程序代码 my_

  • Python中打包和解包(*和**)的使用详解

    目录 一.打包参数 二.解包参数 三.几点注意 *和**在函数的定义和调用阶段,有着不同的功能,并且,*和**不能离开函数使用! 一.打包参数 * 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量args >>> def f(*args): # * 在函数定义中使用 print(args) >>> f() () >>> f(1) (1,) >>> f(1, 2, 3, 4) (1, 2, 3, 4) 我们可

  • Python 变量教程字节对象与字符串

    目录 前言 编码 解码 前言 在 Python 2 中,str 和 bytes 都是相同的 typeByte 对象,而在 Python 3 中,Byte 对象在 Python 3 中定义为“字节序列”,类似于 Python 2 中的“ unicode ”对象.但是,字符串和字节对象. 其中一些如下所示:  字节对象是字节序列,而字符串是字符序列. 字节对象在内部是机器可读的形式,字符串只是人类可读的形式. 由于 Byte 对象是机器可读的,因此它们可以直接存储在磁盘上.然而,字符串需要编码才能存

  • Python变量教程之全局变量和局部变量

    目录 前言 全局变量 全局关键字 前言 全局变量是那些没有在任何函数内部定义并具有全局范围的变量,而局部变量是那些在函数内部定义的变量,其范围仅限于该函数.换句话说,我们可以说局部变量只能在初始化它的函数内部访问,而全局变量在整个程序和每个函数内部都可以访问.局部变量是那些在函数内部初始化并且仅属于该特定函数的变量.它不能在函数之外的任何地方访问.让我们看看如何创建一个局部变量. 示例: 创建局部变量 def f(): # local variable s = "I love python&qu

  • Python 变量教程私有变量详解

    目录 前言 重整及其工作原理 _单前导下划线 __双前导下划线 双前导和双尾下划线 前言 Python 中,不存在只能在对象内部访问的“私有”实例变量.然而,大多数 Python 代码和编码器都遵循一个约定,即以下划线为前缀的名称,例如 _geek应被视为 API 或任何 Python 代码的非公共部分,无论它是函数还是方法,或数据成员.在经历这个过程时,我们还将尝试理解各种形式的尾随下划线的概念,例如,for _ in range(10), init(self). 重整及其工作原理 在 Pyt

  • python socket网络编程之粘包问题详解

    一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用户态copy到内核态,这样的操作是耗资源和时间的,频繁的在内核态和用户态之前交换数据势必会导致发送效率降低, 因此socket 为提高传输效率,发送方往往要收集到足够多的数据后才发送一次数据给对方.若连续几次需要send的数据都很少,通常TCP socket 会根据优化算法把这些数据合成一个TCP段

  • Python 基础教程之包和类的用法

    Python 基础教程之包和类的用法 建立一个文件夹filePackage 在filePackage 文件夹内创建 __init__.py 有了 __init__.py ,filePackage才算是一个包,否则只是算一个普通文件夹. 在filePackage 文件夹内创建 file.py file.py 代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- from datetime import datetime class MyFile(

  • python教程对函数中的参数进行排序

    内建的 sorted() 函数可接受一个用来传递可调用对象( callable ) 的参数 key,而该可调用对象会返回待排序对象中的某些值,sorted则利用这些值来比较对象. 例如,如果应用中有一系列的 User 对象实例,而我们想通过 user_id 属性来对他们排序,则可以提供一个可调用对象将 User 实例作为输入然后返回 user_id. class User: def __init__(self, user_id): self.user_id = user_id def __rep

随机推荐