为了账号安全,请及时绑定邮箱和手机立即绑定

Python中几个有趣的语法糖?

Python中几个有趣的语法糖?

收到一只叮咚 2019-05-18 15:11:35
Python中几个有趣的语法糖
查看完整描述

4 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

当然是函数式那一套黑魔法啦,且听我细细道来。 lambda表达式也就是匿名函数。用法:lambda 参数列表 : 返回值例: +1函数 f=lambda x:x+1 max函数(条件语句的写法如下) f_max=lambda x,y:x if x>y else y 上述定义的函数与用def定义的函数没有区别,而且左边的f=在某些情况下并不是必要的。 filter,map,reduce filter函数接受两个参数,第一个是过滤函数,第二个是可遍历的对象,用于选择出所有满足过滤条件的元素,不同版本的filter的返回值稍有区别,我用的是python3.5,filter返回的是经过过滤的可遍历对象。例:去除小写字母 s=filter(lambda x:not str(x).islower(),"asdasfAsfBsdfC") for ch in s: print(ch) map函数接受的参数类型与filter类似,它用于把函数作用于可遍历对象的每一个元素。类似于数学中映射的概念。例:求y=2x+1(偷偷用了一下range函数生成定义域) s=map(lambda x:2*x+1,range(6)) for x in s: print(x) reduce函数对每个元素作累计操作,它接受的第一个参数必须是有两个参数的函数。例:求和 from functools import reduce s=reduce(lambda x,y:x+y,range(1,6)) print(s) 求乘积(第三个可选参数表示累计变量的初值) from functools import reduce s=reduce(lambda x,y:x*y,range(1,6),1) print(s) 柯里化(curry)函数如果一个函数需要2个参数,而你只传入一个参数,那么你就可以得到一个柯里化的函数,这是函数式编程语言的重要特性之一,遗憾的是,python并不能在语法层面支持柯里化调用,但它在库中提供了接口。例: *3函数 f_mul=lambda x,y:x*y from functools import partial mul3=partial(f_mul,3) print(mul3(1)) print(mul3(6)) 打包与解包有点类似于函数式中的模式匹配,略牵强。 t=(1,2,3) x,y,z=t 列表生成式这个也有点牵强,不知道严格意义上讲属不属于函数式风格。例:生成奇数序列 l=[2*x+1 for x in range(10)] for i in l: print(i) 最后来一个彩蛋(以前某答主提到的用调分函数来美颜的算法,忘了出处了,侵删) from PIL import Image from math import sqrt im = Image.open("a.jpg") ret= im.convert(mode="RGB") ret = ret.point(lambda x:sqrt(x)*sqrt(255)) ret.save("b.jpg")

查看完整回答
反对 回复 2019-05-27
?
Qyouu

TA贡献1786条经验 获得超11个赞

当然是函数式那一套黑魔法啦,且听我细细道来。
lambda表达式
也就是匿名函数。
用法:lambda 参数列表 : 返回值
例:
+1函数
f=lambda x:x+1

max函数(条件语句的写法如下)
f_max=lambda x,y:x if x>y else y

上述定义的函数与用def定义的函数没有区别,而且左边的f=在某些情况下并不是必要的。
filter,map,reduce
filter函数接受两个参数,第一个是过滤函数,第二个是可遍历的对象,用于选择出所有满足过滤条件的元素,不同版本的filter的返回值稍有区别,我用的是python3.5,filter返回的是经过过滤的可遍历对象。
例:
去除小写字母
s=filter(lambda x:not str(x).islower(),"asdasfAsfBsdfC")
for ch in s:
print(ch)

map函数接受的参数类型与filter类似,它用于把函数作用于可遍历对象的每一个元素。类似于数学中映射的概念。
例:
求y=2x+1(偷偷用了一下range函数生成定义域)
s=map(lambda x:2*x+1,range(6))
for x in s:
print(x)

reduce函数对每个元素作累计操作,它接受的第一个参数必须是有两个参数的函数。
例:
求和
from functools import reduce
s=reduce(lambda x,y:x+y,range(1,6))
print(s)

求乘积(第三个可选参数表示累计变量的初值)
from functools import reduce
s=reduce(lambda x,y:x*y,range(1,6),1)
print(s)

柯里化(curry)函数
如果一个函数需要2个参数,而你只传入一个参数,那么你就可以得到一个柯里化的函数,这是函数式编程语言的重要特性之一,遗憾的是,python并不能在语法层面支持柯里化调用,但它在库中提供了接口。
例:
*3函数
f_mul=lambda x,y:x*y
from functools import partial
mul3=partial(f_mul,3)
print(mul3(1))
print(mul3(6))

打包与解包
有点类似于函数式中的模式匹配,略牵强。
t=(1,2,3)
x,y,z=t

列表生成式
这个也有点牵强,不知道严格意义上讲属不属于函数式风格。
例:生成奇数序列
l=[2*x+1 for x in range(10)]
for i in l:
print(i)

最后来一个彩蛋(以前某答主提到的用调分函数来美颜的算法,忘了出处了,侵删)
from PIL import Image
from math import sqrt

im = Image.open("a.jpg")
ret= im.convert(mode="RGB")
ret = ret.point(lambda x:sqrt(x)*sqrt(255))
ret.save("b.jpg")

查看完整回答
反对 回复 2019-05-27
?
holdtom

TA贡献1805条经验 获得超10个赞

with的用法:

12345678class A:      def __enter__(self):          print 'in enter'      def __exit__(self, e_t, e_v, t_b):          print 'in exit'   with A() as a:      print 'in with'

运行输出:

in enter  

in with  

in exit


也就是说在print 'in with'前自动执行了A()构造的实例的__enter__方法

with块中的程序执行完后,自动执行了A()构造的实例的__exit__方法

这里as a可以省略,因为with块中没有用到a


with app.test_request_context():
   print(url_for('index'))

直接翻译的话就是

context = app.test_request_context()

context.__enter__()

print(url_for('index'))

context.__exit__(参数1,参数2,参数3)

这里可以理解为 为print(url_for('index'))创造一个环境,执行完后清理环境


查看完整回答
反对 回复 2019-05-27
  • 4 回答
  • 0 关注
  • 1193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信