形参与实参介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
"""
@作者: egon老湿
@微信:18611453110
@专栏: https://zhuanlan.zhihu.com/c_1189883314197168128
"""


# 一 形参与实参介绍
# 形参:在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名
def func(x, y): # x=1,y=2
print(x, y)


# 实参:在调用函数阶段传入的值称之为实际参数,简称实参,相当于变量值
# func(1,2)

# 形参与实参的关系:
# 1、在调用阶段,实参(变量值)会绑定给形参(变量名)
# 2、这种绑定关系只能在函数体内使用
# 3、实参与形参的绑定关系在函数调用时生效,函数调用结束后解除绑定关系

# 实参是传入的值,但值可以是以下形式
# 形式一:
# func(1,2)

# 形式二:
# a=1
# b=2
# func(a,b)

# 形式三:
# func(int('1'),2)
# func(func1(1,2,),func2(2,3),333)


# 二 形参与实参的具体使用
# 2.1 位置参数:按照从左到右的顺序依次定义的参数称之为位置参数
# 位置形参:在函数定义阶段,按照从左到右的顺序直接定义的"变量名"
# 特点:必须被传值,多一个不行少一个也不行
# def func(x,y):
# print(x,y)
# func(1,2,3)
# func(1,)

# 位置实参:在函数调用阶段, 按照从左到有的顺序依次传入的值
# 特点:按照顺序与形参一一对应

# func(1,2)
# func(2,1)

# 2.2 关键字参数
# 关键字实参:在函数调用阶段,按照key=value的形式传入的值
# 特点:指名道姓给某个形参传值,可以完全不参照顺序
# def func(x,y):
# print(x,y)

# func(y=2,x=1)
# func(1,2)

# 混合使用,强调
# 1、位置实参必须放在关键字实参前
# func(1,y=2)
# func(y=2,1)

# 2、不能能为同一个形参重复传值
# func(1,y=2,x=3)
# func(1,2,x=3,y=4)


# 2.3 默认参数
# 默认形参:在定义函数阶段,就已经被赋值的形参,称之为默认参数
# 特点:在定义阶段就已经被赋值,意味着在调用阶段可以不用为其赋值
# def func(x,y=3):
# print(x,y)
#
# # func(x=1)
# func(x=1,y=44444)


# def register(name,age,gender='男'):
# print(name,age,gender)
#
# register('三炮',18)
# register('二炮',19)
# register('大炮',19)
# register('没炮',19,'女')


# 位置形参与默认形参混用,强调:
# 1、位置形参必须在默认形参的左边
# def func(y=2,x):
# pass

# 2、默认参数的值是在函数定义阶段被赋值的,准确地说被赋予的是值的内存地址
# 示范1:
# m=2
# def func(x,y=m): # y=>2的内存地址
# print(x,y
# m=3333333333333333333
# func(1)

# 示范2:
# m = [111111, ]
#
# def func(x, y=m): # y=>[111111, ]的内存地址
# print(x, y)
#
# m.append(3333333)
# func(1)

# 3、虽然默认值可以被指定为任意数据类型,但是不推荐使用可变类型
# 函数最理想的状态:函数的调用只跟函数本身有关系,不外界代码的影响
# m = [111111, ]
#
# def func(x, y=m):
# print(x, y)
#
# m.append(3333333)
# m.append(444444)
# m.append(5555)
#
#
# func(1)
# func(2)
# func(3)


# def func(x,y,z,l=None):
# if l is None:
# l=[]
# l.append(x)
# l.append(y)
# l.append(z)
# print(l)

# func(1,2,3)
# func(4,5,6)

# new_l=[111,222]
# func(1,2,3,new_l)


# 2.4 可变长度的参数(*与**的用法)
# 可变长度指的是在调用函数时,传入的值(实参)的个数不固定
# 而实参是用来为形参赋值的,所以对应着,针对溢出的实参必须有对应的形参来接收

# 2.4.1 可变长度的位置参数
# I:*形参名:用来接收溢出的位置实参,溢出的位置实参会被*保存成元组的格式然后赋值紧跟其后的形参名
# *后跟的可以是任意名字,但是约定俗成应该是args

# def func(x,y,*z): # z =(3,4,5,6)
# print(x,y,z)

# func(1,2,3,4,5,6)

# def my_sum(*args):
# res=0
# for item in args:
# res+=item
# return res
#
# res=my_sum(1,2,3,4,)
# print(res)

# II: *可以用在实参中,实参中带*,先*后的值打散成位置实参
# def func(x,y,z):
# print(x,y,z)
#
# # func(*[11,22,33]) # func(11,22,33)
# # func(*[11,22]) # func(11,22)
#
# l=[11,22,33]
# func(*l)

# III: 形参与实参中都带*
# def func(x,y,*args): # args=(3,4,5,6)
# print(x,y,args)

# func(1,2,[3,4,5,6])
# func(1,2,*[3,4,5,6]) # func(1,2,3,4,5,6)
# func(*'hello') # func('h','e','l','l','o')


# 2.4.2 可变长度的关键字参数
# I:**形参名:用来接收溢出的关键字实参,**会将溢出的关键字实参保存成字典格式,然后赋值给紧跟其后的形参名
# **后跟的可以是任意名字,但是约定俗成应该是kwargs
# def func(x,y,**kwargs):
# print(x,y,kwargs)
#
# func(1,y=2,a=1,b=2,c=3)

# II: **可以用在实参中(**后跟的只能是字典),实参中带**,先**后的值打散成关键字实参
# def func(x,y,z):
# print(x,y,z)

# func(*{'x':1,'y':2,'z':3}) # func('x','y','z')
# func(**{'x':1,'y':2,'z':3}) # func(x=1,y=2,z=3)

# 错误
# func(**{'x':1,'y':2,}) # func(x=1,y=2)
# func(**{'x':1,'a':2,'z':3}) # func(x=1,a=2,z=3)


# III: 形参与实参中都带**
# def func(x,y,**kwargs):
# print(x,y,kwargs)

# func(y=222,x=111,a=333,b=444)
# func(**{'y':222,'x':111,'a':333,'b':4444})




# 混用*与**:*args必须在**kwargs之前
# def func(x,*args,**kwargs):
# print(args)
# print(kwargs)
#
# func(1,2,3,4,5,6,7,8,x=1,y=2,z=3)


def index(x,y,z):
print('index=>>> ',x,y,z)

def wrapper(*args,**kwargs): #args=(1,) kwargs={'z':3,'y':2}
index(*args,**kwargs)
# index(*(1,),**{'z':3,'y':2})
# index(1,z=3,y=2)

wrapper(1,z=3,y=2) # 为wrapper传递的参数是给index用的
# 原格式---》汇总-----》打回原形



# 2.5 命名关键字参数(了解)
# 2.6 组合使用(了解)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!