Python3和Java的区别
注释 多行注释可以用多个 # 号,还有 ''' 和 """。代码块表示 使用缩进来表示代码块,不需要使用大括号 {} 。多行语句 如果语句很长,我们可以使用反斜杠(\)来实现多行语句。数字类型 有四种类型:整数、布尔型、浮点数和复数。字符串引号 单引号和双引号使用意义完全相同。使用三引号('''或""")可以指定一个多行字符串。字符串相关 允许r''表示内部字符不转义。允许用'''...'''表示多行内容。字符串索引 有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。截取的语法格式如下:变量[头下标:尾下标]。同一行显示多条语句 可以在同一行中使用多条语句,语句之间使用分号(;)分割Print 输出 默认输出是换行的,如果要实现不换行需要在变量末尾加上 ,end=""变量不需要声明 Python是动态语言。除法 除法/ 。只取结果的整数部分的除法//。只取结果的余数%。可变与不可变 不可变数据(四个):Number(数字)、String(字符串)、Tuple(元组)、Sets(集合);可变数据(两个):List(列表)、Dict(字典,相当于其他语言的map)。数字 支持 int、float、bool、complex(复数)。对整数、浮点数大小没有限制。列表 列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。条件判断 Python用elif 代替else if。迭代 Python用for x in List 。 Java则通过下标 for (int i : List)。数据类型转换 Python比如 int(12.34)、 float('12.34')、 str(1.23)、 bool(1)、 bool('') 。函数参数 Python支持默认参数(=)、可变参数(*)、关键字参数(**)、命名关键字参数(*,)。Java只支持方法重载。切片 Python的list, tuple, str支持切片,从索引1开始,取出2个元素 L[1:3]。前10个数,每两个取一个 L[:10:2]。同样是截取,Jave则使用字符串方法substring。列表生成 Python支持列表生成式、生成器。其他
IO字符串在内存以Unicode表示。如果要在网络传输或保存在磁盘,str要变为字节为单位的bytes。英文字符可以用b'前缀转成bytes。中文字符串要用UTF-8将其编码成bytes,比如'中文'.encode('utf-8')。
反过来,如果从网络或磁盘上读取了字节流,该数据就是bytes。要将bytes变为str,比如b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
格式化用%实现格式化,比如 'growth rate: %d %%' % 7 ; 'Hi, %s, you have $%d.' % ('Michael', 1000000)。
常用占位符有 %d 整数; %f 浮点数; %s 字符串。%% 表示一个%。
列表操作 -- help('list')list,可变的有序列表,比如 classmates = ['Michael', 'Bob', 'Tracy']。list常用方法,比如len, append, insert, pop
tuple,不可变的有序列表,比如 t = (1, 2)。只有1个元素的tuple定义时必须加一个逗号,,来消除歧义。
dict,使用键-值(key-value)存储,比如d = {'Michael': 95, 'Bob': 75, 'Tracy': 85},key必须是不可变对象。dict常用方法,比如get,pop。这样赋值 d['Michael'] = 27。
set,一组无序和无重复元素的集合。和dict的唯一区别就是没有value。要提供list来创建 s = set([1, 2, 3])。常用方法,比如add, remove。还可以做数学意义上的集合操作,比如&(交集), |(并集)。
不可变对象对于可变对象,比如list,对list进行操作,list内部的内容是会变化的。比如:>>> a = ['c', 'b', 'a'] >>> a.sort()
对于不可变对象,比如str,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回。
>>> a = 'abc' >>> a.replace('a', 'A')
函数内置函数 Built-in Functions — Python 3.6.5 documentation定义函数要使用def语句。用from abstest import my_abs来导入my_abs()函数。参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数。默认参数一定要用不可变对象,如果是可变对象,如果是可变对象,程序运行时会有逻辑错误。*args是可变参数,args接收的是一个tuple;**kw是关键字参数,kw接收的是一个dict。**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict。对于任意函数,都可以通过类似func(*args, **kw)的形式调用它。
迭代Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。由于字符串也是可迭代对象,因此,也可以作用于for循环 for ch in 'ABC':
如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断
>>> isinstance(123, Iterable) # 整数是否可迭代 False
列表生成式范围 [x * x for x in range(1, 11)] [x * x for x in range(1, 11) if x % 2 == 0]
字符 [m + n for m in 'ABC' for n in 'XYZ'] [s.lower() for s in L]
字典 [k + '=' + v for k, v in d.items()]
生成器创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。 g = (x * x for x in range(10))
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。
迭代器可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。把list、dict、str等Iterable变成Iterator可以使用iter()函数。Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。
高阶函数变量可以指向函数 f = abs 函数名也是变量 abs = 10
传入函数 def add(x, y, f): return f(x) + f(y) 调用 add(-5, 6, abs),结果会是11
list(map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])) 将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) 关键在于正确实现一个“筛选”函数。
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
返回函数、匿名函数、装饰器、偏函数略
Public 和Private 函数外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。
正常的函数和变量名是公开的(public),可以被直接引用。
类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用。
如果以__开头,变成了一个私有变量(private),只有内部可以访问,外部不能访问。
数据封装、继承、多态class Dog(Animal):......动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。
获取对象信息type()判断基本类型、一个指向函数或者类的变量。
isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。
dir()获得一个对象的所有属性和方法,它返回一个包含所有属性和方法的list
配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态。
类属性动态绑定:s.name = 'Michael' s.set_age = MethodType(set_age, s)
允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性。(但对子类无效)如果子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。
@property的使用。能取代getter、setter,实现查询、赋值功能,并让外部友好地访问。
多重继承通过多重继承,一个子类就可以同时获得多个父类的所有功能。MixIn
定制类__str__ __iter__ __getitem__ __getattr__ __call__ 枚举Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。
创建类:type()函数、metaclassHello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class
