pd.concat
?levels
对的说法?keys
对的说法?pandas的concat
职能是合并后的公用事业公司的瑞士军刀。有用的情况多种多样。现有文档在一些可选参数上省略了一些细节。其中有levels
和keys
参数。我着手弄清楚这些论点的作用。
我将提出一个问题,将其作为的许多方面的门户pd.concat
。
考虑数据帧d1
,d2
以及d3
:
import pandas as pd
d1 = pd.DataFrame(dict(A=.1, B=.2, C=.3), [2, 3])
d2 = pd.DataFrame(dict(B=.4, C=.5, D=.6), [1, 2])
d3 = pd.DataFrame(dict(A=.7, B=.8, D=.9), [1, 3])
如果我将这些与
pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'])
pandas.MultiIndex
对于我的columns
对象,我得到了预期的结果:
A B C D
d1 2 0.1 0.2 0.3 NaN
3 0.1 0.2 0.3 NaN
d2 1 NaN 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6
d3 1 0.7 0.8 NaN 0.9
3 0.7 0.8 NaN 0.9
但是,我想使用levels
参数文档:
级别 :序列列表,默认为无。用于构造MultiIndex的特定级别(唯一值)。否则,将从按键中推断出它们。
所以我通过了
pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2']])
并得到一个 KeyError
ValueError: Key d3 not in level Index(['d1', 'd2'], dtype='object')
这很有道理。我通过的级别不足以描述按键指示的必要级别。如果没有像上面那样通过任何操作,则可以推断出这些级别(如文档中所述)。但是,我还能如何使用该参数来获得更好的效果呢?
如果我尝试这样做:
pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2', 'd3']])
我并获得了与上述相同的结果。但是当我在水平上再增加一个值时,
df = pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2', 'd3', 'd4']])
我最终得到相同外观的数据帧,但是结果MultiIndex
具有未使用的级别。
df.index.levels[0]
Index(['d1', 'd2', 'd3', 'd4'], dtype='object')
那么level
争论的重点是什么,我应该以keys
不同的方式使用吗?
我正在使用Python 3.6和Pandas 0.22。
在为我自己回答这个问题的过程中,我学到了很多东西,并且我希望将示例和一些解释汇总到一起。
关于levels
论点的具体答案即将结束。
链接到当前文档
import pandas as pd
d1 = pd.DataFrame(dict(A=.1, B=.2, C=.3), index=[2, 3])
d2 = pd.DataFrame(dict(B=.4, C=.5, D=.6), index=[1, 2])
d3 = pd.DataFrame(dict(A=.7, B=.8, D=.9), index=[1, 3])
s1 = pd.Series([1, 2], index=[2, 3])
s2 = pd.Series([3, 4], index=[1, 2])
s3 = pd.Series([5, 6], index=[1, 3])
objs
我们遇到的第一个参数是 objs
:
objs
:Series,DataFrame或Panel对象的序列或映射。如果传递了dict,则除非传递了排序的键,否则将将其用作keys参数,在这种情况下,将选择值(请参见下文)。除非它们全部为None,否则所有None对象都将被静默删除,在这种情况下,将引发ValueError
Series
或DataFrame
对象列表一起使用。dict
也非常有用。map
在map(f, list_of_df)
现在,我们将坚持上面定义的DataFrame
和Series
对象的列表。稍后我将展示如何利用字典来给出非常有用的MultiIndex
结果。
pd.concat([d1, d2])
A B C D
2 0.1 0.2 0.3 NaN
3 0.1 0.2 0.3 NaN
1 NaN 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6
axis
我们遇到的第二个参数 axis
的默认值为0
:
axis :{0 /’index’,1 /’columns’},默认值为0。
DataFrame
s与axis=0
(堆叠)对于0
或的值,index
我们要说:“沿列对齐并添加到索引”。
如上所示axis=0
,因为0
是默认值,所以使用了,因为它的索引d2
扩展了的索引,d1
尽管该值存在重叠2
:
pd.concat([d1, d2], axis=0)
A B C D
2 0.1 0.2 0.3 NaN
3 0.1 0.2 0.3 NaN
1 NaN 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6
DataFrame
s的axis=1
(并排)对于值,1
或者columns
我们要说:“沿索引对齐并添加到列中”,
pd.concat([d1, d2], axis=1)
A B C B C D
1 NaN NaN NaN 0.4 0.5 0.6
2 0.1 0.2 0.3 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN NaN NaN
我们可以看到,最终得到的指数是指数的工会所得列列从延伸d1
通过的列d2
。
Series
与axis=0
(堆叠)当合并pandas.Series
时axis=0
,我们得到一个pandas.Series
。除非所有合并的结果具有相同的名称,否则结果的名称Series
将为。当我们打印出结果时要注意。如果不存在,我们可以假设名称为。None``Series``'Name: A'``Series``Series``None
| | | pd.concat(
| pd.concat( | pd.concat( | [s1.rename('A'),
pd.concat( | [s1.rename('A'), | [s1.rename('A'), | s2.rename('B'),
[s1, s2]) | s2]) | s2.rename('A')]) | s3.rename('A')])
-------------- | --------------------- | ---------------------- | ----------------------
2 1 | 2 1 | 2 1 | 2 1
3 2 | 3 2 | 3 2 | 3 2
1 3 | 1 3 | 1 3 | 1 3
2 4 | 2 4 | 2 4 | 2 4
dtype: int64 | dtype: int64 | Name: A, dtype: int64 | 1 5
| | | 3 6
| | | dtype: int64
Series
与axis=1
(并排)当组合在一起pandas.Series
时axis=1
,它是name
我们引用的属性,以推断结果中的列名称pandas.DataFrame
。
| | pd.concat(
| pd.concat( | [s1.rename('X'),
pd.concat( | [s1.rename('X'), | s2.rename('Y'),
[s1, s2], axis=1) | s2], axis=1) | s3.rename('Z')], axis=1)
---------------------- | --------------------- | ------------------------------
0 1 | X 0 | X Y Z
1 NaN 3.0 | 1 NaN 3.0 | 1 NaN 3.0 5.0
2 1.0 4.0 | 2 1.0 4.0 | 2 1.0 4.0 NaN
3 2.0 NaN | 3 2.0 NaN | 3 2.0 NaN 6.0
Series
并DataFrame
与axis=0
(堆叠)当执行的串联Series
和DataFrame
一起axis=0
,我们把所有的Series
单柱DataFrame
秒。
特别要注意,这是一个串联axis=0
。这意味着在对齐列时扩展索引(行)。在下面的示例中,我们看到索引变成[2, 3, 2, 3]
了一个随意添加的索引。除非我强制Series
使用以下参数来命名列,否则列不会重叠to_frame
:
pd.concat( |
[s1.to_frame(), d1]) | pd.concat([s1, d1])
------------------------- | ---------------------
0 A B C | 0 A B C
2 1.0 NaN NaN NaN | 2 1.0 NaN NaN NaN
3 2.0 NaN NaN NaN | 3 2.0 NaN NaN NaN
2 NaN 0.1 0.2 0.3 | 2 NaN 0.1 0.2 0.3
3 NaN 0.1 0.2 0.3 | 3 NaN 0.1 0.2 0.3
您可以看到的结果与pd.concat([s1, d1])
我对to_frame
自己的表现一样。
但是,我可以使用参数来控制结果列的名称to_frame
。Series
用rename
方法重命名 不会
控制结果中的列名称DataFrame
。
# Effectively renames | |
# `s1` but does not align | # Does not rename. So | # Renames to something
# with columns in `d1` | # Pandas defaults to `0` | # that does align with `d1`
pd.concat( | pd.concat( | pd.concat(
[s1.to_frame('X'), d1]) | [s1.rename('X'), d1]) | [s1.to_frame('B'), d1])
---------------------------- | -------------------------- | ----------------------------
A B C X | 0 A B C | A B C
2 NaN NaN NaN 1.0 | 2 1.0 NaN NaN NaN | 2 NaN 1.0 NaN
3 NaN NaN NaN 2.0 | 3 2.0 NaN NaN NaN | 3 NaN 2.0 NaN
2 0.1 0.2 0.3 NaN | 2 NaN 0.1 0.2 0.3 | 2 0.1 0.2 0.3
3 0.1 0.2 0.3 NaN | 3 NaN 0.1 0.2 0.3 | 3 0.1 0.2 0.3
Series
并DataFrame
用axis=1
(并排)这是相当直观的。当属性不可用时,Series
列名称默认为此类Series
对象的枚举name
。
| pd.concat(
pd.concat( | [s1.rename('X'),
[s1, d1], | s2, s3, d1],
axis=1) | axis=1)
------------------- | -------------------------------
0 A B C | X 0 1 A B C
2 1 0.1 0.2 0.3 | 1 NaN 3.0 5.0 NaN NaN NaN
3 2 0.1 0.2 0.3 | 2 1.0 4.0 NaN 0.1 0.2 0.3
| 3 2.0 NaN 6.0 0.1 0.2 0.3
join
第三个参数 join
描述生成的合并应该是外部合并(默认)还是内部合并。
join :{‘inner’,’outer’},默认为’outer’
如何处理其他轴上的索引。
事实证明,没有left
或right
选项pd.concat
可以处理多个合并的对象。
对于d1
和d2
,选项如下:
outer
pd.concat([d1, d2], axis=1, join='outer')
A B C B C D
1 NaN NaN NaN 0.4 0.5 0.6
2 0.1 0.2 0.3 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN NaN NaN
inner
pd.concat([d1, d2], axis=1, join='inner')
A B C B C D
2 0.1 0.2 0.3 0.4 0.5 0.6
join_axes
第四个论点是允许我们进行left
合并以及更多工作的事物。
join_axes :索引对象的列表
用于其他n-1轴而不是执行内部/外部设置逻辑的特定索引。
pd.concat([d1, d2, d3], axis=1, join_axes=[d1.index])
A B C B C D A B D
2 0.1 0.2 0.3 0.4 0.5 0.6 NaN NaN NaN
3 0.1 0.2 0.3 NaN NaN NaN 0.7 0.8 0.9
pd.concat([d1, d2, d3], axis=1, join_axes=[d3.index])
A B C B C D A B D
1 NaN NaN NaN 0.4 0.5 0.6 0.7 0.8 0.9
3 0.1 0.2 0.3 NaN NaN NaN 0.7 0.8 0.9
ignore_index
ignore_index :布尔值,默认为False
如果为True,则不要沿串联轴使用索引值。结果轴将标记为0,…,n-1。如果要在串联轴没有有意义的索引信息的对象上串联,这将很有用。请注意,联接中仍会考虑其他轴上的索引值。
就像当我堆叠d1
在顶部时d2
,如果我不在乎索引值,则可以重置它们或忽略它们。
| pd.concat( | pd.concat(
| [d1, d2], | [d1, d2]
pd.concat([d1, d2]) | ignore_index=True) | ).reset_index(drop=True)
--------------------- | ----------------------- | -------------------------
A B C D | A B C D | A B C D
2 0.1 0.2 0.3 NaN | 0 0.1 0.2 0.3 NaN | 0 0.1 0.2 0.3 NaN
3 0.1 0.2 0.3 NaN | 1 0.1 0.2 0.3 NaN | 1 0.1 0.2 0.3 NaN
1 NaN 0.4 0.5 0.6 | 2 NaN 0.4 0.5 0.6 | 2 NaN 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6 | 3 NaN 0.4 0.5 0.6 | 3 NaN 0.4 0.5 0.6
当使用时axis=1
:
| pd.concat(
| [d1, d2], axis=1,
pd.concat([d1, d2], axis=1) | ignore_index=True)
------------------------------- | -------------------------------
A B C B C D | 0 1 2 3 4 5
1 NaN NaN NaN 0.4 0.5 0.6 | 1 NaN NaN NaN 0.4 0.5 0.6
2 0.1 0.2 0.3 0.4 0.5 0.6 | 2 0.1 0.2 0.3 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN NaN NaN | 3 0.1 0.2 0.3 NaN NaN NaN
keys
我们可以传递标量值或元组的列表,以便将元组或标量值分配给相应的MultiIndex。传递的列表的长度必须与要串联的项目数相同。
keys :序列,默认值None
如果通过多个级别,则应包含元组。使用传递的键作为最外层来构造层次结构索引
axis=0
当Series
沿着axis=0
(并扩展索引)串联对象时。
这些键成为MultiIndex
index属性中对象的新初始级别。
# length 3 length 3 # length 2 length 2
# /--------\ /-----------\ # /----\ /------\
pd.concat([s1, s2, s3], keys=['A', 'B', 'C']) pd.concat([s1, s2], keys=['A', 'B'])
---------------------------------------------- -------------------------------------
A 2 1 A 2 1
3 2 3 2
B 1 3 B 1 3
2 4 2 4
C 1 5 dtype: int64
3 6
dtype: int64
但是,我们可以在keys
参数中使用多个标量值来创建更深的MultiIndex
。在这里,我们传递tuples
长度为2的a的两个新级别MultiIndex
:
pd.concat(
[s1, s2, s3],
keys=[('A', 'X'), ('A', 'Y'), ('B', 'X')])
-----------------------------------------------
A X 2 1
3 2
Y 1 3
2 4
B X 1 5
3 6
dtype: int64
axis=1
沿列延伸时有点不同。当我们使用axis=0
(见上文)时,除现有索引外,我们keys
还充当MultiIndex
级别。对于axis=1
,我们指的是Series
对象没有的轴,即columns
属性。
两个Series
重量的变化axis=1
请注意,只要没有通过,就命名s1
and和s2
事项keys
,但如果通过,它将被覆盖keys
。
| | | pd.concat(
| pd.concat( | pd.concat( | [s1.rename('U'),
pd.concat( | [s1, s2], | [s1.rename('U'), | s2.rename('V')],
[s1, s2], | axis=1, | s2.rename('V')], | axis=1,
axis=1) | keys=['X', 'Y']) | axis=1) | keys=['X', 'Y'])
-------------- | --------------------- | ---------------------- | ----------------------
0 1 | X Y | U V | X Y
1 NaN 3.0 | 1 NaN 3.0 | 1 NaN 3.0 | 1 NaN 3.0
2 1.0 4.0 | 2 1.0 4.0 | 2 1.0 4.0 | 2 1.0 4.0
3 2.0 NaN | 3 2.0 NaN | 3 2.0 NaN | 3 2.0 NaN
MultiIndex
与Series
和axis=1
pd.concat(
[s1, s2],
axis=1,
keys=[('W', 'X'), ('W', 'Y')])
-----------------------------------
W
X Y
1 NaN 3.0
2 1.0 4.0
3 2.0 NaN
两个DataFrame
一起axis=1
与axis=0
示例一样,keys
将级别添加到中MultiIndex
,但这一次添加到columns
属性中存储的对象中。
pd.concat( | pd.concat(
[d1, d2], | [d1, d2],
axis=1, | axis=1,
keys=['X', 'Y']) | keys=[('First', 'X'), ('Second', 'X')])
------------------------------- | --------------------------------------------
X Y | First Second
A B C B C D | X X
1 NaN NaN NaN 0.4 0.5 0.6 | A B C B C D
2 0.1 0.2 0.3 0.4 0.5 0.6 | 1 NaN NaN NaN 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN NaN NaN | 2 0.1 0.2 0.3 0.4 0.5 0.6
| 3 0.1 0.2 0.3 NaN NaN NaN
Series
并DataFrame
用axis=1
这很棘手。在这种情况下,标量密钥值不能充当索引为唯一的水平Series
时,它成为一列,同时还充当的第一级对象MultiIndex
的DataFrame
。因此,Pandas将再次使用对象的name
属性Series
作为列名称的来源。
pd.concat( | pd.concat(
[s1, d1], | [s1.rename('Z'), d1],
axis=1, | axis=1,
keys=['X', 'Y']) | keys=['X', 'Y'])
--------------------- | --------------------------
X Y | X Y
0 A B C | Z A B C
2 1 0.1 0.2 0.3 | 2 1 0.1 0.2 0.3
3 2 0.1 0.2 0.3 | 3 2 0.1 0.2 0.3
限制keys
与MultiIndex
自卑。
熊猫似乎只是从Series
名称推断出列名,但是当在具有不同列级别数的数据帧之间进行类似的串联时,Pandas不会填空。
d1_ = pd.concat(
[d1], axis=1,
keys=['One'])
d1_
One
A B C
2 0.1 0.2 0.3
3 0.1 0.2 0.3
然后将其与只有一个级别的列对象中的另一个数据帧连接起来,Pandas将拒绝尝试创建该MultiIndex
对象的元组,并组合所有数据帧,就好像对象,标量和元组的单个级别一样。
pd.concat([d1_, d2], axis=1)
(One, A) (One, B) (One, C) B C D
1 NaN NaN NaN 0.4 0.5 0.6
2 0.1 0.2 0.3 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN NaN NaN
dict
而不是list
传递字典时,pandas.concat
将使用字典中的键作为keys
参数。
# axis=0 | # axis=1
pd.concat( | pd.concat(
{0: d1, 1: d2}) | {0: d1, 1: d2}, axis=1)
----------------------- | -------------------------------
A B C D | 0 1
0 2 0.1 0.2 0.3 NaN | A B C B C D
3 0.1 0.2 0.3 NaN | 1 NaN NaN NaN 0.4 0.5 0.6
1 1 NaN 0.4 0.5 0.6 | 2 0.1 0.2 0.3 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6 | 3 0.1 0.2 0.3 NaN NaN NaN
levels
它与keys
参数一起使用。当levels
保留默认值时None
,Pandas将获取结果每个级别的唯一值MultiIndex
,并将其用作结果index.levels
属性中的对象。
level :序列列表,默认
值为None用于构造MultiIndex的特定级别(唯一值)。否则,将从按键推断出它们。
如果熊猫已经推断出这些水平应该是什么,那么自己指定它有什么优势?我将举一个例子,让您自己思考可能有用的其他原因。
根据文档,levels
参数是序列的列表。这意味着我们可以将另一个pandas.Index
用作这些序列之一。
考虑该数据帧df
是的级联d1
,d2
并且d3
:
df = pd.concat(
[d1, d2, d3], axis=1,
keys=['First', 'Second', 'Fourth'])
df
First Second Fourth
A B C B C D A B D
1 NaN NaN NaN 0.4 0.5 0.6 0.7 0.8 0.9
2 0.1 0.2 0.3 0.4 0.5 0.6 NaN NaN NaN
3 0.1 0.2 0.3 NaN NaN NaN 0.7 0.8 0.9
列对象的级别为:
print(df, *df.columns.levels, sep='\n')
Index(['First', 'Second', 'Fourth'], dtype='object')
Index(['A', 'B', 'C', 'D'], dtype='object')
如果sum
在a内使用,groupby
则会得到:
df.groupby(axis=1, level=0).sum()
First Fourth Second
1 0.0 2.4 1.5
2 0.6 0.0 1.5
3 0.6 2.4 0.0
但是,如果不是['First', 'Second', 'Fourth']
缺少另一个名为Third
和的类别,该Fifth
怎么办?我想将它们包括在groupby
汇总结果中吗?如果我们有一个,我们可以做到这一点pandas.CategoricalIndex
。我们可以提前使用levels
参数指定该值。
因此,让我们定义df
为:
cats = ['First', 'Second', 'Third', 'Fourth', 'Fifth']
lvl = pd.CategoricalIndex(cats, categories=cats, ordered=True)
df = pd.concat(
[d1, d2, d3], axis=1,
keys=['First', 'Second', 'Fourth'],
levels=[lvl]
)
df
First Fourth Second
1 0.0 2.4 1.5
2 0.6 0.0 1.5
3 0.6 2.4 0.0
但是column对象的第一级是:
df.columns.levels[0]
CategoricalIndex(
['First', 'Second', 'Third', 'Fourth', 'Fifth'],
categories=['First', 'Second', 'Third', 'Fourth', 'Fifth'],
ordered=True, dtype='category')
我们的groupby
总和如下所示:
df.groupby(axis=1, level=0).sum()
First Second Third Fourth Fifth
1 0.0 1.5 0.0 2.4 0.0
2 0.6 1.5 0.0 0.0 0.0
3 0.6 0.0 0.0 2.4 0.0
names
这用于命名结果的级别MultiIndex
。names
列表的长度应与结果中的级别数匹配MultiIndex
。
names :列表,默认值无
结果级索引中的级别名称
# axis=0 | # axis=1
pd.concat( | pd.concat(
[d1, d2], | [d1, d2],
keys=[0, 1], | axis=1, keys=[0, 1],
names=['lvl0', 'lvl1']) | names=['lvl0', 'lvl1'])
----------------------------- | ----------------------------------
A B C D | lvl0 0 1
lvl0 lvl1 | lvl1 A B C B C D
0 2 0.1 0.2 0.3 NaN | 1 NaN NaN NaN 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN | 2 0.1 0.2 0.3 0.4 0.5 0.6
1 1 NaN 0.4 0.5 0.6 | 3 0.1 0.2 0.3 NaN NaN NaN
2 NaN 0.4 0.5 0.6 |
verify_integrity
自我说明文件
verify_integrity : boolean, default False
Check whether the new concatenated axis contains duplicates. This can be
very expensive relative to the actual data concatenation.
Because the resulting index from concatenating d1
and d2
is not unique, it
would fail the integrity check.
pd.concat([d1, d2])
A B C D
2 0.1 0.2 0.3 NaN
3 0.1 0.2 0.3 NaN
1 NaN 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6
And
pd.concat([d1, d2], verify_integrity=True)
ValueError: Indexes have overlapping values: [2]
如何使用 Pandas的concat功能是合并实用程序的瑞士军刀。在各种各样的情况下它是有用的。现有文档遗漏了一些可选参数的细节。其中包括和参数。我开始弄清楚这些论点的作用。 我将提出一个问题,它将作为进入。 考虑数据帧<代码> d1 ,<代码> D2< /代码>,和<代码> D3< /代码>: 如果我把它们连在一起 我通过用于我的对象: 但是,我想使用参数留档: 级别:序列列表,默认为无。用于构
我不太清楚kotlin是如何管理属性名和主构造函数参数名的。如果我写了相同的属性名和参数名,那么kotlin编译器会给出一个错误。 它给出了这个错误。 但是,当我更改属性的名称或更改主构造函数的参数名称时,代码将工作并编译。 这将工作或编译罚款。 这背后的原因是什么?为什么主构造函数的参数名和属性名不能相同?
这个关键参数是什么?为什么要传递类别小部件类的父类(我想是StatelessWidget)? 我看过重点班,但我什么都不懂。这一页没有上下文,也没有我可以使用的例子。
问题内容: 在以下Express函数中: 什么是和?它们代表什么,它们是什么意思,它们是做什么的? 谢谢! 问题答案: 是一个对象,其中包含有关引发事件的HTTP请求的信息。作为对的响应,您可以用于发送回所需的HTTP响应。 这些参数可以命名为任何东西。您可以将代码更改为以下内容: 编辑: 说您有这种方法: 该请求将是一个具有以下属性的对象(仅举几例): ,这将是触发此特定操作的时间 ,在这种情况
本文向大家介绍JavaScript中的匿名函数和内联函数有什么区别?,包括了JavaScript中的匿名函数和内联函数有什么区别?的使用技巧和注意事项,需要的朋友参考一下 匿名函数 顾名思义,匿名允许创建没有任何名称标识符的函数。它可以用作其他函数的参数。这就是可以使用JavaScript匿名函数的方式- 另一个示例可以如下- 内联函数 一个内联 函数是一个javascript函数,其被分配给在运
问题内容: 在Swift中,调用第一个参数时会使用参数名称。为什么不使用名字? 使用Swift手册的变体; 这会起作用; 但这给了我“调用中的外部参数标签’amount’” 是否有这个原因,或者这是“按其原样”的事物之一? 问题答案: 这是遵循Objective-C习惯的惯例,第一个参数的名称与方法名称结合在一起。这是一个例子: 您可以像这样调用方法: 通过将参数的名称合并到方法的名称中,可以使阅