Introducing the special usage of asterisk variables in Python

巴扎黑
Release: 2017-08-21 14:51:29
Original
1517 people have browsed it

In addition to being used for multiplication numerical operations and exponentiation operations, asterisks in Python also have a special usage of "adding a single asterisk or two asterisks before a variable" to achieve the incoming of multiple parameters or the splitting of variables. Solution, this article will introduce the usage of "asterisk parameter" in detail.

1. What is an asterisk variable?

Initially, the asterisk variable is used to pass parameters of functions. In the following example, a single asterisk represents that this position receives any number of For non-keyword parameters, convert them into tuples at the *b position of the function, and the double asterisk means that this position receives any number of keyword parameters, and convert them into a dictionary at the **b position:

#!/usr/bin/env python
#coding=utf-8
#--------
def one(a,*b):
  """a是一个普通传入参数,*b是一个非关键字星号参数"""
  print(b)
one(1,2,3,4,5,6)
#--------
def two(a=1,**b):
  """a是一个普通关键字参数,**b是一个关键字双星号参数"""
  print(b)
two(a=1,b=2,c=3,d=4,e=5,f=6)
Copy after login

#Program output

(2, 3, 4, 5, 6)
{'b': 2, 'c': 3, 'e': 5, 'f': 6, 'd': 4}
Copy after login

#As you can see from the output, in the first function, any number of parameters without keywords can be passed in at the *b position, and *b will convert these incoming parameters. into a tuple, the following call

one(1,2,3,4,5,6)

#After passing in one(a,*b), it is equivalent to

one(1,(2,3,4,5,6))

#In the second function, the position of **b can receive any number of keyword parameters, as follows Call

two(a=1,b=2,c=3,d=4,e=5,f=6)

#After passing in one(a,*b) , equivalent to

two(a=1,{'b': 2, 'c': 3, 'e': 5, 'f': 6, 'd': 4})

After understanding the basic usage of single asterisk and double asterisk, let’s take a look at their extended usage.

2. Examples of single asterisk variables

Single asterisk variables can not only be used in parameter transfer of functions. In fact, using a single asterisk prefix for an ordinary variable can make this variable Split into single elements, please see the following example:

#!/usr/bin/env python
#coding=utf-8
#--------
def one(*x):
  """输出传入的第一个参数"""
  print(x[0])
#--------
lst=["a","b","c","d"]
stri="www.pythontab.com"
one(stri,lst)
one(*lst)
one(*stri)
Copy after login

#Program output

www.pythontab.com
a
w
Copy after login

#The first call of one(stri,lst) is equivalent to one(*x) after substitution With

one((["a","b","c","d"],"www.pythontab.com"))

#The second call to one( *lst), after substituting one(*x), it is equivalent to

one(("a","b","c","d"))

#the third time Calling one(*stri) and substituting one(*x) is equivalent to

one(("w","w","w",".","q","i", "n","g","s","w","o","r","d",".","c","o","m"))

#If you use a single asterisk in front of a variable, it is actually a disassembly operation of the variable. The individual elements in the variable are disassembled and then passed into the one() function in turn. After passing in the one() function, The one() function will save these incoming single elements as a tuple, which is why we print(x[0]) can extract the first element

In order to verify this, we modify Take a look at the one() function, as follows:

#!/usr/bin/env python
#coding=utf-8
#--------
def one(*x):
  """一个错误的实例,尝试修改传入的第一个参数值,引发异常"""
  print(x[0])
  x[0]="pythontab"
lst=["a","b","c","d"]
one(*lst)
Copy after login

#We know that the list can be changed, we split the list and pass it into the one() function, and try to change the value of the first element inside the function. The result The "TypeError" exception is triggered. You can try it yourself. The reason for this result has been explained above. No matter what the original type of the incoming parameters is, one(*x) receives these incoming parameters at the position of *x. Afterwards, it will be saved as a "tuple", and the tuple cannot be changed

Let's look at a few examples:

#!/usr/bin/env python
#coding=utf-8
#--------
def one(*x):
  """打印出传入参数"""
  for a in x:
    print(a)
