一、三元运算(式)
对于一般简单的if else条件判断句可以用三元运算来表示
具体模式为:
1
2
3
4
5
6
|
if
condition:
expr1
else
:
expr2
等价于:
expr1
if
condition
else
expr2
|
解释:如果if condition条件成立就执行expr1表达式,否则就执行else expr2表达式
示例①
1
2
3
4
5
6
7
8
9
|
>>>
if
2
=
=
2
:
... name
=
'cool'
...
else
:
... name
=
'hot'
...
>>> name
=
'cool'
if
2
=
=
2
else
'hot'
>>>
print
name
cool
>>>
|
二、lambda表达式:
对于简单的函数可以用另外一种方式来代替,即lambda
比如有如下函数:
1
2
3
4
5
6
7
8
|
>>>
def
fun(arg):
...
return
arg
+
arg
...
>>>
>>> result
=
fun(
100
)
>>>
print
result
200
>>>
|
定义一个变量f_lambda,将lambda arg:arg+1赋予f_lambda
1
2
3
4
5
|
>>> f_lambda
=
lambda
arg:arg
+
1
>>> result
=
f_lambda(
111
)
>>>
print
result
112
>>>
|
也可以用其他表达式:
1
2
3
4
5
|
>>> test
=
lambda
a:a
*
*
2
>>> test_result
=
test(
3
)
>>>
print
test_result
9
>>>
|
从上面的例子可以看出,lambda后面表达式可以随意定义,只要符合Python的语法要求。
lambda表达式:
①用于处理简单逻辑
②会自动返回数据
三、内置函数map
map的作用是对序列中每个元素进行操作,然后输出新的序列
1
2
3
4
5
6
7
8
9
10
|
>>> num1
=
[
10
,
9
,
8
,
7
,
6
]
>>> num2
=
map
(
lambda
a:a
*
*
2
,num1)
>>>
print
num2
[
100
,
81
,
64
,
49
,
36
]
>>>
>>> num3
=
[
1
,
2
,
3
,
4
,
5
]
>>> num4
=
map
(
lambda
a,b:a
-
b,num1,num3)
>>>
print
num4
[
9
,
7
,
5
,
3
,
1
]
>>>
|
或者
1
2
3
4
5
6
7
8
|
>>> num
=
[
12
,
33
,
55
,
85
]
>>>
def
func(arg):
...
return
arg
+
10
...
>>> new_num
=
map
(func,num)
>>>
print
new_num
[
22
,
43
,
65
,
95
]
>>>
|
对于上述例子实质解释如下:
1
2
3
4
5
6
7
8
|
>>> new_num
=
[]
>>>
for
item
in
num:
... new_item
=
item
+
10
... new_num.append(new_item)
...
>>>
>>>
print
new_num
[
22
,
43
,
65
,
95
]
|
四、内置函数filter
filter的作用的是将序列中满足条件的过滤出来然后形成新的序列
1
2
3
4
5
|
>>> num1
=
[
10
,
9
,
8
,
7
,
6
]
>>> tmp
=
filter
(
lambda
arg:arg >
5
,num1)
>>>
print
tmp
[
10
,
9
,
8
,
7
,
6
]
>>>
|
或者
1
2
3
4
|
>>> tmp2
=
filter
(
lambda
n:n >
5
,num1)
>>>
print
tmp2
[
10
,
9
,
8
,
7
,
6
]
>>>
|
或者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#!/usr/bin/env python
# -*- coding:utf8 -*-
num
=
[
11
,
22
,
0
,
33
]
print
filter
(
None
,num)
[root@Python day004]
# python lam.py
[
11
,
22
,
33
]
[root@Python day004]
#
[root@Python day004]
# cat lam.py
#!/usr/bin/env python
# -*- coding:utf8 -*-
num
=
[
11
,
22
,
0
,
33
,""]
print
filter
(
None
,num)
[root@Python day004]
# python lam.py
[
11
,
22
,
33
]
[root@Python day004]
# cat lam.py
#!/usr/bin/env python
# -*- coding:utf8 -*-
num
=
[
11
,
22
,
0
,
33
,"",
False
]
print
filter
(
None
,num)
[root@Python day004]
# python lam.py
[
11
,
22
,
33
]
|
小结:从上可以发现,默认情况下,当用filter进行处理数据时,filter会将布尔值为真的输出(一般将布尔值为True的返回到新列表中,反之不会返回到新列表中),为假的忽略掉;当然filter中也可以传入函数,如上例中的lambda语句;
五、内置函数reduce
reduce的作用是对序列内的所有元素进行操作
1
2
3
4
5
6
7
8
9
|
>>> num1
=
[
10
,
9
,
8
,
7
,
6
]
>>> result
=
reduce
(
lambda
arg1,arg2:arg1
+
arg2,num1)
>>>
print
result
40
>>> num5
=
[
1
,
2
,
3
,
4
,
5
,
6
]
>>>
sum
=
reduce
(
lambda
a,b:a
+
b,num5)
>>>
print
sum
21
>>>
|
# reduce的第一个参数,函数必须要有两个参数
# reduce的第二个参数,要循环的序列
# reduce的第三个参数,初始值
六、yield生成器(它可以记住上一次的操作,下次再执行时,继续执行)
1
2
3
4
5
6
7
8
9
|
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def
func():
pass
return
1
return
2
return
3
result
=
func()
print
result
|
执行以上代码,输出结果:
1
2
3
|
D:\Python27\python.exe C:
/
Users
/
ryan
/
PycharmProjects
/
day04
/
yield
.py
1
Process finished with exit code
0
|
发现函数返回的只有1,后面的2、3都没有返回,这里说明return语句结束后,代表函数体生命周期结束,接下来讲return替换成yield
1
2
3
4
5
6
7
8
9
|
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def
func():
pass
yield
1
yield
2
yield
3
for
i
in
func():
print
i
|
输出结果:
1
2
3
|
1
2
3
|
1、对比range和xrange的区别
有如下例子:
1
2
3
4
5
|
>>>
print
range
(
8
)
[
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
]
>>>
print
xrange
(
8
)
xrange
(
8
)
>>>
|
从上面可以发现,range和xrange的区别是:
range可以生成一个列表,即在内存中创建指定的数字,而xrange则不会,接着往下看:
1
2
3
4
5
6
7
8
9
10
11
12
|
>>>
for
n
in
xrange
(
8
):
...
print
n
...
0
1
2
3
4
5
6
7
>>>
|
xrange只有在进行循环的时候才会创建数字,即在迭代的时候才会去创建;
1
2
3
4
5
6
7
8
9
10
11
12
|
>>>
def
nrange(num):
... temp
=
-
1
...
while
True
:
... temp
=
temp
+
1
...
if
temp >
=
num:
...
return
...
else
:
...
yield
temp
...
>>> nrange(
10
)
<generator
object
nrange at
0x7fe42d0bd820
>
>>>
|
2、文件操作的read和xreadlines的区别
①read会读取所有内容到内存中
②xreadlines则只会在循环迭代时才获取数据
1
2
3
4
5
6
7
8
9
10
|
def
NReadlines():
with
open
(
'log'
,
'r'
) as f:
while
True
:
line
=
f.
next
()
if
line:
yield
line
else
:
return
for
i
in
NReadlines():
print
i
|
注:基于next自定义生成器NReadlines
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def
NReadlines():
with
open
(
'log'
,
'r'
) as f:
seek
=
0
while
True
:
f.seek(seek)
data
=
f.readline()
if
data:
seek
=
f.tell()
yield
data
else
:
return
for
item
in
NReadlines():
print
item
|
基于seek和tell自定义生成器NReadlines
七、装饰器
装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或者类,使用装饰器可以在函数执行前和执行后添加相应的操作
1
2
3
4
5
6
7
8
9
10
|
def
wrapper(func):
def
result():
print
'before'
func()
print
'after'
return
result
@wrapper
def
foo():
print
'foo'
|
1
2
3
4
5
6
7
8
9
10
11
|
import
functools
def
wrapper(func):
@functools.wraps(func)
def
wrapper():
print
'before'
func()
print
'after'
return
wrapper
@wrapper
def
foo():
print
'foo'
|
示例代码:
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
|
#!/usr/bin/env python
#coding:utf-8
def
Before(request,kargs):
print
'before'
def
After(request,kargs):
print
'after'
def
Filter
(before_func,after_func):
def
outer(main_func):
def
wrapper(request,kargs):
before_result
=
before_func(request,kargs)
if
(before_result !
=
None
):
return
before_result;
main_result
=
main_func(request,kargs)
if
(main_result !
=
None
):
return
main_result;
after_result
=
after_func(request,kargs)
if
(after_result !
=
None
):
return
after_result;
return
wrapper
return
outer
@Filter
(Before, After)
def
Index(request,kargs):
print
'index'
if
__name__
=
=
'__main__'
:
Index(
1
,
2
)
|
本文转自027ryan 51CTO博客,原文链接:http://blog.51cto.com/ucode/1726976,如需转载请自行联系原作者