python中的列表解析与函数参数*args **kwargs用法

时间:2021-07-10 21:26:03

一 列表解析:(性能远高于for循环) python有且只有一个最优解

[ex for item in iter if condition] ==>list
返回列表

li = [1,2,3,4,5]
li1 = [i+1 for i in li]
li1
[2, 3, 4, 5, 6]

加条件:
>>> li
[1, 2, 3, 4, 5]
>>> [x+1 for x in li if x % 2 == 0]
[3, 5]
>>> type(li1)
<type 'list'>

实现:
>>> li1=[]
>>> for x in li:
... if x % 2 == 0:
... li1.append(x+1)
...
>>> li1
[3, 5]

多重条件: [ex for i in li if condition1 if condition2 ]或者and or

笛卡尔积:
>>> [(x,y) for x in [1,2,3,45] for y in [1,2,3,4]]

[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4), (45, 1), (45, 2), (45, 3), (45, 4)]

条件:
>>> [(x,y) for x in [1,2,3,45] for y in [1,2,3,4] if x % 2 == 0 ]

[(2, 1), (2, 2), (2, 3), (2, 4)]

[(x,y) for x in [1,2,3,45] for y in [1,2,3,4] if x % 2 == 0 if y >= 1]
[(2, 1), (2, 2), (2, 3), (2, 4)]

(ex for i in iter) ==>iter
返回迭代器 (性能比列表好,不用全部计算)可生成一个无限大的序列

li1 = (i+1 for i in li)

>>> li1
<generator object <genexpr> at 0x7efd8687fbe0>
>>> li1.next()
2
>>> li1.next()
3
>>> li1.next()
4
>>> type(li1)
<type 'generator'> 生成器 //生成器只能转换为迭代器(中间一步由解释器转换)需要用到哪个值就会计算哪个值其他的值搁置

二 function 函数:

1.返回值 执行return语句就会返回后面不执行 若函数里没有return返回值则默认返回None

def test():
print “hello world”

user_name = test()

print user_name

[root@desktop43 python]# python fuc.py
hello world
None

若需要返回值则用return 然后赋值给变量

2.位置传参和关键字传参
有默认值可以不传参数 (若传参数则会覆盖默认的参数)
所有带默认值的参数必须放在最后面,如:
test(a,b,c=100)
test(a,b=100,c) ///错误类型

*args 可变位置参数(数量可变,位置不变) 参数打包输出为元组 (输入的值确定不能修改所以用元组最合适) 可用索引args[0]

def func(*args):
print args
print args[0]
func(1,2,3,4,5)
[root@desktop43 python]# python args.py
(1, 2, 3, 4, 5)
1
/////可变位置传参

def func(i,j,*args):
print args
print args[0]
func(1,2,3,4,5)

[root@desktop43 python]# python args.py
(3, 4, 5)
3
/////可变位置参数混合传参不能有func(i=1,j=0,98902,35,242)传参只能func(1,2,3,4,5), 默认解释器会将第一个值赋给第一个变量

**kwargs 可变关键字参数(数量可变,关键字不变)

def func1(**kwargs):
print kwargs

func1(a=123,b=456,c=667)

[root@desktop43 python]# python args.py
{‘a’: 123, ‘c’: 667, ‘b’: 456}

//////////可变关键字传参

def func1(i,j,**kwargs):
print kwargs
print i
print j
func1(i=123,j=456,c=667,d=’qqq’)

[root@desktop43 python]# python args.py
{‘c’: 667, ‘d’: ‘qqq’}
123
456

///////混合传参,只能关键字传参func(i=123,j=456,c=667,d=’qqq’) 不能fun(1,2,3,4,5)

3.解包:
(*list/*tuple) 解包为位置参数直接调用
(**dict) 解包为关键字传参

def func(i,j,*args):
print args
print args[0]

li=[1,2,3,4,5,6]
func(*li) ///func(li[0],li[1],li[2]…li[5]) ///解包操作
p=(7,8,9,0)
func(*p)

[root@desktop43 python]# python args.py
(3, 4, 5, 6)
3
(9, 0)
9
//////混合,列表或元组解包传参相当于func(li[0],li[1],li[2]…li[5])

def func1(i,j,**kwargs):
print kwargs
print i
print j

d = {‘i’:1,’j’:2,’c’:3,’d’:4}
func1(**d)

[root@desktop43 python]# python args.py
{‘c’: 3, ‘d’: 4}
1
2
//////混合,字典解包传参相当于func1(i=1,j=2,c=3,d=4)