第四节 集合与函数
###################################################2018-10-7 day14-01
name='alex'
age=0
age=18
life=True
life=False
字符串 str
数字 int
列表 list[]
元组 tuple()
字典dict{}
可变不可变:
1.不可变:字符串,数字,元组
name='alex'
id(name) 其中与 VC++的&符号不一样
》》》内存地址18107672
另开辟,发现ID变了,不可变
访问顺序:
1.顺序访问:字符串,列表,元组
2.映射:字典
3.直接访问:数字
存放元素个数:
容器类型:列表,元组,字典
原子:数字,字符串
###################################################2018-10-7 day14-02
集合定义:由不同元素组成的集合,集合中是一组无序排列的,
集合中元素只能是数字,字符串,无组
与字典共用{}
集合set s={1,2,3,4,5,6}
字典dic={key:value}
集合自动去同
s={'hello','world','alex','alex'}
print(s)
for i in s :
print(i)
hello
world
alex
多个则对比各各之间的关系,单个只对比自身
定义可变集合set
set_test=set('hello')
###################################################2018-10-7 day14-03
python_l=['lcg','szw','zjw']
linux_l=['lcg','szw']
python_and_linux_l=[]
for p_name in python_l:
if p_name in linux_l:
python_and_linux_l.append(p_name)
print(python_and_linux_l)
python_l=['lcg','szw','zjw']
linux_l=['lcg','szw']
p_s=set(python_l) 做了去重,但回复不了原样
l_s=set(linux_l)
print-(p_s,l_s)
求交集
print(p_s.intersection(l_s))
求并集
print(p_s&l_s)
print(p_s.union(l_s))
print(p_s|l_s)
求差集
print(p_s-l_s)
print(p_s.difference(l_s))
###################################################2018-10-7 day14-04
交叉补集 两个加起来减去共有的部分,
print('交叉补集',p_s.symmetric_difference(l_s))
print('交叉补集',p_s^l_s)
python_l=['lcg','szw','zjw']
linux_l=['lcg','szw']
p_s=set(python_l)
l_s=set(linux_l)
print(p_s,l_s)
p_s.difference_update(l_s) 等于 p_s=p_s-l_s
s1={1,2}
s2={3,5}
print(s1.isdisjoint(s2))
s1={1,2}
s2={1,2,3}
print(s1.issubset())
s1.update(s2)
print(s1)
s1.add(1,2,3,4) 只能传4个出错
s1.update((3,4))
集合是可变的,
s=frozenset() 不可变集合
names=['alex','alex','wupeiqi']
s=set(names)
print(s)
names=list(s) s可用for循环,是可迭代类型
###################################################2018-10-7 day14-06
百分号字符串拼接
msg='i am %s my hobby is ales' %'lhf'
print(msg)
msg='i am %s my hobby is %s' %('lhf','alex')
msg='i am %s my hobby is %s' %('lhf',1) 数字
msg='i am %s my hobby is %s' %('lhf',[1,2]) name
%d 数字
msg='percent %.2f%%' 读两位 百分比
可以在输出过程中增加颜色
# msg='i am %s my hobby is %s' % ('lhf','alex')
# print(msg)
#
# msg='i am %s my hobby is %s' % ('lhf',1)
# msg='i am %s my hobby is %s' % ('lhf',[1,2])
# print(msg)
# name='lhf'
# age=19
# msg='i am %s my hobby is %s' % (name,age)
# print(msg)
#打印浮点数
tpl = "percent %.2f" % 99.976234444444444444
print(tpl)
#打印百分比
tpl = 'percent %.2f %%' % 99.976234444444444444
print(tpl)
tpl = "i am %(name)s age %(age)d" % {"name": "alex", "age": 18}
print(tpl)
msg='i am %(name)+60s my hobby is alex' %{'name':'lhf'}
print(msg)
msg='i am \033[43;1m%(name)+60s\033[0m my hobby is alex' %{'name':'lhf'}
print(msg)
print('root','x','0','0',sep=':')
# print('root'+':'+'x'+':'+'0','0') 复杂
Python的字符串格式化有两种方式: 百分号方式、format方式
百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存。[PEP-3101]
This PEP proposes a new system for built-in string formatting operations, intended as a replacement for the existing '%' string formatting operator.
1、百分号方式
%[(name)][flags][width].[precision]typecode
- (name) 可选,用于选择指定的key
- flags 可选,可供选择的值有:
- + 右对齐;正数前加正好,负数前加负号;
- - 左对齐;正数前无符号,负数前加负号;
- 空格 右对齐;正数前加空格,负数前加负号;
- 0 右对齐;正数前无符号,负数前加负号;用0填充空白处
- width 可选,占有宽度
- .precision 可选,小数点后保留的位数
- typecode 必选
- s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
- r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
- c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
- o,将整数转换成 八 进制表示,并将其格式化到指定位置
- x,将整数转换成十六进制表示,并将其格式化到指定位置
- d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
- e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
- E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
- f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
- F,同上
- g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
- G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
- %,当字符串中存在格式化标志时,需要用 %%表示一个百分号
注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式
常用格式化:
1
2
3
4
5
6
7
8
9
10
11
|
tpl
=
"i am %s"
%
"alex"
tpl
=
"i am %s age %d"
%
(
"alex"
,
18
)
tpl
=
"i am %(name)s age %(age)d"
%
{
"name"
:
"alex"
,
"age"
:
18
}
tpl
=
"percent %.2f"
%
99.97623
tpl
=
"i am %(pp).2f"
%
{
"pp"
:
123.425556
, }
tpl
=
"i am %.2f %%"
%
{
"pp"
:
123.425556
, }
|
2、Format方式
[[fill]align][sign][#][0][width][,][.precision][type]
- fill 【可选】空白处填充的字符
- align 【可选】对齐方式(需配合width使用)
- <,内容左对齐
- >,内容右对齐(默认)
- =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
- ^,内容居中
- sign 【可选】有无符号数字
- +,正号加正,负号加负;
- -,正号不变,负号加负;
- 空格 ,正号空格,负号加负;
- # 【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
- , 【可选】为数字添加分隔符,如:1,000,000
- width 【可选】格式化位所占宽度
- .precision 【可选】小数位保留精度
- type 【可选】格式化类型
- 传入” 字符串类型 “的参数
- s,格式化字符串类型数据
- 空白,未指定类型,则默认是None,同s
- 传入“ 整数类型 ”的参数
- b,将10进制整数自动转换成2进制表示然后格式化
- c,将10进制整数自动转换为其对应的unicode字符
- d,十进制整数
- o,将10进制整数自动转换成8进制表示然后格式化;
- x,将10进制整数自动转换成16进制表示然后格式化(小写x)
- X,将10进制整数自动转换成16进制表示然后格式化(大写X)
- 传入“ 浮点型或小数类型 ”的参数
- e, 转换为科学计数法(小写e)表示,然后格式化;
- E, 转换为科学计数法(大写E)表示,然后格式化;
- f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
- F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
- g, 自动在e和f中切换
- G, 自动在E和F中切换
- %,显示百分比(默认显示小数点后6位)
- 传入” 字符串类型 “的参数
常用格式化:对号入座
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
|
tpl
=
"i am {}, age {}, {}"
.
format
(
"seven"
,
18
,
'alex'
)
tpl
=
"i am {}, age {}, {}"
.
format
(
*
[
"seven"
,
18
,
'alex'
])
tpl
=
"i am {0}, age {1}, really {0}"
.
format
(
"seven"
,
18
)
tpl
=
"i am {0}, age {1}, really {0}"
.
format
(
*
[
"seven"
,
18
])
tpl
=
"i am {name}, age {age}, really {name}"
.
format
(name
=
"seven"
, age
=
18
)
tpl
=
"i am {name}, age {age}, really {name}"
.
format
(
*
*
{
"name"
:
"seven"
,
"age"
:
18
}) 可用字典取代上面格式,但在前面加两个**
tpl
=
"i am {0[0]}, age {0[1]}, really {0[2]}"
.
format
([
1
,
2
,
3
], [
11
,
22
,
33
])
tpl
=
"i am {:s}, age {:d}, money {:f}"
.
format
(
"seven"
,
18
,
88888.1
)
tpl
=
"i am {:s}, age {:d}"
.
format
(
*
[
"seven"
,
18
])# 可用链表 取代上面格式,但在前面加*
tpl
=
"i am {name:s}, age {age:d}"
.
format
(name
=
"seven"
, age
=
18
)
tpl
=
"i am {name:s}, age {age:d}"
.
format
(
*
*
{
"name"
:
"seven"
,
"age"
:
18
})
tpl
=
"numbers: {:b},{:o},{:d},{:x},{:X}, {:%}"
.
format
(
15
,
15
,
15
,
15
,
15
,
15.87623
,
2
)
tpl
=
"numbers: {:b},{:o},{:d},{:x},{:X}, {:%}"
.
format
(
15
,
15
,
15
,
15
,
15
,
15.87623
,
2
)
二进制 八进制 整型 小写十六进制abcde 大写十六进制ABCDE
tpl
=
"numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}"
.
format
(
15
)
tpl
=
"numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}"
.
format
(num
=
15
)
|
更多格式化操作:https://docs.python.org/3/library/string.html
迭代器和生成器
1、迭代器
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
>>> a
=
iter
([
1
,
2
,
3
,
4
,
5
])
>>> a
<list_iterator
object
at
0x101402630
>
>>> a.__next__()
1
>>> a.__next__()
2
>>> a.__next__()
3
>>> a.__next__()
4
>>> a.__next__()
5
>>> a.__next__()
Traceback (most recent call last):
File
"<stdin>"
, line
1
,
in
<module>
StopIteration
|
2、生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器;
1
2
3
4
5
|
def
func():
yield
1
yield
2
yield
3
yield
4
|
上述代码中:func是函数称为生成器,当执行此函数func()时会得到一个迭代器。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> temp
=
func()
>>> temp.__next__()
1
>>> temp.__next__()
2
>>> temp.__next__()
3
>>> temp.__next__()
4
>>> temp.__next__()
Traceback (most recent call last):
File
"<stdin>"
, line
1
,
in
<module>
StopIteration
|
3、实例
a、利用生成器自定义range
1
2
3
4
5
6
7
8
|
def
nrange(num):
temp
=
-
1
while
True
:
temp
=
temp
+
1
if
temp >
=
num:
return
else
:
yield
temp
|
b、利用迭代器访问range
###################################################2018-10-12 day14-07
###################################################2018-10-12 day14-08
数学意义的函数和python中的函数
初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数。自变量x的取值范围叫做这个函数的定义域
例如y=2*x
python中函数定义:函数是逻辑结构化和过程化的一种编程方法。
1 python中函数定义方法: 2 3 def test(x): 4 "Input a variant x,return a value equel to x+1" 野路军与正规军的区别 5 x+=1 6 return x 7 8 def:定义函数的关键字 9 test:函数名 10 ():内可定义形参 11 "":文档描述(非必要,但是强烈建议为你的函数添加描述信息) 12 x+=1:泛指代码块或程序处理逻辑 13 return:定义返回值
调用运行:可以带参数也可以不带
函数名()
补充:
1.编程语言中的函数与数学意义的函数是截然不同的俩个概念,编程语言中的函数是通过一个函数名封装好一串用来完成某一特定功能的逻辑,数学定义的函数就是一个等式,等式在传入因变量值x不同会得到一个结果y,这一点与编程语言中类似(也是传入一个参数,得到一个返回值),不同的是数学意义的函数,传入值相同,得到的结果必然相同且没有任何变量的修改(不修改状态),而编程语言中的函数传入的参数相同返回值可不一定相同且可以修改其他的全局变量值(因为一个函数a的执行可能依赖于另外一个函数b的结果,b可能得到不同结果,那即便是你给a传入相同的参数,那么a得到的结果也肯定不同)
2.函数式编程就是:先定义一个数学函数(数学建模),然后按照这个数学模型用编程语言去实现它。至于具体如何实现和这么做的好处,且看后续的函数式编程。
二 为何使用函数
背景提要
现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码
1 while True: 2 if cpu利用率 > 90%: 3 #发送邮件提醒 4 连接邮箱服务器 5 发送邮件 6 关闭连接 7 8 if 硬盘使用空间 > 90%: 9 #发送邮件提醒 10 连接邮箱服务器 11 发送邮件 12 关闭连接 13 14 if 内存占用 > 80%: 15 #发送邮件提醒 16 连接邮箱服务器 17 发送邮件 18 关闭连接
上面的代码实现了功能,但即使是邻居老王也看出了端倪,老王亲切的摸了下你家儿子的脸蛋,说,你这个重复代码太多了,每次报警都要重写一段发邮件的代码,太low了,这样干存在2个问题:
- 代码重复过多,一个劲的copy and paste不符合高端程序员的气质
- 如果日后需要修改发邮件的这段代码,比如加入群发功能,那你就需要在所有用到这段代码的地方都修改一遍
你觉得老王说的对,你也不想写重复代码,但又不知道怎么搞,老王好像看出了你的心思,此时他抱起你儿子,笑着说,其实很简单,只需要把重复的代码提取出来,放在一个公共的地方,起个名字,以后谁想用这段代码,就通过这个名字调用就行了,如下
def 发送邮件(内容) #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 while True: if cpu利用率 > 90%: 发送邮件('CPU报警') if 硬盘使用空间 > 90%: 发送邮件('硬盘报警') if 内存占用 > 80%: 发送邮件('内存报警')
你看着老王写的代码,气势恢宏、磅礴大气,代码里透露着一股内敛的傲气,心想,老王这个人真是不一般,突然对他的背景更感兴趣了,问老王,这些花式玩法你都是怎么知道的? 老王亲了一口你儿子,捋了捋不存在的胡子,淡淡的讲,“老夫,年少时,师从京西沙河淫魔银角大王 ”, 你一听“银角大王”这几个字,不由的娇躯一震,心想,真nb,怪不得代码写的这么6, 这“银角大王”当年在江湖上可是数得着的响当当的名字,只可惜后期纵欲过度,卒于公元2016年, 真是可惜了,只留下其哥哥孤守当年兄弟俩一起打下来的江山。 此时你看着的老王离开的身影,感觉你儿子跟他越来越像了。。。
总结使用函数的好处:
1.代码重用
2.保持一致性,易维护
3.可扩展性
三 函数和过程
过程定义:过程就是简单特殊没有返回值的函数
这么看来我们在讨论为何使用函数的的时候引入的函数,都没有返回值,没有返回值就是过程,没错,但是在python中有比较神奇的事情
1 def test01(): 2 msg='hello The little green frog' 3 print msg 4 5 def test02(): 6 msg='hello WuDaLang' 7 print msg 8 return msg 9 10 11 t1=test01() 12 13 t2=test02() 14 15 16 print 'from test01 return is [%s]' %t1 17 print 'from test02 return is [%s]' %t2
总结:当一个函数/过程没有使用return显示的定义返回值时,python解释器会隐式的返回None,
所以在python中即便是过程也可以算作函数。
1 def test01(): 2 pass 3 4 def test02(): 5 return 0 6 7 def test03(): 8 return 0,10,'hello',['alex','lb'],{'WuDaLang':'lb'} 9 10 t1=test01() 11 t2=test02() 12 t3=test03() 13 14 15 print 'from test01 return is [%s]: ' %type(t1),t1 16 print 'from test02 return is [%s]: ' %type(t2),t2 17 print 'from test03 return is [%s]: ' %type(t3),t3
总结:
返回值数=0:返回None
返回值数=1:返回object
返回值数>1:返回tuple
四 函数参数
1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
2.实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
3.位置参数和关键字(标准调用:实参与形参位置一一对应;关键字调用:位置无需固定)
4.默认参数
5.参数组
五 局部变量和全局变量
1 name='lhf' 2 3 def change_name(): 4 print('我的名字',name) 5 6 change_name() 7 8 9 def change_name(): 10 name='帅了一笔' 11 print('我的名字',name) 12 13 change_name() 14 print(name) 15 16 17 18 def change_name(): 19 global name 20 name='帅了一笔' 21 print('我的名字',name) 22 23 change_name() 24 print(name)
六 前向引用之'函数即变量'
1 def action(): 2 print 'in the action' 3 logger() 4 action() 5 报错NameError: global name 'logger' is not defined 6 7 8 def logger(): 9 print 'in the logger' 10 def action(): 11 print 'in the action' 12 logger() 13 14 action() 15 16 17 def action(): 18 print 'in the action' 19 logger() 20 def logger(): 21 print 'in the logger' 22 23 action()
七 嵌套函数和作用域
看上面的标题的意思是,函数还能套函数?of course
1 name = "Alex" 2 3 def change_name(): 4 name = "Alex2" 5 6 def change_name2(): 7 name = "Alex3" 8 print("第3层打印",name) 9 10 change_name2() #调用内层函数 11 print("第2层打印",name) 12 13 14 change_name() 15 print("最外层打印",name)
此时,在最外层调用change_name2()会出现什么效果?
没错, 出错了, 为什么呢?
作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变
1 例一: 2 name='alex' 3 4 def foo(): 5 name='lhf' 6 def bar(): 7 print(name) 8 return bar 9 10 func=foo() 11 func() 12 13 14 例二: 15 name='alex' 16 17 def foo(): 18 name='lhf' 19 def bar(): 20 name='wupeiqi' 21 def tt(): 22 print(name) 23 return tt 24 return bar 25 26 func=foo() 27 func()()
八 递归调用
古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知,致知在格物。物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平。
在函数内部,可以调用其他函数。如果在调用一个函数的过程中直接或间接调用自身本身
1 def calc(n): 2 print(n) 3 if int(n/2) ==0: 4 return n 5 return calc(int(n/2)) 6 7 calc(10) 8 9 输出: 10 10 11 5 12 2 13 1
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html
尾递归优化:http://egon09.blog.51cto.com/9161406/1842475
九 匿名函数
匿名函数就是不需要显式的指定函数
1 #这段代码 2 def calc(n): 3 return n**n 4 print(calc(10)) 5 6 #换成匿名函数 7 calc = lambda n:n**n 8 print(calc(10))
你也许会说,用上这个东西没感觉有毛方便呀, 。。。。呵呵,如果是这么用,确实没毛线改进,不过匿名函数主要是和其它函数搭配使用的呢,如下
1 l=[3,2,100,999,213,1111,31121,333] 2 print(max(l)) 3 4 dic={'k1':10,'k2':100,'k3':30} 5 6 7 print(max(dic)) 8 print(dic[max(dic,key=lambda k:dic[k])])
1 res = map(lambda x:x**2,[1,5,7,4,8]) 2 for i in res: 3 print(i) 4 5 输出 6 1 7 25 8 49 9 16 10 64
十 函数式编程
峰哥原创面向过程解释:
函数的参数传入,是函数吃进去的食物,而函数return的返回值,是函数拉出来的结果,面向过程的思路就是,把程序的执行当做一串首尾相连的函数,一个函数吃,拉出的东西给另外一个函数吃,另外一个函数吃了再继续拉给下一个函数吃。。。
例如:
用户登录流程:前端接收处理用户请求-》将用户信息传给逻辑层,逻辑词处理用户信息-》将用户信息写入数据库
验证用户登录流程:数据库查询/处理用户信息-》交给逻辑层,逻辑层处理用户信息-》用户信息交给前端,前端显示用户信息
函数式编程:
http://egon09.blog.51cto.com/9161406/1842475
11 高阶函数
满足俩个特性任意一个即为高阶函数
1.函数的传入参数是一个函数名
2.函数的返回值是一个函数名
十一 内置函数
内置参数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii
十二 本节作业
###################################################2018-10-12 day14-09
为何要有函数,函数名重叠,python会选择最后的函数
###################################################2018-10-12 day14-10
函数返回值
没有函数test()没有return
如果print(test())则会print none
当return =1的时候,可以返回链表
###################################################2018-10-12 day14-11
形参,实参
软件代码颜色改变,即说明报错
位置参数必须在关键字参数左边
def test(x,y,z)
print(x)
print(y)
print(z)
test(y=1,x=3,z=4) 全都是 关键字参数时,无须一一对应,缺一不行多一也不行;关键字参数 x=3的形式
test(1,y=2,3) 位置参数必须在关键字参数左边 3是位置参数,在y=2关键字参数的后面;
def handle(x,type='mysql'):
print(x)
print(type)
handle('hello','sqlite')
list一个* 字典是两个**
def test(x,*args): 留下可拓展性
print(x)
print(args)
print(args[0])
test(1,2,3,4,5,6)
输出以下
1
(2,3,4,5,6) 重要,以元组的方式输出,如果以链表的方式,就需要单个* test(1,*[2,3,4,5]);
2
def test(x,**kwargs):
print(x)
print(kwargs)
test(1,y=2,z=3)
def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
test(1,1,2,1,1,11,1,y=2,z=3)
输出结果
1
(1,2,1,1,11,1)
{'y':2,'x':3}
1
|
...
|