lst=["abc",123,"www.pythontab.com"]
stri="abcd"
dect={1:"one",2:"two",3:"three"}
one(*lst)
one(*stri)
one(*dect)
Copy after login

#Program output

abc
123
www.pythontab.com
a
b
c
d
1
2
3
Copy after login

#Before Both calls are easy to understand. Finally, we passed in a dictionary element and found that only the key of the dictionary element was output and did not contain the value. In fact, a single asterisk cannot read the value in the dictionary. It will always only The keys in the dictionary will be read. If you want to read the values ​​in the dictionary, you need to use double asterisks

3. Double asterisk variable examples

At the end of section 2, we use A single asterisk splits a dictionary and passes it to the function, but only the keys of the dictionary can be obtained. The following demonstrates how to use double asterisks to obtain the values ​​of the dictionary:

#!/usr/bin/env python
#coding=utf-8
#--------
def one(**x):
  """将传入的关键字参数的值保存成元组输出"""
  print(x)
  b=()
  for a in x.keys():
    b+=(x[a],)
  print(b)
dect={"one":1,"two":2,"three":3}
one(**dect)
Copy after login

#Program output

{'three': 3, 'one': 1, 'two': 2}
(3, 1, 2)
Copy after login

# Using a double asterisk prefix on a dictionary is equivalent to splitting it into keyword parameters. **dect is equivalent to splitting the dictionary into the following form

one=1,two=2, three=3

# Passing the above keyword parameters into one(**x) is equivalent to (remember what was said earlier, the double asterisk saves all received keyword parameters into one Dictionary)

one({"one":1,"two":2,"three":3})

#Since it is a dictionary, all methods in the dictionary can Use, use a for loop to traverse the keys of this dictionary, then use a tuple to add the values ​​​​corresponding to these keys, and finally print out the tuple

Ps: Note that using this method to pass the dictionary into the function At this time, the naming of the dictionary keys must comply with the naming rules of python variables. It is not difficult to see from the above analysis that the double asterisk will first convert the dictionary into the form of keyword parameters, which is equivalent to using the keys in the dictionary as variable names. If the key does not comply with the variable naming rules, a "TypeError" exception will be thrown. You can try to reverse the keys and values ​​in the above dictionary and use numbers as keys to see what problems will occur.

When "non-keyword parameters (positional parameters)" and "keyword parameters" appear simultaneously in the receiving parameters of a function, you can use a single asterisk to separate the two parameters, for example:

#!/usr/bin/env python
#coding=utf-8
#--------
def mix(a,b,*,x,y):
  """位置参数与关键字参数混合"""
  return a,b,x,y
#星号前面的a和b是位置参数,星号后面的x和y是关键字参数,调用mix()函数并传入参数时,关键字参数一定要使用"变量名=值"的形式传入数据,如果同位置参数一样传入数据,就会引发一个TypeError异常
print(mix(1,2,x=3,y=4))
Copy after login

#Program output

(1, 2, 3, 4)
Copy after login

#在上面的mix函数中,如果位置参数与关键字参数之间已经存在了一个单星号位置参数,那么,这个参数后面的就都是关键字参数,也不需要再使用星号来分隔他们了,例如

#!/usr/bin/env python
#coding=utf-8
#--------
def mix(a,b,*c,x,y):
  """位置参数与关键字参数混合"""
  return a,b,c,x,y
#在*c的位置可以输入任意多个位置参数值
print(mix(1,2,3,4,5,x=6,y=7))
Copy after login

#程序输出

(1, 2, (3, 4, 5), 6, 7)
Copy after login

如果我们要在一个函数中包含多种参数的组合,必须遵守这样的顺序:位置参数(必选参数),默认参数,单星号参数或星号分隔符,关键字参数,双星号参数;

请看下面的实例:

#!/usr/bin/env python
#coding=utf-8
#--------
def mix(a,b=0,*c,x,**y):
  """位置参数与关键字参数混合"""
  return a,b,c,x,y
print(mix(1,2,3,4,5,x=6,y=7,z=8))
Copy after login

#程序输出

(1, 2, (3, 4, 5), 6, {'y': 7, 'z': 8})
Copy after login

The above is the detailed content of Introducing the special usage of asterisk variables in Python. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template