一 列表解析:(性能远高于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)