-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfunc_params.py
More file actions
166 lines (121 loc) · 4.08 KB
/
func_params.py
File metadata and controls
166 lines (121 loc) · 4.08 KB
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
__author__ = 'shenyao'
def power(x,n):#位置参数
s=1
while n>0:
n=n-1
s=s*x
return s
print(power(5,2))#位置参数
print(power(5,3))#位置参数
def power(x,n=2):#默认参数(必选参数在前,默认参数在后)
s=1
while n>0:
n=n-1
s=s*x
return s
print(power(5))
print(power(5,3))
def enroll(name,gender,age=6,city='beijing'):
print("name",name)
print("gender",gender)
print("age",age)
print("city",city)
enroll('Sarah','F')
enroll('Bob','M',7)
enroll('Sheldon','M',city="shenzhen")
#演示默认参数的坑
def add_end(L=[]):
L.append('END')
return L
print(add_end([1,2,3]))
print(add_end(['x','y','z']))
#print(add_end())
#--------pitfall----------------
print(add_end())
print(add_end())
print(add_end())
#-------pitfall----------------
#-------solution---------------
#默认参数必须指向不变对象
def add_end(L=None):#利用None这个不变对象来实现
if L is None:
L=[]
L.append('END')
return L
#-------solution---------------
print(add_end())
print(add_end())
print(add_end())
def calc(numbers):
sum=0
for n in numbers:
sum=sum+n*n
return sum
#可变参数
def calc(*numbers):#把函数参数改为可变参数
sum=0
print(type(numbers)) #tuple
for n in numbers:#numbers tuple
sum=sum+n*n
return sum
# print(calc([1,2,3]))
# print(calc((1,3,5,7)))
print( calc(1, 2, 3))
print(calc(1,3,5,7))
print(calc())
nums=[1,2,3]
print(calc(nums[0],nums[1],nums[2]))
print(calc(*nums))#*num表示把这个list的所有元素作为可变参数传进去,这种写法相当有用
#关键字参数
#可变参数在函数调用的时候自动组装为一个tuple,
#关键字参数内部自动组装为一个dict
def person(name,age,**kw):
print('name:',name,'age:',age,'other:',kw) #kw {}
person('sheldon',24)
person('sheldon',24,city='beijing')
person('sheldon',24,gender='M',job="Engineer")
extra={'gender':'M','job':'softwar'}
person('sheldon','M',**extra)#kw将获得extra参数的一份拷贝
#关键字参数
def person(name,age,**kw):
if 'city' in kw:
pass
if 'job' in kw:
pass
print('name:',name,"age:",age,"other:",kw)
person('jack',24,city='beijing',addr='chaoyang',zipcode=12345)
#命名关键字参数
#和关键字参数**kw不同,命名关键字参数需要一个特许的分隔符*,*后面的参数被视为命名关键字参数
def person(name,age,*,city,job):
print(name,age,city,job)
person('jack',24,city="shenzhen",job="programmer")
def person(name,age,*args,city,job):
print(name,age,city,job)
person('jack',24,city="shenzhen",job="programmer")
def person(name,age,*args,city='shenzhen',job):#命名关键字参数可以有默认值
print(name,age,city,job)
person('jack',24,job="programmer")
def person(name, age, city, job):
# 缺少 *,city和job被视为位置参数
pass
#组合参数
#5中参数的定义顺序必须是必选参数,默认参数,可变参数,命名关键字参数,关键字参数
def f1(a,b,c=0,*args,**kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a,b,c=0,*,d,**kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
args=(1,2,3,4)
kw={'d':99,'x':'#'}
f1(*args,**kw)
args=(1,2,3)
kw={'d':88,'x':'#'}
f2(*args,**kw)
#所以,对于任意参数,都可以通过类似func(*args,**kw)的形式调用,无论他的参数是如何定义的
#小结
#1 默认参数一定要用不可变对象,如果是可变参数,程序运行时会有逻辑错误
#2 *args是可变参数,args接收的是一个tuple
#3 **kw是关键字参数,kw接收的是一个dict
#4 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3))
#5 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})
#6 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值
#7 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数