python是一门有趣的语言,有些特性在其它语言基本没有。比如代码格式会影响到代码,成员变量的权限是根据名称来决定,类型是全小写等。
但又有很多内容与其它语言相似。比如Generator、async/await,和JS里的相应概念很是相似,类的动态性也不少与js差不多。python类的一些高级特性,也有一些能在OC里找到影子。
python有些写法感觉会比较繁琐,如 &&,明明两个字符就能表示的,但python非要用and
这样的单词。
但python又有些写法表达力很强,如lst[1:3],即可取出子列表,以及列表生成式的表达能力,与haskell里的List Comprehension差不多了。
下面就列出python里一些有趣的点
极强表达力的列表生成式
1 | r = [x*x for x in range(1, 11)] |
在Haskell中称为List comprehension的,写法与其类似:
1 | [x*x | x <- [1..10]] |
类型是小写的
1 | # str即是表示字符串类型 |
参数类型是可选的,一般不需要加
变量不需要指定类型,而且在运行时可以修改类型
1 | v = 1 |
与、或操作符,是用and、or来表示的
1 | b1 = True |
列表可以从后面来访问
1 | lst = [1, 2, 3] |
lst[0:2], 这样来写就可以取出[1, 2]
可以执行字符串
1 | exec("print('Hello World')") # 输出:Hello World |
类似js中的
eval
支持lambda表达式
1 | lambda r, v : r + v |
元组定义时可以不用括号
1 | tuple = "a", "b", "c", "d" |
元组其实就是不可变的列表
简单的交换变量的方式
1 | x, y = y, x |
类似swift的写法,本质都是利用元组来交换:
1 | (x, y) = (y, x) |
for-else结构
1 | lst = [1, 3, 5, 7, 9, 13, 19] |
类的方法,定义时需要显示指定self
1 | class Student(object): |
在其它语言里面基本都是编译器自动帮指定,不需要显示的写出来的。
成员变量要在__init__里面指定,在方法外定义的是类属性
1 | class Student(object): |
私有变量通过名字来限定
通过在名字前加双下划线,来表示是私有变量。
1 | class Student(object): |
类可以动态的增、删成员变量
1 | class Student(object): |
js也有这个能力
调用不存在的属性,可以被开发者接管
1 | class Student(object): |
跟OC的转发找不到的方法非常像。包括
__str__
方法,也非常类似OC中的description
,来实现自定义打印内容
可以通过代码来设置断点
1 | pdb.set_trace() |
类似js的
debugger
语句
参考资料